Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
     Licensed to Plutext Pty Ltd under one or more contributor license agreements.  
     
   *  This file is part of docx4j.
  
      docx4j is licensed under the Apache License, Version 2.0 (the "License"); 
      you may not use this file except in compliance with the License. 
  
      You may obtain a copy of the License at 
 
         http://www.apache.org/licenses/LICENSE-2.0 
 
     Unless required by applicable law or agreed to in writing, software 
     distributed under the License is distributed on an "AS IS" BASIS, 
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
     See the License for the specific language governing permissions and 
     limitations under the License.
 
  */
 package org.docx4j.convert.out.fo;
 
 import java.util.List;
 
A description of how this stuff works can be found at /docs/headers_footers.docx

Author(s):
jharrop
 
 public class LayoutMasterSetBuilder {
 
 	protected static Logger log = LoggerFactory.getLogger(LayoutMasterSetBuilder.class);
 	
 		
 
 		
 		org.w3c.dom.Document document = XmlUtils.marshaltoW3CDomDocument(lms, Context.getXslFoContext() );
 		DocumentFragment docfrag = document.createDocumentFragment();
 		docfrag.appendChild(document.getDocumentElement());
 		return docfrag;		
 	}

    
For XSLFOExporterNonXSLT

Since:
3.0
 	
 	public static void appendLayoutMasterSetFragment(AbstractWmlConversionContext contextNode foRoot) {
 
 		
 		org.w3c.dom.Document document = XmlUtils.marshaltoW3CDomDocument(lms, Context.getXslFoContext() );
 		XmlUtils.treeCopy(document.getDocumentElement(), foRoot);
 	}
 	
 		
 		List<ConversionSectionWrappersections = context.getSections().getList();
 		ConversionSectionWrapper section = null;
 		
 		for(int i=0; i<sections.size(); i++) {
 			
 			section = sections.get(i);
 			String sectionName = "s" + Integer.toString(i + 1);
 			
 			// FIRST, create simple-page-masters
 			// has first header or footer?
 			if (hf.getFirstHeader()!=null || hf.getFirstFooter()!=null) {
 				// per spec, HeaderFooterPolicy checks the titlePg elememt
 				
					createSimplePageMaster(sectionName + "-firstpage"
							section.getPageDimensions(), 
							"firstpage",
						(hf.getFirstHeader()!=null),
						(hf.getFirstFooter()!=null) ));
			}
			// has even or odd header or footer?
    		/*
    		 *       <w:headerReference w:type="even" r:id="rId12"/>
    		 *       <w:headerReference w:type="default" r:id="rId13"/>
    		 *       
    		 *       the default one is treated as odd.
    		 */
			if (hf.getEvenHeader()!=null || hf.getEvenFooter()!=null) {
					createSimplePageMaster(sectionName + "-evenpage",  
							section.getPageDimensions(), 
							"evenpage",
						(hf.getEvenHeader()!=null),
						(hf.getEvenFooter()!=null) ));
				// the xslt outputs a "-default" page as the odd-page
			}
			if (hf.getDefaultHeader()!=null 
					|| hf.getDefaultFooter()!=null) {
					createSimplePageMaster(sectionName + "-default",  
							section.getPageDimensions(), 
							"default",
						(hf.getDefaultHeader()!=null),
						(hf.getDefaultFooter()!=null) ));				
			}
			// simple: no headers and footers - after the first page anyway/
			// We still need this where there is just a first page header/footer,
			// since otherwise there'd be no page sequence for any content 
			// after the first page, and you'd get: 
			//    org.apache.fop.fo.pagination.PageProductionException: 
			//    Subsequences exhausted in page-sequence-master ..., cannot recover.
			//
			// <w:sectPr>
			//   <w:headerReference w:type="first" r:id="rId7"/>
			// </w:sectPr>			
			if (
				(hf.getDefaultHeader() == null) && (hf.getDefaultFooter() == null)) {
						createSimplePageMaster(sectionName + "-simple",  
								section.getPageDimensions(), 
								"simple",
							truetrue));
			}
			// SECOND, create page-sequence-masters
					createPageSequenceMaster(hfsectionName )  );
		}	
		return lms;
	}
			String sectionName ) {
		boolean noHeadersFootersAfterFirstPage = true;
		psm.setMasterName(sectionName);
		// has first header or footer?
		if (hf.getFirstHeader()!=null || hf.getFirstFooter()!=null) {			
			cpmr1.setMasterReference(sectionName+"-firstpage");
		}
		if (hf.getEvenHeader()!=null || hf.getEvenFooter()!=null) {
			cpmr2.setMasterReference(sectionName+"-evenpage");
			//cpmr2.setPagePosition(PagePositionType.FIRST);
			// the xslt outputs a "-default" page as the odd-page
			cpmr3.setMasterReference(sectionName+"-default");
			//cpmr3.setPagePosition(PagePositionType.FIRST);
			noHeadersFootersAfterFirstPage = false;
else if (hf.getDefaultHeader()!=null || hf.getDefaultFooter()!=null) {
			cpmr4.setMasterReference(sectionName+"-default");
			//cpmr4.setPagePosition(PagePositionType.FIRST);
			noHeadersFootersAfterFirstPage = false;
		}
		if (noHeadersFootersAfterFirstPage) {
			cpmr5.setMasterReference(sectionName+"-simple");
			//cpmr5.setPagePosition(PagePositionType.FIRST);
		}
		return psm;
	}
	private static final int HEADER_PADDING_TWIP = 360;
	private static final int FOOTER_PADDING_TWIP = 360;
	private static final int MIN_PAGE_MARGIN = 360;
			String masterNamePageDimensions pageString appendRegionName
			boolean needBeforeboolean needAfter) {
		spm.setMasterName(masterName);
		// dimensions.  
		//   <w:pgSz w:w="12240" w:h="15840"/>
        //   <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/>
		spm.setPageHeight( UnitsOfMeasurement.twipToBest(page.getPgSz().getH().intValue() ));
		spm.setPageWidth(  UnitsOfMeasurement.twipToBest(page.getPgSz().getW().intValue() ));
		spm.setMarginLeft( UnitsOfMeasurement.twipToBest(page.getPgMar().getLeft().intValue() ) );
		spm.setMarginRight( UnitsOfMeasurement.twipToBest(page.getPgMar().getRight().intValue()) );
		/* 
		 * Region before & after live in region body margins:
		 * 
		 * Per http://www.w3.org/TR/xsl/#fo_region-body
		 * 
		 * The body region should be sized and positioned within the fo:simple-page-master 
		 * so that there is room for the areas returned by the flow that is assigned to the 
		 * fo:region-body and for any desired side regions, that is, fo:region-before, 
		 * fo:region-after, fo:region-start and fo:region-end's that are to be placed on the same page. 
		 * 
		 * These side regions are positioned within the content-rectangle of the page-reference-area. 
		 * The margins on the fo:region-body are used to position the region-viewport-area for the 
		 * fo:region-body and to leave space for the other regions that surround the fo:region-body.
		 *                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		 *                    
		 * The spacing between the last four regions and the fo:region-body is determined by subtracting 
		 * the relevant extent trait on the side regions from the trait that corresponds to the "margin-x" 
		 * property on the fo:region-body.
		 */
		rb.setMarginLeft("0mm");
		rb.setMarginRight("0mm");
		if (needBefore) {
			//Header
			rBefore.setRegionName("xsl-region-before-"+appendRegionName);
			spm.setRegionBefore(rBefore);
			// Make margin smaller, because header takes up space it would otherwise occupy			
			int marginTopTwips 
page.getPgMar().getTop().intValue() 
			if (marginTopTwips<marginTopTwips=;				
			spm.setMarginTop( UnitsOfMeasurement.twipToBest(marginTopTwips ) );
			// Size header manually
			rBefore.setExtent( UnitsOfMeasurement.twipToBest(page.getHeaderExtent() ));
			// Leave room for this region in body margin
			rb.setMarginTop(UnitsOfMeasurement.twipToBest(page.getHeaderExtent()+  ));
else {
			// No header
			spm.setMarginTop( UnitsOfMeasurement.twipToBest(page.getPgMar().getTop().intValue() ) );
		}
		if (needAfter) {
			// Footer
			rAfter.setRegionName("xsl-region-after-"+appendRegionName);
			spm.setRegionAfter(rAfter);
			// Make margin smaller, because footer takes up space it would otherwise occupy  
			int marginBottomTwips
			if (marginBottomTwips<marginBottomTwips=;			
			.debug("marginBottomTwips: " + marginBottomTwips );
			spm.setMarginBottom( UnitsOfMeasurement.twipToBest(marginBottomTwips) );
			// Size footer manually
			rAfter.setExtent( UnitsOfMeasurement.twipToBest(page.getFooterExtent() ) );
			// Leave room for this region in body margin
			rb.setMarginBottom(UnitsOfMeasurement.twipToBest(page.getFooterExtent() +  ) );
else {
			// No footer
			spm.setMarginBottom( UnitsOfMeasurement.twipToBest(page.getPgMar().getBottom().intValue()) );
		}
		return spm;
	}
	private static ObjectFactory getFactory() {
		if ( == null = new ObjectFactory();
		return ;
	}
New to GrepCode? Check out our FAQ X