private void setHorizontalAlignment(P paragraph, JcEnumeration hAlign) { if (hAlign != null) { PPr pprop = paragraph.getPPr(); if (pprop == null) { pprop = new PPr(); paragraph.setPPr(pprop); } Jc align = new Jc(); align.setVal(hAlign); pprop.setJc(align); paragraph.setPPr(pprop); } }
/** * Creates document footer including page number * * @param doc WordprocessingMLPackage for the document. * @throws InvalidFormatException */ private void createFooter(WordprocessingMLPackage doc) throws InvalidFormatException { MainDocumentPart content = doc.getMainDocumentPart(); // Create footer FooterPart footer = new FooterPart(); Ftr ftr = objectFactory.createFtr(); P footerParagraph = objectFactory.createP(); setStyle(footerParagraph, "footer"); PPr parProps = objectFactory.createPPr(); Jc al = objectFactory.createJc(); al.setVal(JcEnumeration.RIGHT); parProps.setJc(al); footerParagraph.setPPr(parProps); // Add field start R run = objectFactory.createR(); FldChar fldChar = objectFactory.createFldChar(); fldChar.setFldCharType(STFldCharType.BEGIN); run.getContent().add(fldChar); footerParagraph.getContent().add(run); // Add pageNumber field run = objectFactory.createR(); Text txt = objectFactory.createText(); txt.setSpace("preserve"); txt.setValue(" PAGE \\* MERGEFORMAT "); run.getContent().add(objectFactory.createRInstrText(txt)); footerParagraph.getContent().add(run); // Add field end run = objectFactory.createR(); fldChar = objectFactory.createFldChar(); fldChar.setFldCharType(STFldCharType.END); run.getContent().add(fldChar); footerParagraph.getContent().add(run); ftr.getContent().add(footerParagraph); footer.setJaxbElement(ftr); Relationship rel = content.addTargetPart(footer); // Relate footer to document List<SectionWrapper> sections = doc.getDocumentModel().getSections(); SectPr sectPr = sections.get(sections.size() - 1).getSectPr(); if (null == sectPr) { sectPr = objectFactory.createSectPr(); content.addObject(sectPr); sections.get(sections.size() - 1).setSectPr(sectPr); } FooterReference footerReference = objectFactory.createFooterReference(); footerReference.setId(rel.getId()); footerReference.setType(HdrFtrRef.DEFAULT); sectPr.getEGHdrFtrReferences().add(footerReference); }
/** * Fija la alineación de un párrafo * * @param paragraph Párrafo a alinear * @param alignment Valor de alineamiento */ private void alignParagraph(P paragraph, JcEnumeration alignment) { PPr parProps = paragraph.getPPr(); if (null == parProps) parProps = objectFactory.createPPr(); Jc al = objectFactory.createJc(); al.setVal(alignment); parProps.setJc(al); paragraph.setPPr(parProps); }
// create paraghraph with no space after private P createParagraph() { P paragraph = factory.createP(); PPr pPr = factory.createPPr(); Spacing spacing = new Spacing(); spacing.setAfter(BigInteger.ZERO); pPr.setSpacing(spacing); paragraph.setPPr(pPr); return paragraph; }
/** * Create a paragraph containing the string simpleText, styled using the specified style (up to * user to ensure it is a paragraph style) without adding it to the document. * * @param styleId * @param text * @return */ public org.docx4j.wml.P createStyledParagraphOfText(String styleId, String text) { org.docx4j.wml.P p = createParagraphOfText(text); StyleDefinitionsPart styleDefinitionsPart = this.getStyleDefinitionsPart(); if (getPropertyResolver().activateStyle(styleId)) { // Style is available org.docx4j.wml.ObjectFactory factory = Context.getWmlObjectFactory(); org.docx4j.wml.PPr pPr = factory.createPPr(); p.setPPr(pPr); org.docx4j.wml.PPrBase.PStyle pStyle = factory.createPPrBasePStyle(); pPr.setPStyle(pStyle); pStyle.setVal(styleId); } return p; }
private P createPageNumParagraph() { CTSimpleField pgnum = factory.createCTSimpleField(); pgnum.setInstr(" PAGE \\* MERGEFORMAT "); RPr RPr = factory.createRPr(); RPr.setNoProof(new BooleanDefaultTrue()); PPr ppr = factory.createPPr(); Jc jc = factory.createJc(); jc.setVal(JcEnumeration.CENTER); ppr.setJc(jc); PPrBase.Spacing pprbase = factory.createPPrBaseSpacing(); pprbase.setBefore(BigInteger.valueOf(240)); pprbase.setAfter(BigInteger.valueOf(0)); ppr.setSpacing(pprbase); R run = factory.createR(); run.getContent().add(RPr); pgnum.getContent().add(run); JAXBElement<CTSimpleField> fldSimple = factory.createPFldSimple(pgnum); P para = createParagraph(); para.getContent().add(fldSimple); para.setPPr(ppr); return para; }
private WordprocessingMLPackage fetchComponents( WordprocessingMLPackage srcPackage, ContentAccessor contentAccessor) throws Docx4JException { // convert components to altChunk Map<Integer, CTAltChunk> replacements = new HashMap<Integer, CTAltChunk>(); Integer index = 0; justGotAComponent = false; LinkedList<Integer> continuousBeforeIndex = new LinkedList<Integer>(); List<Boolean> continuousBefore = new ArrayList<Boolean>(); List<Boolean> continuousAfter = new ArrayList<Boolean>(); for (Object block : contentAccessor.getContent()) { // Object ublock = XmlUtils.unwrap(block); if (block instanceof org.docx4j.wml.SdtBlock) { org.docx4j.wml.SdtBlock sdt = (org.docx4j.wml.SdtBlock) block; Tag tag = getSdtPr(sdt).getTag(); if (tag == null) { List<Object> newContent = new ArrayList<Object>(); newContent.add(sdt); continue; } log.info(tag.getVal()); HashMap<String, String> map = QueryString.parseQueryString(tag.getVal(), true); String componentId = map.get(BINDING_ROLE_COMPONENT); if (componentId == null) continue; // Convert the sdt to a w:altChunk // .. get the IRI String iri = ComponentsPart.getComponentById(components, componentId).getIri(); log.debug("Fetching " + iri); if (docxFetcher == null) { log.error("You need a docxFetcher (and the MergeDocx extension) to fetch components"); return srcPackage; } // .. create the part AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart( getNewPartName( "/chunk", ".docx", srcPackage.getMainDocumentPart().getRelationshipsPart())); afiPart.setBinaryData(docxFetcher.getDocxFromIRI(iri)); afiPart.setContentType( new ContentType( "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml")); // docx Relationship altChunkRel = srcPackage.getMainDocumentPart().addTargetPart(afiPart); CTAltChunk ac = Context.getWmlObjectFactory().createCTAltChunk(); ac.setId(altChunkRel.getId()); replacements.put(index, ac); /* * 2011 12 11 TODO. Rethink support for * od:continuousBefore and od:continuousAfter. */ // This is handled in this class if (map.get(BINDING_ROLE_COMPONENT_BEFORE) != null && map.get(BINDING_ROLE_COMPONENT_BEFORE).equals("true")) { continuousBefore.add(Boolean.TRUE); continuousBeforeIndex.addFirst(index); log.info("ctsBefore index: " + index); } else { continuousBefore.add(Boolean.FALSE); continuousBeforeIndex.addFirst(index); } // The following is handled in ProcessAltChunk if (map.get(BINDING_ROLE_COMPONENT_AFTER) != null && map.get(BINDING_ROLE_COMPONENT_AFTER).equals("true")) { continuousAfter.add(Boolean.TRUE); } else { continuousAfter.add(Boolean.TRUE); } justGotAComponent = true; } index++; } if (!justGotAComponent) { return srcPackage; } // Now replace in list for (Integer key : replacements.keySet()) { contentAccessor.getContent().set(key, replacements.get(key)); } // Go through docx in reverse order List<Object> bodyChildren = contentAccessor.getContent(); int i = 0; for (Integer indexIntoBody : continuousBeforeIndex) { if (continuousBefore.get(i)) { // Element before the w:altChunk if (indexIntoBody == 0) { // // Insert a sectPr right at the beginning of the docx? // // TODO check this isn't necessary // SectPr newSectPr = // Context.getWmlObjectFactory().createSectPr(); // SectPr.Type type = // Context.getWmlObjectFactory().createSectPrType(); // type.setVal("continuous"); // newSectPr.setType( type ); // // bodyChildren.add(0, newSectPr); } else { Object block = bodyChildren.get(indexIntoBody.intValue() - 1); if (block instanceof P && ((P) block).getPPr() != null && ((P) block).getPPr().getSectPr() != null) { makeContinuous(((P) block).getPPr().getSectPr()); } else if (block instanceof P) { // More likely PPr ppr = ((P) block).getPPr(); if (ppr == null) { ppr = Context.getWmlObjectFactory().createPPr(); ((P) block).setPPr(ppr); } SectPr newSectPr = Context.getWmlObjectFactory().createSectPr(); SectPr.Type type = Context.getWmlObjectFactory().createSectPrType(); type.setVal("continuous"); newSectPr.setType(type); ppr.setSectPr(newSectPr); } else { // Equally likely - its a table or something, so add a p P newP = Context.getWmlObjectFactory().createP(); PPr ppr = Context.getWmlObjectFactory().createPPr(); newP.setPPr(ppr); SectPr newSectPr = Context.getWmlObjectFactory().createSectPr(); SectPr.Type type = Context.getWmlObjectFactory().createSectPrType(); type.setVal("continuous"); newSectPr.setType(type); ppr.setSectPr(newSectPr); bodyChildren.add(indexIntoBody.intValue(), newP); // add // before // altChunk } } } // else nothing specified, so go with normal MergeDocx behaviour i++; } // process altChunk try { // Use reflection, so docx4j can be built // by users who don't have the MergeDocx utility Class<?> documentBuilder = Class.forName("com.plutext.merge.ProcessAltChunk"); // Method method = documentBuilder.getMethod("merge", // wmlPkgList.getClass()); Method[] methods = documentBuilder.getMethods(); Method processMethod = null; for (int j = 0; j < methods.length; j++) { log.debug(methods[j].getName()); if (methods[j].getName().equals("process")) { processMethod = methods[j]; } } if (processMethod == null) throw new NoSuchMethodException(); return (WordprocessingMLPackage) processMethod.invoke(null, srcPackage); } catch (ClassNotFoundException e) { extensionMissing(e); justGotAComponent = false; return srcPackage; // throw new Docx4JException("Problem processing w:altChunk", e); } catch (NoSuchMethodException e) { // Degrade gracefully extensionMissing(e); justGotAComponent = false; return srcPackage; // throw new Docx4JException("Problem processing w:altChunk", e); } catch (Exception e) { throw new Docx4JException("Problem processing w:altChunk", e); } }