package a.b.c.utils.word.docx4j.util; import java.util.List; import javax.xml.bind.JAXBException; import org.docx4j.XmlUtils; import org.docx4j.jaxb.Context; import org.docx4j.model.structure.SectionWrapper; import org.docx4j.openpackaging.exceptions.InvalidFormatException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart; import org.docx4j.relationships.Relationship; import org.docx4j.wml.HdrFtrRef; import org.docx4j.wml.HeaderReference; import org.docx4j.wml.ObjectFactory; import org.docx4j.wml.P; import org.docx4j.wml.SectPr; public class WatermarkUtils { private static ObjectFactory factory = Context.getWmlObjectFactory(); public static void addWaterMarkOnDocument(WordprocessingMLPackage wmlPackage, String backgroundTxt) throws InvalidFormatException, JAXBException { Relationship relationship = createHeaderPart(wmlPackage, backgroundTxt); createHeaderReference(wmlPackage, relationship); } private static Relationship createHeaderPart(WordprocessingMLPackage wordprocessingMLPackage, String backgroundTxt) throws JAXBException, InvalidFormatException { HeaderPart headerPart = wordprocessingMLPackage.getHeaderFooterPolicy().getDefaultHeader(); headerPart.getContent().add(getPForHdr(backgroundTxt)); return headerPart.getSourceRelationship(); } private static void createHeaderReference(WordprocessingMLPackage wordprocessingMLPackage, Relationship relationship) throws InvalidFormatException { List sections = wordprocessingMLPackage.getDocumentModel().getSections(); int sectionPos = sections.size() - 1; SectPr sectPr = sections.get(sectionPos).getSectPr(); if (sectPr == null) { sectPr = factory.createSectPr(); wordprocessingMLPackage.getMainDocumentPart().addObject(sectPr); sections.get(sectionPos).setSectPr(sectPr); } HeaderReference headerReference = factory.createHeaderReference(); headerReference.setId(relationship.getId()); headerReference.setType(HdrFtrRef.FIRST); headerReference.setParent(sectPr); for (org.docx4j.wml.CTRel rel : sectPr.getEGHdrFtrReferences()) { if (rel instanceof HeaderReference) { HeaderReference headRef = (HeaderReference) rel; if (headRef.getType() == HdrFtrRef.FIRST) { headRef.setType(HdrFtrRef.DEFAULT); } } } sectPr.getEGHdrFtrReferences().add(headerReference); } private static P getPForHdr(String backgroundTxt) throws JAXBException { String joinToken = " "; int quantifier = 6; String txtToken = ""; for (int i = 0; i < quantifier; i++) { txtToken += backgroundTxt + joinToken; } txtToken = txtToken.substring(0, txtToken.length() - joinToken.length()); String openXML = "" + "" + "" +"" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" +"" + "" + "" + "" + "" +"" + "" +"" + "" + "" + "" + "" + "" +"" +"" +"" +""; return (P)XmlUtils.unmarshalString(openXML); } }