java docx4j 合并word_使用docx4j进行docx文档合并。
#docx4j介绍
docx4j是一个用于创建和操作Microsoft Open XML (Word docx, Powerpoint pptx, 和 Excel xlsx)文件的Java类库。
#开发环境
笔记仅供参考,具体开发环境可能存在版本差异。
OS:Windows 10
JDK:SUN 1.8
Eclipse:4.5[STS Spring定制版]
Maven:3.3.9
#使用介绍
这个问题之前是用卓正office解决的文档合成,我个人不是很满意效果。现在找到了新的方案感觉挺不错的,所以只是演示合成。我感觉poi也是可以的,但是我并没发现有合并文档的方法。也许是我不够深入吧。
#添加依赖
org.docx4j
docx4j
3.3.1
org.docx4j
docx4j-ImportXHTML
3.3.1
org.docx4j.org.capaxit.textimage
TextImageGen
1.9
org.plutext
jaxb-xmldsig-core
1.0.0
#代码用例
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.WordprocessingML.AlternativeFormatInputPart;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.relationships.Relationship;
import org.docx4j.wml.CTAltChunk;
public class MargeDoc {
public static final int BUFFER_LENGTH = 10240; //缓冲
public void mergeDocx(List list, File file) {
List inList = new ArrayList();
for (int i = 0; i < list.size(); i++)
try {
inList.add(new FileInputStream(list.get(i)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
InputStream inputStream = mergeDocx(inList);
write(inputStream, file);
} catch (Docx4JException | IOException e) {
e.printStackTrace();
}
}
public InputStream mergeDocx(final List streams) throws Docx4JException, IOException {
WordprocessingMLPackage target = null;
final File generated = File.createTempFile("generated", ".docx");
int chunkId = 0;
Iterator it = streams.iterator();
while (it.hasNext()) {
InputStream is = it.next();
if (is != null) {
if (target == null) {
// Copy first (master) document
OutputStream os = new FileOutputStream(generated);
os.write(IOUtils.toByteArray(is));
os.close();
target = WordprocessingMLPackage.load(generated);
} else {
insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(is), chunkId++);
}
}
}
if (target != null) {
target.save(generated);
return new FileInputStream(generated);
} else {
return null;
}
}
/**
* 插入单个文档
* @param main
* @param bytes
* @param chunkId
*/
private void insertDocx(MainDocumentPart main, byte[] bytes, int chunkId) {
try {
AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(
new PartName("/part" + chunkId + ".docx"));
afiPart.setBinaryData(bytes);
Relationship altChunkRel = main.addTargetPart(afiPart);
CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk();
chunk.setId(altChunkRel.getId());
main.addObject(chunk);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 写入文件
* @param req
* @return
* @throws IOException
*/
public static boolean write(InputStream content,File file) {
OutputStream out = null;
int read = 0;
final byte[] bytes = new byte[BUFFER_LENGTH];
try {
out = new FileOutputStream(file, true);
while ((read = content.read(bytes)) != -1){
out.write(bytes, 0, read);
}
} catch (IOException e) {
return false;
}finally {
close(out);
close(content);
}
return true;
}
/**
* 关闭流
* @param stream
*/
public static void close(Closeable stream) {
try {
if (stream != null)
stream.close();
} catch (IOException e) {
}
}
public static void main(String[] args) throws Docx4JException, IOException{
MargeDoc wordUtil=new MargeDoc();
String template="D:/import/docx";
List list=new ArrayList();
list.add(template+"/1.docx");
list.add(template+"/2.docx");
list.add(template+"/3.docx");
wordUtil.mergeDocx(list, new File(template+"/out.docx"));
}
}
#测试数据
#测试结果
图片文字样式都可以合成,唯独插入的表单是个合成的时候位置不对。有待研究用法。
java docx4j 合并word_使用docx4j进行docx文档合并。相关推荐
- (doc, docx)文档合并的三种方法
Word文档合并几种方式 通过com.spire.doc包 具体参考地址:https://www.e-iceblue.cn/spiredocforjavaoperating/merge-word-do ...
- Java web/springboot上传word/doc/docx文档(含图片)与HTML富文本导入/导出互相转换解析!附项目源码
测试效果 先看下效果 文档内容如下: 上传 上传docx文档 查看解析内容 <html><head><style>p{margin-top:0pt;margin-b ...
- java 转换xml格式的doc或docx文档为docx以及docx转PDF
转换xml格式的doc或docx文档为docx import org.docx4j.Docx4J; import org.docx4j.openpackaging.packages.Wordproce ...
- java通过aspose.words将两个word文档合并
参考文章:https://www.cnblogs.com/yin1361866686/p/9561006.html 1:提供一个jar包的下载链接 链接:https://pan.baidu.com/s ...
- java docx文档解析_带有docx4j的Java Word(.docx)文档
java docx文档解析 几个月前,我需要创建一个包含许多表和段落的动态Word文档. 过去,我曾使用POI来实现此目的,但是我发现它很难使用,并且在创建更复杂的文档时对我来说效果不佳. 因此,对于 ...
- DOCX4J 解析DOCX文档字体格式
一.DOCX文档格式 docx4j只能解析docx格式的word文档,这种文档其实是一个压缩文件,加压后会有如下图所示的多个文件,文档中字体格式主要包含在document.xml和styles.xml ...
- 关于JAVA POI解析WPS docx文档中的table(复杂表格包含单元格横向,纵向的合并)
关于JAVA POI解析WPS docx文档中的table(复杂表格包含单元格横向,纵向的合并) 首先,关于poi解析表格先阅读一篇他人的博客 使用poi读取word2007(.docx)中的复杂表格 ...
- java 独立文档标签_怎么将带图片和表格的html标签转换为docx文档---java实现
有人搞过将带图片和表格的html标签转换为docx文档吗?我转换为doc文档 wps打开不显示图片 office2016可以 2013不可以 现在想换为docx文档 有没有实现的?XDOC-Word文 ...
- java word 文档合并_Java 合并Word文档
概述 合并文档可以是将两个包含一定逻辑关系的文档合并成一个完整的文档,也可以是出于方便文档存储.管理的目的合并多个文档为一个文档.下面,就将以上文档操作需求,通过Java程序来实现Word文档合并.合 ...
- java利用Freemarker模板生成格式友好的doc或者docx文档
之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...
最新文章
- ACR2010_依那西普改善RA患者骨代谢
- 0-1背包 java_0-1背包问题,java的动态规划如题,代码如下public
- BLE蓝牙核心数据库结构解析
- tp5获取mysql版本_TP5 + MySQL 应用地址选择
- MFC 界面美化 Skinmagic
- sshfs的挂载与卸载
- django13:Session与Cookie操作
- python的selenium模块_Python中Selenium模块的使用
- 从一片空白到世界领先,中国通信翻身逆袭史
- Pytorch中的错误和bug
- 计算机网络-自顶向下方法 7th 5.4 BGP协议总结
- Android零基础入门第6节:配置优化SDK Manager,正式约会女神
- Invalid regular expression: unmatched parentheses
- 在 Cloudera Data Flow 上运行你的第一个 Flink 例子
- 2021-08-3116. 最接近的三数之和 排序+双指针
- java doc、docx、pdf格式互转
- ADMM算法理论与应用
- tcp粘包问题以及处理方案
- 欧拉角与四元数互相转换
- 网页打开速度慢,如何解决(修改DNS)