1.引入docx4j

使用maven仓库引入jar包

```java

org.docx4j

docx4j

6.1.2

```

2.docx4j配置

可以不添加配置文件,但debug日志会提示找不到docx4j配置文件

在src下创建docx4j.properties配置文件,maven项目请放在resources文件夹下

```java

# Page size: use a value from org.docx4j.model.structure.PageSizePaper enum

# eg A4, LETTER

docx4j.PageSize=LETTER

# Page size: use a value from org.docx4j.model.structure.MarginsWellKnown enum

docx4j.PageMargins=NORMAL

docx4j.PageOrientationLandscape=false

# Page size: use a value from org.pptx4j.model.SlideSizesWellKnown enum

# eg A4, LETTER

pptx4j.PageSize=LETTER

pptx4j.PageOrientationLandscape=false

# These will be injected into docProps/app.xml

# if App.Write=true

docx4j.App.write=true

docx4j.Application=docx4j

docx4j.AppVersion=6.1.2

# of the form XX.YYYY where X and Y represent numerical values

# These will be injected into docProps/core.xml

docx4j.dc.write=true

docx4j.dc.creator.value=docx4j

docx4j.dc.lastModifiedBy.value=docx4j

#

#docx4j.McPreprocessor=true

# If you haven't configured log4j yourself

# docx4j will autoconfigure it. Set this to true to disable that

docx4j.Log4j.Configurator.disabled=false

```

3.构建WordProcessingMlPackage对象

docx格式文档可以理解为一个压缩包,若将其解压可看到一个类似前端的工程项目,其中document.xml用于全文的配置,详细解说请自行查阅资料

WordprocessingMLPackage是操作word文档包对象;

创建新的word文档

```java

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

/**

* 构建新word文件

*/

public static WordprocessingMLPackage build() throws Exception{

return WordprocessingMLPackage.createPackage();

}

加载存在的word文档

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

/**

* 读取存在的word文件

* @param wordFilePath word文件路径

*/

public static WordprocessingMLPackage load(String wordFilePath) throws Exception{

return WordprocessingMLPackage.load(new File(wordFilePath));

}

```

4.获取书签

书签:CTBookmark对象

```java

import org.docx4j.TraversalUtil;

import org.docx4j.dml.wordprocessingDrawing.Inline;

import org.docx4j.finders.RangeFinder;

import org.docx4j.jaxb.Context;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;

import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

import org.docx4j.org.apache.poi.util.IOUtils;

import org.docx4j.wml.*;

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

String wordFilePath = "";

WordprocessingMLPackage wordMLPackage = load(wordFilePath);

// 提取正文

MainDocumentPart main = wordMLPackage.getMainDocumentPart();

Document doc = main.getContents();

Body body = doc.getBody();

// 获取段落

List paragraphs = body.getContent();

// 提取书签并获取书签的游标

RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");

new TraversalUtil(paragraphs, rt);

// 遍历书签

for (CTBookmark bm : rt.getStarts()) {

System.out.println("name:"+bm.getName());

}

}

```

5.在书签位置加入图片

```java

import org.docx4j.TraversalUtil;

import org.docx4j.dml.wordprocessingDrawing.Inline;

import org.docx4j.finders.RangeFinder;

import org.docx4j.jaxb.Context;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;

import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

import org.docx4j.org.apache.poi.util.IOUtils;

import org.docx4j.wml.*;

public static void addImage(WordprocessingMLPackage wPackage,CTBookmark bm) throws Exception{

P p = (P) (bm.getParent());

ObjectFactory factory = Context.getWmlObjectFactory();

R run = factory.createR();

// 读入图片并转化为字节数组,因为docx4j只能字节数组的方式插入图片

// byte[] bytes = IOUtils.toByteArray(new FileInputStream("图片路径"));

byte[] bytes = getFileBytes("图片路径");

// 开始创建一个行内图片

BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wPackage, bytes);

// 最后一个是限制图片的宽度,缩放的依据

Inline inline = imagePart.createImageInline(null, null, 0, 1, false, 0);

// 构建绘图

Drawing drawing = factory.createDrawing();

// 加入图片段落

drawing.getAnchorOrInline().add(inline);

run.getContent().add(drawing);

// 清理书签所在数据

// p.getContent().clear();

// 加入图片信息

p.getContent().add(run);

}

public static byte[] getFileBytes(String filePath) throws Exception{

File file = new File(filePath);

if(!file.exists()){

throw new Exception("文件不存在!");

}

byte[] data = null;

try(FileInputStream fis = new FileInputStream(file);ByteArrayOutputStream baos = new ByteArrayOutputStream()){

int len;

byte[] buffer = new byte[1024];

while ((len = fis.read(buffer)) != -1) {

baos.write(buffer, 0, len);

}

data = baos.toByteArray();

}

return data;

}

```

