使用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纸,//横版:truedocx4jTest.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;
}

}

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

  1. 简单几行代码,教你在Aspose.words中使用 Java 将水印添加到 Word 文档

    Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.此 ...

  2. Word控件Spire.Doc 【页面背景】教程(8) ;在 C# 中将文本水印和图像水印添加到 Word 文档

    文字水印和图片水印是Word文档中的两种水印.文本水印总是显示一些与单词上下文相关的附加信息.而图像水印用于使Word文档更具吸引力.本节将演示如何使用 Spire.Doc 在 C# 中为 Word ...

  3. C#整合layui实现导出带多张图片的word文档

    最近研究了一下如何实现利用C# webapi方式导出word文档,且文档中包含多张图片,现在给出实现过程. 准备阶段: 开发工具vs2017,在项目引用那里右键点击管理NuGet程序包,查询找到wor ...

  4. java生成图章到word_JAVA不使用POI给Word文档添加水印

    程序员在开发项目时,经常需要给一些图片.文件添加水印,但往往代码编写复杂,只能是先将文件上传再调用Graphics类才能实现这一功能.但是最无奈的是这个类只能给图片添加水印,而无法通过程序给Word文 ...

  5. 【PHPWord】创建带样式表格的Word文档

    require_once 'PHPWord.php';$PHPWord = new PHPWord();$section = $PHPWord->createSection();//定义样式数组 ...

  6. python批量提取word指定内容_使用python批量读取word文档并整理关键信息到excel表格的实例...

    目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下 ...

  7. 去除带下划线的word文档答案

    Python爬虫项目 去除word文档答案 本程序可以去除下划线部分的docx,和doc格式文件的习题答案. 主要使用的库 docx (用于操作word文档) win32com (用于将doc格式的文 ...

  8. php表格列表美化,【PHPWord】创建带样式表格的Word文档

    require_once 'PHPWord.php'; $PHPWord = new PHPWord(); $section = $PHPWord->createSection(); //定义样 ...

  9. java导出html word文档_java生成带html样式的word文件

    最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是使用Jacob或POI等组件直接生成Word,但是都无法将富文本编辑器处理过的文字保留样式并保存为Word, ...

最新文章

  1. python中的点表示什么_Python里面这些点,新手看完之后完全不知道这些点
  2. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示均值、标准偏差)实战
  3. python【蓝桥杯vip练习题库】BASIC-17矩阵乘法(枚举)
  4. cocos2d-x3.0 实现HTTP请求GET、POST
  5. iPhone应用程序编程指南(窗口和视图)
  6. vue-wechat-title
  7. 前端学习(542):node得环境搭建
  8. 2020云计算,是四强争霸还是赢家通吃?
  9. 5 种编程语言可能注定失败!
  10. 相对位置的渐变 html,沿HTML5画布路径的连续渐变
  11. SQLServer2008数据库还原失败 恢复失败
  12. 除去工作赚到第一桶金10W+,我都做了哪些事儿?
  13. org.hibernate.ex ception.DataException: could not insert报错
  14. 深入理解计算机系统(v3) 第三章、程序的机器级表示(Linux)
  15. Leetcode-数据结构-1.两数之和
  16. Arduino连接LCD1602显示屏
  17. [vue] Vuex中四个map方法的使用 mapState mapGetters mapActions mapMutations
  18. Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
  19. 今日干货|如何自学视频剪辑(自学视频剪辑容易吗)
  20. 关于SQL server 2000 在安装过程中遇到文件挂起的解决办法

热门文章

  1. html5内嵌式格式,如何使用内嵌式引入css样式表
  2. 团队作业(三):项目分工
  3. [ROC-RK3568-PC] [Firefly-Android] 10min带你了解ADC的使用
  4. linux 汇编 push rbp,无法从汇编(yasm)代码调用64位Linux上的C标准库函数
  5. ICCID IMSI IMEI MEID
  6. Windows 组策略 应用
  7. Arduino 实现红绿灯效果
  8. 解决xp共享的批处理文件
  9. The Sandbox沙盒遊戲設計大賽將於12月24日開始
  10. 基于深度相机的三维重建技术