使用docx4j生成指定页码的带水印的空白word文档

使用docx4j生成指定页码的带水印的空白word文档
依赖==========================================


org.docx4j
docx4j
6.0.1


org.docx4j
docx4j-ImportXHTML
6.0.1


org.docx4j
xhtmlrenderer
3.0.0

代码===========================================

package org.example;

import org.docx4j.XmlUtils;
import org.docx4j.jaxb.Context;
import org.docx4j.model.structure.DocumentModel;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.WordprocessingML.;
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
import org.docx4j.relationships.Relationship;
import org.docx4j.wml.
;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;

public class Docx4jTest {

private static final ObjectFactory factory = Context.getWmlObjectFactory();
private WordprocessingMLPackage wordMLPackage;
private MainDocumentPart mainDocumentPart;
private DocumentModel documentModel;

public static void main(String[] args) throws Exception {

    createWaterWord("这是个带水印的空word" , 5);

}

/**
 * 创建一个带水印的空word文件
 *  fileName word文档名,不含后缀
 *  pageNum 新创建的文档的页数
 */
private static void createWaterWord(String fileName , Integer pageNum) throws Exception {
    Docx4jTest docx4jTest = new Docx4jTest();
    WordprocessingMLPackage wordprocessingMLPackage = WordprocessingMLPackage.createPackage();
    //.createPackage(PageSizePaper.valueOf("A4"), false); // A4纸,//横版:true

    docx4jTest.wordMLPackage = wordprocessingMLPackage;
    docx4jTest.mainDocumentPart = wordprocessingMLPackage.getMainDocumentPart();

    docx4jTest.documentModel = wordprocessingMLPackage.getDocumentModel();

    SectPr sectPr = docx4jTest.wordMLPackage.getDocumentModel().getSections().get(docx4jTest.wordMLPackage.getDocumentModel().getSections().size() - 1).getSectPr();
    if (sectPr == null) {
        sectPr = factory.createSectPr();
        docx4jTest.mainDocumentPart.addObject(sectPr);
        docx4jTest.documentModel.getSections().get(docx4jTest.documentModel.getSections().size() - 1).setSectPr(sectPr);
    }

    //水印文字内容
    String watermark = "这里是水印ssssssssss";

    String hdrFtrRef = "first";
    if(hdrFtrRef.equals("first")){
        //给首页加水印
        docx4jTest.doWaterPage(sectPr, "first", watermark);
    }
    //非首页
    docx4jTest.doWaterPage(sectPr, "default", watermark);

    for (int i = pageNum; i >1 ; i--) {
        docx4jTest.mainDocumentPart.addObject(makePageBr());    //新增页面
    }

    docx4jTest.wordMLPackage.save(new java.io.File(fileName+".docx"));
}

//加水印
private void doWaterPage(SectPr sectPr, String hdrFtrRef, String watermark) throws Exception {
    App docx4jTest = new App();
    HeaderPart headerPart = new HeaderPart(new PartName("/word/heade-" + hdrFtrRef + ".xml"));
    Relationship relationship = docx4jTest.mainDocumentPart.addTargetPart(headerPart);
    docx4jTest.setWatermarkHdr(headerPart, watermark);
    HeaderReference headerReference = factory.createHeaderReference();
    headerReference.setType(HdrFtrRef.fromValue("default"));
    headerReference.setId(relationship.getId());
    sectPr.getEGHdrFtrReferences().add(headerReference);
    sectPr.setTitlePg(new BooleanDefaultTrue());
}

//设置水印图片
private void setWatermarkHdr(HeaderPart headerPart, String text) throws Exception {

    ImagePngPart imagePart = new ImagePngPart(new PartName("/media/background.png"));
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ImageIO.write(createWaterMark(text), "png", out);
    byte[] imagebytes = out.toByteArray();
    imagePart.setBinaryData(imagebytes);
    Relationship rel = headerPart.addTargetPart(imagePart, RelationshipsPart.AddPartBehaviour.REUSE_EXISTING);

    String openXML = "<w:hdr mc:Ignorable=\"w14 wp14\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">"
            + "<w:p>"
            + "<w:pPr>"
            + "<w:pStyle w:val=\"Header\"/>"
            + "</w:pPr>"
            + "<w:r>"
            + "<w:rPr>"
            + "<w:noProof/>"
            + "</w:rPr>"
            + "<w:pict>"
            + "<v:shapetype coordsize=\"21600,21600\" filled=\"f\" id=\"_x0000_t75\" o:preferrelative=\"t\" o:spt=\"75\" path=\"m@4@5l@4@11@9@11@9@5xe\" stroked=\"f\">"
            + "<v:stroke joinstyle=\"miter\"/>"
            + "<v:formulas>"
            + "<v:f eqn=\"if lineDrawn pixelLineWidth 0\"/>"
            + "<v:f eqn=\"sum @0 1 0\"/>"
            + "<v:f eqn=\"sum 0 0 @1\"/>"
            + "<v:f eqn=\"prod @2 1 2\"/>"
            + "<v:f eqn=\"prod @3 21600 pixelWidth\"/>"
            + "<v:f eqn=\"prod @3 21600 pixelHeight\"/>"
            + "<v:f eqn=\"sum @0 0 1\"/>"
            + "<v:f eqn=\"prod @6 1 2\"/>"
            + "<v:f eqn=\"prod @7 21600 pixelWidth\"/>"
            + "<v:f eqn=\"sum @8 21600 0\"/>"
            + "<v:f eqn=\"prod @7 21600 pixelHeight\"/>"
            + "<v:f eqn=\"sum @10 21600 0\"/>"
            + "</v:formulas>"
            + "<v:path gradientshapeok=\"t\" o:connecttype=\"rect\" o:extrusionok=\"f\"/>"
            + "<o:lock aspectratio=\"t\" v:ext=\"edit\"/>"
            + "</v:shapetype>"
            + "<v:shape id=\"WordPictureWatermark835936646\" o:allowincell=\"f\" o:spid=\"_x0000_s2050\" style=\"position:absolute;margin-left:0;margin-top:0;width:467.95pt;height:615.75pt;z-index:-251657216;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin\" type=\"#_x0000_t75\">"
            + "<v:imagedata blacklevel=\"22938f\" gain=\"19661f\" o:title=\"docx4j-logo\" r:id=\"" + rel.getId() + "\"/>"
            + "</v:shape>"
            + "</w:pict>"
            + "</w:r>"
            + "</w:p>"
            + "</w:hdr>";

    Hdr hdr = (Hdr) XmlUtils.unmarshalString(openXML);
    headerPart.setJaxbElement(hdr);
}

//设置水印字体
private static BufferedImage createWaterMark(String content) {
    Integer width = 1000;
    Integer height = 1360;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象
    String fontType = "宋体";
    Integer fontStyle = Font.PLAIN;
    Integer fontSize = 30;
    Font font = new Font(fontType, fontStyle, fontSize);
    Graphics2D g2d = image.createGraphics(); // 获取Graphics2d对象
    image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
    g2d.dispose();
    for (int i = 1; i <= 20; i += 2) {
        for (int j = 1; j <= 10; j += 2) {
            int px = j * 100;
            int py = i * 100;
            g2d = image.createGraphics();
            g2d.setColor(java.awt.Color.black);
            g2d.setStroke(new BasicStroke(1)); // 设置字体
            g2d.setFont(font); // 设置字体类型 加粗 大小
            g2d.translate(px, py);// 设置原点
            g2d.rotate(Math.toRadians(-30));// 设置倾斜度
            FontRenderContext context = g2d.getFontRenderContext();
            Rectangle2D bounds = font.getStringBounds(content, context);
            g2d.drawString(content, 0, 0);
            g2d.dispose();
        }
    }
    return image;
}

private static P makePageBr() throws Exception {
    P p = factory.createP();
    R r = factory.createR();
    Br br = factory.createBr();
    br.setType(STBrType.PAGE);
    r.getContent().add(br);
    p.getContent().add(r);
    return p;
}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Docx4j将HTML转换为Word文档。以下是一个简单的示例代码: ``` import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.docx4j.Docx4J; import org.docx4j.convert.in.xhtml.XHTMLImporterImpl; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPart; import org.docx4j.wml.Body; public class HtmlToDocx { public static void main(String[] args) throws Exception { // 读取HTML文件 InputStream in = new FileInputStream(new File("input.html")); // 创建WordprocessingMLPackage对象 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); // 获取文档的主体 Body body = wordMLPackage.getMainDocumentPart().getJaxbElement().getBody(); // 使用XHTMLImporter将HTML转换为Word内容 XHTMLImporterImpl xhtmlImporter = new XHTMLImporterImpl(wordMLPackage); xhtmlImporter.setHyperlinkStyle("Hyperlink"); xhtmlImporter.setPicContext(null); xhtmlImporter.setRunFormatting(null); xhtmlImporter.setTableFormatting(null); xhtmlImporter.setConditionalFormatting(null); xhtmlImporter.importDocument(new File("input.html"), "UTF-8", body); // 将WordprocessingMLPackage保存为DOCX文件 File outputFile = new File("output.docx"); OutputStream out = new FileOutputStream(outputFile); Docx4J.save(wordMLPackage, out); System.out.println("文件已生成:" + outputFile.getAbsolutePath()); } } ``` 在本示例中,我们使用XHTMLImporterImpl将HTML文件input.html转换为Word内容,并将其保存在output.docx文件中。可以根据需要更改导入器的选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值