6.保存文件

必须调用保存,否则更改无效

// 保存

// 方式一

```java

wordMLPackage.save(new File(wordFilePath));

```

// 方式二

```java

Docx4J.save(wordMLPackage, new File(wordFilePath));

```

7.完整代码

```java

import org.docx4j.TraversalUtil;

import org.docx4j.dml.wordprocessingDrawing.Inline;

import org.docx4j.finders.RangeFinder;

import org.docx4j.jaxb.Context;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;

import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

import org.docx4j.org.apache.poi.util.IOUtils;

import org.docx4j.wml.*;

import javax.xml.bind.JAXBElement;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class WordTest {

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

String wordFilePath = "word文档路径";

WordprocessingMLPackage wordMLPackage = load(wordFilePath);

// 提取正文

MainDocumentPart main = wordMLPackage.getMainDocumentPart();

Document doc = main.getContents();

Body body = doc.getBody();

// 获取段落

List paragraphs = body.getContent();

// 提取书签并获取书签的游标

RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");

new TraversalUtil(paragraphs, rt);

// 遍历书签

for (CTBookmark bm : rt.getStarts()) {

System.out.println("name:"+bm.getName());

// 替换image

if ("sign".equals(bm.getName())){

addImage(wordMLPackage, bm);

break;

}

}

save(wordMLPackage,wordFilePath);

}

public static void addImage(WordprocessingMLPackage wPackage,CTBookmark bm) throws Exception{

P p = (P) (bm.getParent());

ObjectFactory factory = Context.getWmlObjectFactory();

R run = factory.createR();

// 读入图片并转化为字节数组,因为docx4j只能字节数组的方式插入图片

// byte[] bytes = IOUtils.toByteArray(new FileInputStream("图片文件路径"));

byte[] bytes = getFileBytes("图片文件路径");

// 开始创建一个行内图片

BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wPackage, bytes);

// 最后一个是限制图片的宽度,缩放的依据

Inline inline = imagePart.createImageInline(null, null, 0, 1, false, 0);

// 构建绘图

Drawing drawing = factory.createDrawing();

// 加入图片段落

drawing.getAnchorOrInline().add(inline);

run.getContent().add(drawing);

// 清理书签所在数据

// p.getContent().clear();

// 加入图片信息

p.getContent().add(run);

}

/**

* 构建文件

*/

public static WordprocessingMLPackage build() throws Exception{

return WordprocessingMLPackage.createPackage();

}

/**

* 读取存在的word文件

* @param wordFilePath word文件路径

*/

public static WordprocessingMLPackage load(String wordFilePath) throws Exception{

return WordprocessingMLPackage.load(new File(wordFilePath));

}

/**

* 保存

* @param wordMLPackage word

*/

public static void save(WordprocessingMLPackage wordMLPackage,String wordFilePath) throws Exception{

wordMLPackage.save(new File(wordFilePath));

}

public static byte[] getFileBytes(String filePath) throws Exception{

File file = new File(filePath);

if(!file.exists()){

throw new Exception("文件不存在!");

}

byte[] data = null;

try(FileInputStream fis = new FileInputStream(file);ByteArrayOutputStream baos = new ByteArrayOutputStream()){

int len;

byte[] buffer = new byte[1024];

while ((len = fis.read(buffer)) != -1) {

baos.write(buffer, 0, len);

}

data = baos.toByteArray();

}

return data;

}

}

```

