【问题标题】:Is there any java library (maybe poi?) which allows to merge docx files? [closed]是否有任何允许合并 docx 文件的 java 库(可能是 poi?)? [关闭]
【发布时间】:2010-03-22 17:55:22
【问题描述】:

我需要编写一个可以合并 docx 文件的 java 应用程序。有什么建议吗?

【问题讨论】:

  • “合并”是指某种简单的连接吗?或者更高级的东西?困难是合并部分还是 docx(而不是 doc)部分?
  • Merge 的结果应该和我们在 MS Office 中手动打开第一个文档一样,按 Ctrl+C,然后打开第二个文档,转到其末尾并按 Ctrl+V。

标签: java docx


【解决方案1】:

使用 POI,我的解决方案是:

public static void merge(InputStream src1, InputStream src2, OutputStream dest) throws Exception {
    OPCPackage src1Package = OPCPackage.open(src1);
    OPCPackage src2Package = OPCPackage.open(src2);
    XWPFDocument src1Document = new XWPFDocument(src1Package);        
    CTBody src1Body = src1Document.getDocument().getBody();
    XWPFDocument src2Document = new XWPFDocument(src2Package);
    CTBody src2Body = src2Document.getDocument().getBody();        
    appendBody(src1Body, src2Body);
    src1Document.write(dest);
}

private static void appendBody(CTBody src, CTBody append) 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("<"));
    CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix);
    src.set(makeBody);
}

使用 Docx4j 我的解决方案是:

public class MergeDocx {
    private static long chunk = 0;
    private static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

    public void mergeDocx(InputStream s1, InputStream s2, OutputStream os) throws Exception {
        WordprocessingMLPackage target = WordprocessingMLPackage.load(s1);
        insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(s2));
        SaveToZipFile saver = new SaveToZipFile(target);
        saver.save(os);
    }

    private static void insertDocx(MainDocumentPart main, byte[] bytes) throws Exception {
            AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(new PartName("/part" + (chunk++) + ".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);
    }
}

【讨论】:

  • 感谢您的回答,您的 Poi 代码对我有用,但在我的情况下,我还需要合并 .doc 文件,因此我必须使用 org.apache.poi.hwpf.HWPFDocument。因此,通过遵循您的 docx 代码,我想从 .doc 文件中获取 xml 格式,但我没有找到办法。任何想法将不胜感激:)
  • 这非常有效。谢谢!
  • @atott POI 代码对我有用,但如果附加文档有图像,则在合并图像后不存在,其余所有文本以精确格式合并。
  • 该解决方案仅在添加以下依赖项后才对我有效:poi:3.11、poi-ooxml:3.11、ooxml-schemas:1.1。无法使用较新版本的 poi 库。
  • 工作,但有没有办法在每个部分之间添加分页符?
【解决方案2】:

以下 Java API 可用于使用 Java 处理 OpenXML MS Word 文档:

还有一个,但我不记得名字了。

至于您的功能要求:合并两个文档在技术上很难达到最终用户所期望的结果。大多数 API 不允许这样做。您需要从两个文档中提取所需的信息,然后根据这些信息自己创建一个新文档。

【讨论】:

【解决方案3】:

看起来 POI 确实可以处理 docx 文件。您是否想弄清楚如何合并它们?

How to extract plain text from a DOCX file using the new OOXML support in Apache POI 3.5?

【讨论】:

    【解决方案4】:

    到目前为止,Aspose API 是合并 word doc 或 docx 文件的最佳选择,但它不是免费或开源的,如果您需要免费和开源的工具,有几个 API 可供您选择,您可以找到在这里对它们进行评论,

    http://www.esupu.com/open-source-office-document-java-api-review/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多