Docx4j

docx4j是一个用于处理OOXML(office open xml)文档(如docx、pptx等文档)的库,功能非常强大,其基础部分是开源的,但一些高级功能是需要商业授权,比如文档的合并等功能。

网络上也有其它合并的方式,但并不好用,那么使用docx4j的商业授权部分来做是什么情况呢?

下面的代码是基于docx4j企业版的试用版(Plutext-Enterprise-3.3.0.6-trial)。

合并多个docx文档

public class MergeWholeDocumentsUsingBlockRange {public final static String DIR_IN = System.getProperty("user.dir")+ "/src/samples/MergeDocx/resources/";public final static String DIR_OUT = System.getProperty("user.dir")+ "/";public static void main(String[] args) throws Exception {String[] files = {"IntegersOnly.docx", "UN-Declaration.docx" , "SolarSystem.docx"};List<BlockRange> blockRanges = new ArrayList<BlockRange>();for (int i=0 ; i< files.length; i++) {BlockRange block = new BlockRange(WordprocessingMLPackage.load(new File(DIR_IN + files[i])));blockRanges.add( block );// No pages breaksblock.setSectionBreakBefore(SectionBreakBefore.CONTINUOUS);// if you want no headers on the pages from docx2:block.setHeaderBehaviour(HfBehaviour.NONE);if (i==1) {block.setStyleHandler(StyleHandler.RENAME_RETAIN);}}// Perform the actual mergeDocumentBuilder documentBuilder = new DocumentBuilder();WordprocessingMLPackage output = documentBuilder.buildOpenDocument(blockRanges);// Save the resultDocx4J.save(output, new File(DIR_OUT+"OUT_MergeWholeDocumentsUsingBlockRange.docx"), Docx4J.FLAG_NONE);      }
}

上面的代码是摘自Plutext-Enterprise-3.3.0.6试用版示例代码,代码非常简单,不需要什么解释;当然除了这段标准代码外在合并时还可以设置一些特殊的参数。

合并pptx文档

public class MergeWholePresentations {public final static String DIR_IN = "D:/docx/";public final static String DIR_OUT = "D:/";public static void main(String[] args) throws Exception {long startMS = System.currentTimeMillis();String[] deck = {"1.pptx" ,"2.pptx", "3.pptx",};PresentationBuilder builder = new PresentationBuilder();for (int i=0 ; i< deck.length; i++) {System.out.println("\n\n loading " + i + "  " + deck[i] + "\n\n");// Create a SlideRange representing the slides in this pptxSlideRange sr = new SlideRange((PresentationMLPackage)OpcPackage.load(new File(DIR_IN + deck[i])));sr.setName(i+ " " + deck[i]);  // PkgIdentifier for ListeningBean// Add the slide range to the outputbuilder.addSlideRange(sr);}builder.getResult().save(new File("D:\\e.pptx"));// The times above don't include various things, such as Context init, and saving the final docxlong elapsedMS = System.currentTimeMillis() - startMS;int secs = Math.round(elapsedMS/1000);System.out.println("time taken: " + secs + "secs");}
}

上面的pptx合并代码基本也是示例代码,只是作了一些简化。

水印

由于需要商业授权,因此上面代码合并结果都给加了水印,如下图所示:

其实仔细分析一下,上面合并文档中的水印都是文档中的一个元素,完全可以将其去掉,但如果文档太大,可能去除过程比较慢。

这里涉及到ooxml的原理,本人也不是很熟悉;如果有兴趣可以去了解一下,本质上一个docx(或pptx)文档就是一堆xml文件压缩到一个文件中,这些xml中定义了该文档所有细节;其中这里的水印也是一段XML代码,我们只需要分析一下合并的结果,找到并删除即可。

去水印

在合并后的docx文档中,水印是一个段落结构,所以我们只需要分析所有段落找到目标段落即可。

下面的代码可以获取文档中所有段落:

// 递归方法,获取给定对象下所有符合条件的对象
private static <T> List<T> getAllElementFromObject(Object obj, Class<T> toSearch) {List<T> result = new ArrayList<>();if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();if (obj.getClass().equals(toSearch)) {result.add(toSearch.cast(obj));} else if (obj instanceof ContentAccessor) {List<?> children = ((ContentAccessor) obj).getContent();for (Object child : children) {result.addAll(getAllElementFromObject(child, toSearch));}}return result;
}

调用代码:

List<P> pList = getAllElementFromObject(documentPart, P.class);

而在合并的pptx文档中,是每页都有水印的,因此可以分析所有幻灯片,找到目标Shape结构(pptx文档中水印是一个Shape)删除即可。

由于涉及到商业授权,这里就不放完整代码了;不过根据这个思路,去除其实是很容易的。

如何使用Docx4J合并docx及pptx文档相关推荐

