简介

使用docx4j将多个docx文件,合并为一个docx文件,采用在文档最后一个段落追加内容的方式。

依赖

     <dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version>6.1.2</version></dependency>

工具方法

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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** @author gongl* @date 2022-10-10*/
public class PdfUtils {private static final Logger log = LoggerFactory.getLogger(PdfUtils.class);/*** 合并word文件* @param wordList    待合并文件集合* @param outFilePath  输出文件路径*/public static void mergeDoc(List<String> wordList, String outFilePath) {List<InputStream> streamList = new ArrayList<>();for (String wordPath : wordList) {try {streamList.add(new FileInputStream(wordPath));} catch (FileNotFoundException e) {log.error("待合并文件流读取异常:", e);e.printStackTrace();}}try {mergeDocStream(streamList, new FileOutputStream(new File(outFilePath)));} catch (Exception e) {log.error("临时文件创建异常:", e);}}private static void mergeDocStream(List<InputStream> streamList, FileOutputStream out) throws Docx4JException, IOException {WordprocessingMLPackage target = null;final File generated = File.createTempFile("generated", ".docx");int chunkId = 0;for (InputStream is : streamList) {if (is != null) {if (target == null) {OutputStream os = new FileOutputStream(generated);os.write(IOUtils.toByteArray(is));os.close();target = WordprocessingMLPackage.load(generated);} else {insertDoc(target.getMainDocumentPart(), IOUtils.toByteArray(is), chunkId++);}}}if (target != null) {target.save(generated);FileInputStream fileInputStream = new FileInputStream(generated);saveTemplate(fileInputStream, out);}}private static void insertDoc(MainDocumentPart mainDocumentPart, byte[] bytes, int chunkId) {try {PartName partName = new PartName("/part" + chunkId + ".docx");AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(partName);afiPart.setBinaryData(bytes);Relationship relationship = mainDocumentPart.addTargetPart(afiPart);CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk();chunk.setId(relationship.getId());mainDocumentPart.addObject(chunk);} catch (Exception e) {log.error("文件合并临时文件异常:", e);}}private static void saveTemplate(InputStream targetStream, FileOutputStream out) {int byteread;try {byte[] buffer = new byte[1024 * 10];while ((byteread = targetStream.read(buffer)) != -1) {out.write(buffer, 0, byteread);}targetStream.close();out.close();} catch (IOException e) {log.error("生成文件异常:", e);}}
}

测试用例

先创建两个docx文件:2.docx和1.docx

执行代码合并为3.docx

  public static void main(String[] args) {mergeDoc(Arrays.asList("C:\\Users\\E490\\Desktop\\2.docx", "C:\\Users\\E490\\Desktop\\1.docx"), "C:\\Users\\E490\\Desktop\\3.docx");}

结果如下图

使用docx4j追尾合并多个docx文件为一个docx文件相关推荐

  1. python现有两个磁盘文件a和b_有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中Python实例...

    有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中Python实例 题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并( ...

  2. 用nodejs把多个PDF文件成为一个PDF文件

    用nodejs把多个PDF文件成为一个PDF文件 1.先下载 pdf-lib包 cnpm install pdf-lib 2.新建文件夹pdf 文件夹和pool文件夹 pdf文件夹是存放pdf原始文件 ...

  3. html用dom显示xml,html DOM文件引用一个XML文件将不会在浏览器中打印

    我完全不熟悉这一点,我正在上课,现在变成了一个令人头疼的问题.我有这个HTML DOM文件,它引用了一个XML文件,我需要在浏览器中显示在屏幕上.它应该只打印标题,标题,第一个,最后一个,位置,描述的 ...

  4. Window中使用copy.exe合并多个iso镜像文件到一个iso文件

    需求 我下载了Debian系统的三个iso包,想要将其合并为一个iso文件,然后制作U启动盘. [下载页面](https://cdimage.debian.org/debian-cd/current/ ...

  5. C# 中将所有引用的DLL 和exe文件打成一个exe文件(转)

    C#工程经常会引用多个DLL文件,形成一个完整的工程项目的目的.这样的工程在发布时,需要将编译形成的EXE文件与DLL文件共同发布.如果感觉麻烦,可以将这些DLL文件与EXE文件合并,最终形成一个更大 ...

  6. C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件

    今天做了一个软件,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过 ...

  7. 如何将多个bin文件合成一个bin文件?(二)

    一.所需软件 J-flash ARM 二.所需合成文件 1)Bootload.hex(Bootload.bin) 2)Application.hex(Application.bin) 三.步骤 打开J ...

  8. c语言调用system32下的dll文件,复制一个dll文件进system32,说:需要权限什么之类的...

    给你推荐一个另外的方法,尤其是你要替换SYSTEM32文件夹下面的文件的时候 将以下内容保存为一个reg文件,如 获取管理员权限.reg Windows Registry Editor Version ...

  9. 手机浏览器只保存php文件夹,一个PHP文件搞定支付宝系列之手机网站支付(兼容微信浏览器)...

    网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入支付宝支付的带来些许帮助和借鉴意义. 在手机浏览器下打开实现效果 在微信 ...

  10. 可疑文件_一个可疑文件_病毒样本 分享分析区_安全区 卡饭论坛 - 互助分享 - 大气谦和!...

    貌似是exe程序,改了后缀名 2013-9-5 04:12:10    创建新进程    允许 进程: c:\windows\explorer.exe 目标: c:\测试\changelog xtre ...

最新文章

  1. 数组-两个数组的交集(两个集合)
  2. Shell中的while语句
  3. jar文件与云服务器断开,把jar包放到云服务器
  4. 三星第二财季净利69亿美元 同比增50%
  5. 《数据库SQL实战》查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
  6. [Android] 输入系统(三):加载按键映射
  7. MYSQL 时间处理
  8. Michael Dell承诺打造新的EMC/戴尔/VMware工程技术系统
  9. 2月8日见!三星Galaxy S22系列新增樱花粉配色
  10. 第2章 大数据处理架构Hadoop
  11. 2022版史上最牛Java学习路线图(视频教程+配套资料)
  12. 2020届MEM/MBA考研提面准备以及常见问题分享
  13. 友华改设备标识命令_PT632 G_2装备指令
  14. win7美化_win7/8/10桌面插件美化
  15. 0033【MySQL】Mysql备份导入异常:@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty
  16. Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法
  17. 计算机取小数点后的小数 公式,excel表格公式计算后取小数点后的位数 | excle小数个数...
  18. OpenGL ES EGL eglMakeCurrent
  19. WHM不可不说的几件事?
  20. python批量打印mathcad_快速批量打印软件 – Print Conductor 6.1

热门文章

  1. 人类2100年长啥样?3D建模模拟出来让人惊掉下巴!
  2. 苹果删除照片不释放内存_原来苹果手机这样清理内存,可以释放大量空间,真是太好用了...
  3. Windows安全加固简介
  4. 黑盒测试用例编写八大方法
  5. 维修 空调 碰上 骗子
  6. ImportError: cannot import name ‘_validate_lengths‘解决方法
  7. b B kb kB kbps KBps 换算
  8. 在ubuntu用audacity把音频转换成256kbps,单声道。(亲测有效)
  9. 【学习记录】名词和名词性从句
  10. 0901 - 虽已马不停蹄,无奈时光飞逝