如何使用Docx4J合并docx及pptx文档
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文档相关推荐
- Springboot生成Word/EXECL/PPTX文档
目录 一.概述 二.使用介绍 第一种Poi-tl: 1.介绍 2.功能 第二种Poi: 什么是POI 二进制分布 源码分发 一.概述 Word模板引擎:使用Word模板和数据生成对应的Word文档. ...
- C# 合并及拆分Word文档
C# 合并及拆分Word文档 本文简要分析一下如何如何使用C#简单实现合并和拆分word文档.平时我们在处理多个word文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档 ...
- 【Python】导出docx格式Word文档中的文本、图片和附件等
[Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...
- Java:多个文档合并输出到一个文档
多个文档合并输出到一个文档 方法:Java NIO package First;import java.io.File; import java.io.FileInputStream; import ...
- 合并多个Word文档
在Word 2007中可以合并多个Word文档. 转载于:https://blog.51cto.com/jackiechen/176693
- 合并多个word的代码_快速合并多个word文档内容,别再复制粘贴了!
问题情境: 相信很多童鞋在处理多个word文档内容合并时,我想一般情况下你们都会打开各个文档,复制里面的内容,再粘贴到同一个文档里面. 技巧步骤: 1. 首先新建一个文档,单击"插入&quo ...
- 浅析C#合并多个WORD文档的具体实现方法
http://www.chinacs.net/a/csharp/2010/0724/36.html 今天因为客户需要,需要将多个WORD文档合并成为一个WORD文档.其中,对WORD文档的合并方式分两 ...
- java pdf合并_Java 合并、拆分PDF文档
本文将介绍如何在Java程序中合并及拆分PDF文档,合并文档时,包括合并多个不同PDF文档为一个文档,以及合并PDF文档的不同页面为一页:拆分文档是,包括将PDF文档按每一页拆分,以及按指定页数范围来 ...
- java读取word文档内容_合并多个Word文档内容,还在复制粘贴就out了,同事五秒轻松搞定...
在我们工作中,我们经常会编写多个Word文档内容,那么怎么将多个单个的Word文档合并到一个文档中,这就会显得有些难度. 如上图所示,我们需要将三个不同的案例,快速的汇总到我们的案例汇总表当中.许多朋 ...
最新文章
- java怎么加定时器_JAVA WEB程序中添加定时器
- Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的基本操作
- android自适应拉伸图片,Android 启动页-解决图片被拉伸和压缩问题,适配虚拟导航栏...
- 算法笔记_028:字符串转换成整数(Java)
- cocos2d-x初探学习笔记(21)--精灵类
- Linux shell利用sed如何批量更改文件名详解
- HBase停止集群报错,pid: No such file or directory
- 今天的成功的滋味 企业即时通讯
- 蓝桥杯 ALGO-64 算法训练 大小写判断
- ArcGIS Pro 性能诊断
- 动态规划之LIS(最长上升子序列)
- ADO.NET Entity Framework(3)ObjectContext
- Atitit 防注入 sql参数编码法 目录 1.2. 提升可读性pg_escape_literal — 转义文字以插入文本字段	1 1.2.1. 说明	1 1.3. 推荐pg_escape_str
- php不包含_php 正则 不包含某字符串的正则表达式
- Python入门之经典函数实例
- python 调用大漠
- 2021苏州大学计算机考研分数,2021苏州大学考研分数线已公布
- 施一公等团队登Science封面:AI与冷冻电镜揭示「原子级」NPC结构,生命科学突破...
- Orcad capture
- MFC+Opencv以图拼图
热门文章
- 网站 服务器拒绝访问,缓存服务器拒绝访问 了解如何修复
- 马里兰大学招收机器学习及计算机安全方向博士生 | 2023 秋季
- 网络配置——undo 命令
- 【算法】_014_最大子数组_线性法
- 机器人的自述作文_机器人作文范文300字
- ios用的什么编译器编译_为什么编译器是您最好的朋友
- Ae 表达式语言引用​:Path Property
- DotNetBar的groupPanel和buttonX背景色问题
- 首款国产科学计算软件:北大天元,个人测试与感受
- 台式计算机开机密码设置,台式win10电脑开机密码怎么更改?改台式win10电脑开机密码的两种方法...