  1. Springboot生成Word/EXECL/PPTX文档

    目录 一.概述 二.使用介绍 第一种Poi-tl: 1.介绍 2.功能 第二种Poi: 什么是POI 二进制分布 源码分发 一.概述 Word模板引擎:使用Word模板和数据生成对应的Word文档. ...

  2. C# 合并及拆分Word文档

    C# 合并及拆分Word文档 本文简要分析一下如何如何使用C#简单实现合并和拆分word文档.平时我们在处理多个word文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档 ...

  3. 【Python】导出docx格式Word文档中的文本、图片和附件等

    [Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...

  4. Java:多个文档合并输出到一个文档

    多个文档合并输出到一个文档 方法:Java NIO package First;import java.io.File; import java.io.FileInputStream; import ...

  5. 合并多个Word文档

    在Word 2007中可以合并多个Word文档. 转载于:https://blog.51cto.com/jackiechen/176693

  6. 合并多个word的代码_快速合并多个word文档内容,别再复制粘贴了!

    问题情境: 相信很多童鞋在处理多个word文档内容合并时,我想一般情况下你们都会打开各个文档,复制里面的内容,再粘贴到同一个文档里面. 技巧步骤: 1. 首先新建一个文档,单击"插入&quo ...

  7. 浅析C#合并多个WORD文档的具体实现方法

    http://www.chinacs.net/a/csharp/2010/0724/36.html 今天因为客户需要,需要将多个WORD文档合并成为一个WORD文档.其中,对WORD文档的合并方式分两 ...

  8. java pdf合并_Java 合并、拆分PDF文档

    本文将介绍如何在Java程序中合并及拆分PDF文档,合并文档时,包括合并多个不同PDF文档为一个文档,以及合并PDF文档的不同页面为一页:拆分文档是,包括将PDF文档按每一页拆分,以及按指定页数范围来 ...

  9. java读取word文档内容_合并多个Word文档内容,还在复制粘贴就out了,同事五秒轻松搞定...

    在我们工作中,我们经常会编写多个Word文档内容,那么怎么将多个单个的Word文档合并到一个文档中,这就会显得有些难度. 如上图所示,我们需要将三个不同的案例,快速的汇总到我们的案例汇总表当中.许多朋 ...

最新文章

  1. java怎么加定时器_JAVA WEB程序中添加定时器
  2. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的基本操作
  3. android自适应拉伸图片,Android 启动页-解决图片被拉伸和压缩问题,适配虚拟导航栏...
  4. 算法笔记_028:字符串转换成整数(Java)
  5. cocos2d-x初探学习笔记(21)--精灵类
  6. Linux shell利用sed如何批量更改文件名详解
  7. HBase停止集群报错,pid: No such file or directory
  8. 今天的成功的滋味 企业即时通讯
  9. 蓝桥杯 ALGO-64 算法训练 大小写判断
  10. ArcGIS Pro 性能诊断
  11. 动态规划之LIS(最长上升子序列)
  12. ADO.NET Entity Framework(3)ObjectContext
  13. Atitit 防注入 sql参数编码法 目录 1.2. 提升可读性pg_escape_literal — 转义文字以插入文本字段 1 1.2.1. 说明 1 1.3. 推荐pg_escape_str
  14. php不包含_php 正则 不包含某字符串的正则表达式
  15. Python入门之经典函数实例
  16. python 调用大漠
  17. 2021苏州大学计算机考研分数,2021苏州大学考研分数线已公布
  18. 施一公等团队登Science封面:AI与冷冻电镜揭示「原子级」NPC结构,生命科学突破...
  19. Orcad capture
  20. MFC+Opencv以图拼图

热门文章

  1. 网站 服务器拒绝访问,缓存服务器拒绝访问 了解如何修复
  2. 马里兰大学招收机器学习及计算机安全方向博士生 | 2023 秋季
  3. 网络配置——undo 命令
  4. 【算法】_014_最大子数组_线性法
  5. 机器人的自述作文_机器人作文范文300字
  6. ios用的什么编译器编译_为什么编译器是您最好的朋友
  7. Ae 表达式语言引用​:Path Property
  8. DotNetBar的groupPanel和buttonX背景色问题
  9. 首款国产科学计算软件:北大天元,个人测试与感受
  10. 台式计算机开机密码设置,台式win10电脑开机密码怎么更改?改台式win10电脑开机密码的两种方法...