java 生成电子合同_java实现电子合同签名相关推荐

  1. java生成验证码实例_Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_te ...

  2. java生成小图片_JAVA生成缩略小图片类

    JAVA生成缩略小图片类 java.awt.image.BufferedImage是缓冲图片类主要将生成的图片对象缓冲起来:javax.imageio.ImageIO是图片IO控制类,可以将缓冲图片对 ...

  3. java 生成csv文件_Java生成CSV文件实例详解

    本文实例主要讲述了java生成csv文件的方法,具体实现步骤如下: 1.新建csvutils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  4. java生成随机时间_Java生成某段时间内的随机时间

    上代码: import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { /** * 生成随机时间 ...

  5. java生成随机数组_JAVA生成随机数组10个数字并求和

    JAVA生成随机数组10个数字并求和 本文最终结果大概是这样的',使用java技术随机生成10个数,然后填充一个数组并在消息框中显示数组内容,接着对数组求和输出,将结果显示在消息框中. 设计思路:可以 ...

  6. java生成字符串数组_Java 生成随机字符串数组的实例详解

    Java 生成随机字符串数组的实例详解 利用Collections.sort()方法对泛型为String的List 进行排序.具体要求: 1.创建完List之后,往其中添加十条随机字符串 2.每条字符 ...

  7. java生成sql语句_java生成SQL语句

    代码如下: /** * 动态生成SQ及SQL参数L * @param ve 接收到的消息的CHGLIST * @param paramList MQ消息中的SQL参数 * @param t 泛型对象 ...

  8. java生成pdf表格_java在pdf中生成表格的方法

    1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储 ...

  9. java生成pdf加密_java使用iText 生成PDF全攻略(表格,加密)

    java使用iText 生成PDF全攻略,包括创建文档,设置字体,添加表格(PdfPTable),创建新页(newPage),设置布局,加密 主要使用的jar包: itextpdf-5.4.2.jar ...

最新文章

  1. tomcat 运行php_tomcat可以运行php吗
  2. 部署 instance 到 VXLAN - 每天5分钟玩转 OpenStack(112)
  3. 十年IT运维谈(二)“0”和“100”
  4. 国际农产品交易模式 东亚模式对话国际农民丰收节贸易会
  5. Winform中使用zxing和Graphics实现自定义绘制二维码布局
  6. 存储基础知识二 主要协议SCSI、FC、iSCSI
  7. 使用cpan安装perl模块
  8. IOS 打包证书签名 shell脚本
  9. C# 热敏打印机 Socket 网络链接 打印 图片 (二)
  10. Linux定期执行xshell脚本(入门)
  11. java query object_java queryforobject
  12. Java 面向对象(基础) 知识点总结I
  13. cmd无法运行python_为什么CMD无法运行python程序
  14. xadmin可能是帮助我完成django网站的一大助力
  15. Domino 邮箱服务器接收不存在的邮箱账号的邮件
  16. 图解设计模式:行为型模式之观察者模式
  17. 为什么要学习凸优化?
  18. 电脑不能安装linux,解决部分电脑不能安装Linux问题
  19. Not All Carrots Are Orange
  20. Kee插件提示Open Kee Vault or KeePass to enable Kee的解决办法

热门文章

  1. python的构造函数的作用,python 构造函数作用
  2. androidlib.java_实现 Java SDK 库
  3. C++ Awkward Digits
  4. 远程工具之一---rsync用法介绍
  5. 手把手教你创建群晖nas「共享文件夹」,从此告别 U 盘和低效传输
  6. PI3体验之无线网AP模式设定及热点分享
  7. 解决 remote: Repository not found. fatal: repository 'https://github.com/xxxx/xxxx.git/
  8. SpringBoot-Mongodb双数据源配置
  9. 小米air2se耳机只有一边有声音怎么办_169元,性价比超高,小米蓝牙耳机Air2 SE,C位出道...
  10. matlab求解杜分方程,[转载]时间序列分析matlab简单函数