问题
这两天一直在找java合并wrod的实现方法,找到了一个不错的文章,地址如下:http://www.cnblogs.com/tianyublog/p/6957953.html,copy代码试验了一翻,的确是可以实现合并的word的效果的,但是有一个致命的缺陷,word里的图片没办法正确的合并到目标文件。
解决
研究了大半天,终于找到了解决方案。上面的合并word原理是,将word文档的内容转换为xml字符串,然后把要合并文档的xml进行拼接,生成新的文档。之所以图片无法合并是因为xml里只保存了图片的基本信息及ID,但没有保存图片的具体二进制数据,所以解决思路就是如何将文档中的图片合并到目标word之中。于是我对原来合并的代码进行了改造,实现了我想要的效果
直接上代码,不能说很巧妙,但是至少解决了问题。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFPictureData; import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; /** * @author: Max * * @Date: 2018/6/8 * * @name: 多个word文件合并,采用poi实现,兼容图片的迁移 * * @Description: */ public class MergeDoc { public static void main (String[] args) throws Exception { InputStream in1 = null; InputStream in2 = null; InputStream in3 = null; OPCPackage src1Package = null; OPCPackage src2Package = null; OPCPackage src3Package = null; OutputStream dest = new FileOutputStream("d:\\merge.docx"); try { in1 = new FileInputStream("my/word/图片表格测试模板.docx"); in2 = new FileInputStream("my/word/图片.docx"); in3 = new FileInputStream("my/word/图片.docx"); src1Package = OPCPackage.open(in1); src2Package = OPCPackage.open(in2); src3Package = OPCPackage.open(in3); } catch (Exception e) { e.printStackTrace(); } XWPFDocument src1Document = new XWPFDocument(src1Package); XWPFDocument src2Document = new XWPFDocument(src2Package); XWPFDocument src3Document = new XWPFDocument(src2Package); appendBody(src1Document, src2Document); appendBody(src1Document, src3Document); src1Document.write(dest); } public static void appendBody(XWPFDocument src, XWPFDocument append) throws Exception { CTBody src1Body = src.getDocument().getBody(); CTBody src2Body = append.getDocument().getBody(); List<XWPFPictureData> allPictures = append.getAllPictures(); // 记录图片合并前及合并后的ID Map<String,String> map = new HashMap(); for (XWPFPictureData picture : allPictures) { String before = append.getRelationId(picture); //将原文档中的图片加入到目标文档中 String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG); map.put(before, after); } appendBody(src1Body, src2Body,map); } private static void appendBody(CTBody src, CTBody append,Map<String,String> map) throws Exception { XmlOptions optionsOuter = new XmlOptions(); optionsOuter.setSaveOuter(); String appendString = append.xmlText(optionsOuter); String srcString = src.xmlText(); String prefix = srcString.substring(0,srcString.indexOf(">")+1); String mainPart = srcString.substring(srcString.indexOf(">")+1,srcString.lastIndexOf("<")); String sufix = srcString.substring( srcString.lastIndexOf("<") ); String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<")); if (map != null && !map.isEmpty()) { //对xml字符串中图片ID进行替换 for (Map.Entry<String, String> set : map.entrySet()) { addPart = addPart.replace(set.getKey(), set.getValue()); } } //将两个文档的xml内容进行拼接 CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix); src.set(makeBody); } }
相关推荐
在“poi实现合并word文档共4页.pdf.zip”这个案例中,我们可以深入探讨如何使用Apache POI库来合并多个Word文档,最终生成一个包含4页内容的新文档。 1. **Apache POI简介** Apache POI是一个开源项目,它提供了...
Java 使用 POI 合并两个 Word 文档 Java 是一种流行的编程语言,POI(Poor Obfuscation Implementation)是一个流行的 Java 库,用于操作 Microsoft Office 文件,包括 Word 文档。合并两个 Word 文档是指将两个...
word合并全家桶,包括横页和竖页兼容合并,里面包含使用文件格式转换,rtf转换为标准的word格式或者其他类型转换,jacob合并word案例及jar包,docx4j合并word案例及jar包,还有poi合并,以及Plutext-Enterprise-3.3.0.6...
### Word文档的拆分与合并技术详解 #### 一、Word文档合并方法 在实际工作中,我们经常会遇到需要将多个Word文档合并成一个文档的情况,比如撰写书籍时每一章作为一个独立文档,在完成所有章节后需要将它们整合...
使用POI,你可以打开并读取Excel或Word文档的内容,包括单元格数据、样式、公式、图表等。例如,读取Excel时,可以创建`Workbook`对象,然后通过`Sheet`和`Row`接口访问数据。 3. **写入文件**: 创建新的文档或...
在Java开发中,有时我们需要将Word文档转换为PDF格式,以满足不同的应用场景或者跨平台兼容的需求。Apache POI是一个流行的库,主要用于处理Microsoft Office格式的文件,如Word(.doc/.docx)和Excel(.xls/.xlsx)...
Apache POI允许我们打开多个Word文档,然后将它们的内容合并到一个新的Word文档中。这需要对Word文档的结构有深入理解,包括段落、表格、页眉和页脚等元素的合并。此外,我们还需要处理文档间的样式一致性,确保合并...
在提供的文件中,`pic.doc`可能是模板中使用的图片资源,`Java创建 word.docx`可能是使用FreeMarker和Apache POI生成的一个示例Word文档,`Java2Word`可能是实现这个功能的相关Java代码。 实际开发中,需要注意以下...
这个"poi-3.71 word 生成工具"指的是使用Apache POI 3.71版本来创建和操作Microsoft Word文档的功能。Apache POI提供了一套API,允许程序员在Java环境中读写MS Office格式的文件,极大地拓展了Java在办公自动化领域...
在这个特定的场景下,"poi可批量生成word"指的是利用Apache POI库来批量生成Word文档。这通常涉及到模板工程,即创建一个基础的Word模板,然后通过编程方式替换模板中的变量或内容,从而快速生成大量结构相似的文件...
此外,由于Apache POI 3.9相对较老,可能不支持某些新特性,因此在处理较新版本的Word文件时,推荐使用更新的POI版本,如4.x或更高版本,以确保兼容性和功能完整性。不过,对于基本的转换任务,POI 3.9版本已经足够...
在Java中,Word转PDF的实现方式通常有两种:一种是利用Jacob将Word文档渲染成图片序列,然后将这些图片合并成PDF;另一种是通过使用支持PDF生成的库,如iText或Apache POI,直接解析Word文档内容并重新构建为PDF格式...
Apache POI是一个流行的开源库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。...通过阅读提供的帮助文档,开发者可以更好地理解和利用POI的功能,从而实现高效的数据操作和转换。
使用Apache POI进行在线生成Word文档,可以实现服务器端无须安装Office软件即可创建动态文档,这对于Web应用、自动化报告系统等场景非常有用。开发者可以通过学习Apache POI的API文档和示例代码,进一步掌握如何高效...
类似地,HWPF(Horrible Word Processor Format)和XWPF(XML Word Processor Format)支持读取Word文档,而HSLF(Horrible Slide Library Format)和XSLF(XML Slide Library Format)则用于处理PowerPoint文件。...
Apache POI包含多个子项目,如HSSF(Horrible Spreadsheet Format)用于处理Excel的BIFF格式(.xls),XSSF(eXtensible Spreadsheet Format)用于处理Excel的XML格式(.xlsx),HWPF(Horrible Word Processor ...
使用POI,我们可以创建`XWPFDocument`对象来表示Word文档,并通过`XWPFParagraph`和`XWPFRun`对象添加文本和图片。 PDF文件的处理则需要用到iText或Apache PDFBox这样的库。这两个库都提供了在PDF文件中添加文本、...
Apache POI 是一个开源项目,专门用于处理微软的Office文档...了解并熟练掌握Apache POI 3.17,能够极大地提升Java开发者处理Office文档的能力,无论是数据导入导出,还是自动化工作流程,都可以借助POI实现高效编程。
在实际开发中,为了提高效率和兼容性,还可以考虑使用其他第三方库,如Apache POI(处理Word文档)、IText(处理PDF文档)、Jsoup(处理HTML文档)等。同时,云服务提供商如Google Cloud或AWS也有提供类似的文档转换...