`
max1487
  • 浏览: 103504 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

poi实现合并word文档,兼容图片的合并

    博客分类:
  • java
阅读更多

问题

       这两天一直在找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);
    }
}

 

 

0
0
分享到:
评论

相关推荐

    poi实现合并word文档共4页.pdf.zip

    在“poi实现合并word文档共4页.pdf.zip”这个案例中,我们可以深入探讨如何使用Apache POI库来合并多个Word文档,最终生成一个包含4页内容的新文档。 1. **Apache POI简介** Apache POI是一个开源项目,它提供了...

    java 使用POI合并两个word文档.docx

    Java 使用 POI 合并两个 Word 文档 Java 是一种流行的编程语言,POI(Poor Obfuscation Implementation)是一个流行的 Java 库,用于操作 Microsoft Office 文件,包括 Word 文档。合并两个 Word 文档是指将两个...

    java实现word合并(poi,jacob,docx4j,plutext)及文件格式转换全家桶

    word合并全家桶,包括横页和竖页兼容合并,里面包含使用文件格式转换,rtf转换为标准的word格式或者其他类型转换,jacob合并word案例及jar包,docx4j合并word案例及jar包,还有poi合并,以及Plutext-Enterprise-3.3.0.6...

    Word文档的拆分合并

    ### Word文档的拆分与合并技术详解 #### 一、Word文档合并方法 在实际工作中,我们经常会遇到需要将多个Word文档合并成一个文档的情况,比如撰写书籍时每一章作为一个独立文档,在完成所有章节后需要将它们整合...

    POI中文帮助文档_POI_

    使用POI,你可以打开并读取Excel或Word文档的内容,包括单元格数据、样式、公式、图表等。例如,读取Excel时,可以创建`Workbook`对象,然后通过`Sheet`和`Row`接口访问数据。 3. **写入文件**: 创建新的文档或...

    JAVA利用poi完成word转pdf,内容包括两个现成工具类和使用到的所有jar包

    在Java开发中,有时我们需要将Word文档转换为PDF格式,以满足不同的应用场景或者跨平台兼容的需求。Apache POI是一个流行的库,主要用于处理Microsoft Office格式的文件,如Word(.doc/.docx)和Excel(.xls/.xlsx)...

    富文本html转word,word文件合并.zip

    Apache POI允许我们打开多个Word文档,然后将它们的内容合并到一个新的Word文档中。这需要对Word文档的结构有深入理解,包括段落、表格、页眉和页脚等元素的合并。此外,我们还需要处理文档间的样式一致性,确保合并...

    freemaker 生成word文档

    在提供的文件中,`pic.doc`可能是模板中使用的图片资源,`Java创建 word.docx`可能是使用FreeMarker和Apache POI生成的一个示例Word文档,`Java2Word`可能是实现这个功能的相关Java代码。 实际开发中,需要注意以下...

    poi-3.71 word 生成工具

    这个"poi-3.71 word 生成工具"指的是使用Apache POI 3.71版本来创建和操作Microsoft Word文档的功能。Apache POI提供了一套API,允许程序员在Java环境中读写MS Office格式的文件,极大地拓展了Java在办公自动化领域...

    poi可批量生成word

    在这个特定的场景下,"poi可批量生成word"指的是利用Apache POI库来批量生成Word文档。这通常涉及到模板工程,即创建一个基础的Word模板,然后通过编程方式替换模板中的变量或内容,从而快速生成大量结构相似的文件...

    java word转html poi3.9

    此外,由于Apache POI 3.9相对较老,可能不支持某些新特性,因此在处理较新版本的Word文件时,推荐使用更新的POI版本,如4.x或更高版本,以确保兼容性和功能完整性。不过,对于基本的转换任务,POI 3.9版本已经足够...

    java将word转图片转pdf_jacob.zip

    在Java中,Word转PDF的实现方式通常有两种:一种是利用Jacob将Word文档渲染成图片序列,然后将这些图片合并成PDF;另一种是通过使用支持PDF生成的库,如iText或Apache POI,直接解析Word文档内容并重新构建为PDF格式...

    POI帮助文档及解析office文档时需要的jar包

    Apache POI是一个流行的开源库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。...通过阅读提供的帮助文档,开发者可以更好地理解和利用POI的功能,从而实现高效的数据操作和转换。

    poi4.1.zip

    使用Apache POI进行在线生成Word文档,可以实现服务器端无须安装Office软件即可创建动态文档,这对于Web应用、自动化报告系统等场景非常有用。开发者可以通过学习Apache POI的API文档和示例代码,进一步掌握如何高效...

    Apache POI资源包

    类似地,HWPF(Horrible Word Processor Format)和XWPF(XML Word Processor Format)支持读取Word文档,而HSLF(Horrible Slide Library Format)和XSLF(XML Slide Library Format)则用于处理PowerPoint文件。...

    poi-3.8组件

    Apache POI包含多个子项目,如HSSF(Horrible Spreadsheet Format)用于处理Excel的BIFF格式(.xls),XSSF(eXtensible Spreadsheet Format)用于处理Excel的XML格式(.xlsx),HWPF(Horrible Word Processor ...

    使用java将多种类型的文件如Word、PDF、JPG汇总到一个文档中(Word或者PDF)

    使用POI,我们可以创建`XWPFDocument`对象来表示Word文档,并通过`XWPFParagraph`和`XWPFRun`对象添加文本和图片。 PDF文件的处理则需要用到iText或Apache PDFBox这样的库。这两个库都提供了在PDF文件中添加文本、...

    poi-3.17开发用所有jar包

    Apache POI 是一个开源项目,专门用于处理微软的Office文档...了解并熟练掌握Apache POI 3.17,能够极大地提升Java开发者处理Office文档的能力,无论是数据导入导出,还是自动化工作流程,都可以借助POI实现高效编程。

    pdf转图片并合成一张图片输出,图片转pdf,word转html,word转pdf

    在实际开发中,为了提高效率和兼容性,还可以考虑使用其他第三方库,如Apache POI(处理Word文档)、IText(处理PDF文档)、Jsoup(处理HTML文档)等。同时,云服务提供商如Google Cloud或AWS也有提供类似的文档转换...

Global site tag (gtag.js) - Google Analytics