#java拼接word文档
说到java操作word 文档,其实网上都已经讲的很多了。我就不再一一赘述了,这里我只记录下使用 docx4j 拼接word文档,使用jacob 调用word 进程生成或者更新docx目录的基本操作。

  1. 引入依赖
<dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-Internal</artifactId><version>8.0.0</version>
</dependency>
<!-- 排除依赖的操作根据自己具体环境选择 -->
<dependency><groupId>org.docx4j</groupId><artifactId>docx4j-export-fo</artifactId><version>8.0.0</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions>
</dependency><!-- https://mvnrepository.com/artifact/net.sf.jacob-project/jacob -->
<dependency><groupId>net.sf.jacob-project</groupId><artifactId>jacob</artifactId><version>1.19</version>
</dependency>
  1. 利用docx4j实现word文档拼接

直接上工具类

/*** Copyright (C) 2019 * Modification  History* Date         Author        Version        Description* ------------------------------------------------------**/
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.docx4j.Docx4J;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFonts;
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.org.apache.poi.util.IOUtils;
import org.docx4j.relationships.Relationship;
import org.docx4j.wml.CTAltChunk;/*** @ClassName: DocxMergeUtil* @Description: TODO* @author: bohu* @date: 2019年8月13日下午4:17:24*/
public class DocxMergeUtil {/*** * DOCX文件合并 * @param list 合并文件全路径(先放入的文件合并到最上方) * @param path 合并后文件输出路径* * @throws Exception*/public static void merge(List<String> list, String path) throws Exception {List<InputStream> inList = new ArrayList<InputStream>();for (int i = 0; i < list.size(); i++) {inList.add(new FileInputStream(list.get(i)));}InputStream inputStream = mergeDocx(inList);saveTemplate(inputStream, path);}public static InputStream mergeDocx(final List<InputStream> streams) throws Docx4JException, IOException {WordprocessingMLPackage target = null;// 创建临时Docx文件final File generated = File.createTempFile("generated", ".docx");// Inspur1!?int chunkId = 0;Iterator<InputStream> it = streams.iterator();try {while (it.hasNext()) {InputStream is = it.next();if (is != null) {if (target == null) {// 流读写 第一个文档OutputStream os = new FileOutputStream(generated);os.write(IOUtils.toByteArray(is));os.close();// 获取第一个文档target = WordprocessingMLPackage.load(generated);} else {// 插入其他文档insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(is), chunkId++);}}}} finally {streams.forEach((t) -> {try {if (t != null) {t.close();}} catch (IOException e) {e.printStackTrace();}});}if (target != null) {target.save(generated);return new FileInputStream(generated);} else {return null;}}/*** * 插入文档 * @param main * @param bytes * @param chunkId*/public static void insertDocx(MainDocumentPart main, byte[] bytes, int chunkId) {try {AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(new PartName("/part" + chunkId + ".docx"));// afiPart.setContentType(new ContentType(CONTENT_TYPE));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 fis * @param toDocPath*/public static void saveTemplate(InputStream fis, String toDocPath) {FileOutputStream fos;// int bytesum = 0;int byteread = 0;try {fos = new FileOutputStream(toDocPath);byte[] buffer = new byte[2048];while ((byteread = fis.read(buffer)) != -1) {// bytesum += byteread; // 字节数 文件大小fos.write(buffer, 0, byteread);}fos.flush();fos.close();fis.close();} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** docx文档转换为PDF* * @param docx    docx文档* @param pdfPath PDF文档存储路径* @throws Exception 可能为Docx4JException, FileNotFoundException, IOException等*/public static void convertDocxToPDF(File docx, String pdfPath) throws Exception {OutputStream os = null;try {WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(docx);
//            Mapper fontMapper = new BestMatchingMapper();   Mapper fontMapper = new IdentityPlusMapper();// 中文字体转换fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));fontMapper.put("隶书", PhysicalFonts.get("LiSu"));fontMapper.put("宋体", PhysicalFonts.get("SimSun"));fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));fontMapper.put("黑体", PhysicalFonts.get("SimHei"));fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));mlPackage.setFontMapper(fontMapper);os = new FileOutputStream(pdfPath);FOSettings foSettings = Docx4J.createFOSettings();foSettings.setWmlPackage(mlPackage);Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);} finally {IOUtils.closeQuietly(os);}}public static void main(String[] args) throws Exception {DocxMergeUtil wordUtil = new DocxMergeUtil();String template = "E:\\parts";List<String> list = new ArrayList<String>();list.add(template + "\\header.docx");list.add(template + "\\linux-1.docx");list.add(template + "\\集群.docx");list.add(template + "\\文档2.docx");list.add(template + "\\文档2-list.docx");list.add(template + "\\文档2-table.docx");list.add(template + "\\NF8480M5-S.docx");list.add(template + "\\CC-AS5500G2.docx");list.add(template + "\\JHJ-FS6500.docx");list.add(template + "\\fooder.docx");// list.add(template + "\\application-1.docx");wordUtil.merge(list, template + "\\out.docx");}}
  1. 利用jacob实现word文档目录更新
import java.io.File;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;import lombok.extern.slf4j.Slf4j;
@Slf4j
public class JacobUtils {//目录更新public static void updateCatalog(String src) {log.info("src:{},tag{},titleName{}", src);ActiveXComponent app = null;Dispatch doc = null;try {ComThread.InitMTA(true);/** 启动word进程 */log.debug("==>>启动word 进程  !");app = new ActiveXComponent("Word.Application");app.setProperty("Visible", new Variant(false));Dispatch docs = app.getProperty("Documents").toDispatch();log.debug("==>>打开word 文档!");/** 打开word文档 */doc = Dispatch.call(docs, "Open", src).toDispatch();Dispatch activeDocument = app.getProperty("ActiveDocument").toDispatch();Dispatch tablesOfContents = Dispatch.get(activeDocument, "TablesOfContents").toDispatch();Variant tablesOfContent = Dispatch.call(tablesOfContents, "Item", new Variant(1));Dispatch toc = tablesOfContent.toDispatch();log.debug("==>>开始更新文档目录!");Dispatch.call(toc, "Update");//new Variant(12) 表示保存为docx文档,详细内容建议读官方api文档Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { src, new Variant(12) }, new int[1]);} catch (Exception e) {e.printStackTrace();log.error("word 更新目录容出错" + e.getMessage());} finally {if (doc != null) {Dispatch.call(doc, "Close", new Variant(false));}if (app != null) {// Dispatch.call(doc, "Close", new Variant(false));app.invoke("Quit", new Variant[] {});}ComThread.Release();}}}

java拼接word文档相关推荐

  1. [原创]java读写word文档,完美解决方案

    [原创]java读写word文档,完美解决方案 参考文章: (1)[原创]java读写word文档,完美解决方案 (2)https://www.cnblogs.com/ziwuxian/p/89812 ...

  2. java 界面艺术字,Java 在Word文档中添加艺术字

    与普通文字相比,艺术字更加美观有趣也更具有辨识度,常见于一些设计精美的杂志或宣传海报中.我们在日常工作中编辑Word文档时,也可以通过添加艺术字体来凸显文章的重点,美化页面排版.这篇文章将介绍如何使用 ...

  3. Java将Word文档转换为PDF的完美工具

    引用至:https://mp.weixin.qq.com/s/JIgo3f98HufGJx23mgtvag Java 将 Word 文档转换为 PDF 的完美工具 在日常工作中,PDF格式良好的视觉阅 ...

  4. java填充word文档_如何使Word文档可填充但不可编辑

    java填充word文档 If contracts are part of your daily workflow, you know how frustrating it is when peopl ...

  5. 使用java将word文档docx,doc(包含图形,文本框)完美转换成所有格式图片(pdf,png,gif,jpeg等等)

    使用java将word文档docx,doc(包含图形,文本框,图片等)完美转换成所有格式图片(pdf,png,gif,jpeg等等)下文中附带代码,效果图等 思路 使用到的包 实现代码 效果图: 思路 ...

  6. Java 将word文档转成html内容,输出到富文本

    使用Java 将word文档转成html内容,输出到富文本 上传word文档 解析到富文本 将word解析成html工具类 import com.common.utils.DateUtil; impo ...

  7. [摘]用Java生成Word文档

    开发中隔三叉五的就要用到Word,经常被搞得不胜其烦,不过这次找到了不少好例子,干脆将他们都摘了过来,内容如下: 1. poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这 ...

  8. Word处理控件Aspose.Words功能演示:用Java从Word文档中提取文本

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

  9. Java解析word文档,将word文档题库选择题导入

    学习目标: Java解析word文档,将word文档题库导入 学会word文档的解析,以及各种题型的导入 学习内容: 解析word文档 获取正文文件内容 doc和docx两种解析 解析word文档 p ...

最新文章

  1. Golang 元素值在经过通道传递时会被复制,这个复制是浅复制
  2. java超级简单到爆的Excel导入导出(easypoi)
  3. java uml 类图 加号_UML建模基础 UML类图的组成元素和关系解析
  4. IOS添加KeyMob广告管理库中文教程
  5. 【深度学习】深度学习手写代码汇总(建议收藏,面试用)
  6. Boost::context模块callcc的circle测试程序
  7. EOJ_1018_玩具谜题
  8. JavaScript进阶3-学习笔记
  9. 华南理工计算机接口技术随堂练习_研究生考试计算机408跟845有什么区别?
  10. Python常见设计模式
  11. 南京航空航天大学计算机网课,南京航空航天大学课程教学大纲-南京航空航天大学计算机科学与技术(9页)-原创力文档...
  12. Cookie 和 Session机制具体解释
  13. java 异常 出口_java语言中,下列哪一子句是异常处理的出口java语言中,下列哪一子句是异常处理的出口Java语言中,下列哪一子句是异常处理的出口()。...
  14. 小白入门必看——idea中JAVA配置
  15. 关于 Mythware 极域电子教室
  16. 国产规则引擎urule,产品化方案的扛把子
  17. 爱在心中【tarjan + 缩点】
  18. 无背景申请奥克兰大学计算机,奥克兰大学无背景要求的专业
  19. react使用mock
  20. RTFNet——用于城市场景语义分割的RGB和热红外融合网络

热门文章

  1. 51单片机驱动1602液晶显示器c程序---万年历
  2. 如何预防网站被挂黑链?
  3. OGG复制进程延迟处理思路与方法
  4. Cyclone IV 外接ddr2(一)
  5. webpack的下载和使用使用
  6. 创建制作 MacOS High Sierra 正式版 USB 安装盘
  7. #791. 徐老师的魔法手环
  8. java设计按月每天签到_签到功能java实现
  9. SQL跨库UPDATE
  10. 算法学习(十六)——D3QN