Java Apache POI无法保存(HWPFDocument.write)大型word文档文件

Java Apache POI无法保存(HWPFDocument.write)大型word文档文件,java,ms-word,apache-poi,doc,Java,Ms Word,Apache Poi,Doc,我想从.doc文件中删除word元数据。My.docx文件可以与XWPFDocument配合使用,但以下用于删除元数据的代码无法用于大型(>1MB)文件。例如,使用带有图像的6MB.doc文件,它输出一个4.5MB文件,其中一些图像被删除 public static InputStream removeMetaData(InputStream inputStream) throws IOException { POIFSFileSystem fss = new POIFSFileSyst

我想从.doc文件中删除word元数据。My
.docx
文件可以与
XWPFDocument
配合使用,但以下用于删除元数据的代码无法用于大型(>1MB)文件。例如,使用带有图像的6MB.doc文件,它输出一个4.5MB文件,其中一些图像被删除

public static InputStream removeMetaData(InputStream inputStream) throws IOException {
    POIFSFileSystem fss = new POIFSFileSystem(inputStream);
    HWPFDocument doc = new HWPFDocument(fss);

    // **it even fails on large files if you remove from here to 'until' below**
    SummaryInformation si = doc.getSummaryInformation();
    si.removeAuthor();
    si.removeComments();
    si.removeLastAuthor();
    si.removeKeywords();
    si.removeSubject();
    si.removeTitle();

    doc.getDocumentSummaryInformation().removeCategory();
    doc.getDocumentSummaryInformation().removeCompany();
    doc.getDocumentSummaryInformation().removeManager();
    try {
        doc.getDocumentSummaryInformation().removeCustomProperties();
    } catch (Exception e) {
        // can not remove above
    }
    // until

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    doc.write(os);
    os.flush();
    os.close();
    return new ByteArrayInputStream(os.toByteArray());
}
相关职位:


您使用的是哪个版本的Apache POI

这似乎是最重要的

请升级到,然后重试


希望对您有所帮助。

您使用的是哪个版本的Apache POI

这似乎是最重要的

请升级到,然后重试


希望能有帮助。

老实说,我不理解你的问题。问题是,您有一些异常,还是您有太大的输出文件=>要删除的内容仍然存在?元数据已正确删除,但给定一个6mb的文件,其中包含表格、页脚、页眉和图像,poi将输出一个~4.5mb的文件,其中删除了元数据,但也删除了一些随机图像。如果删除了随机图像(每次调用都会删除其他内容),则它必须是线程问题,或者是一个传递不正确的outofmemoryerror(例如)。如果在单个线程中运行线程问题,则可以检查线程问题,然后它可以正常工作。Outofmemory错误可以通过制动点找到。我建议以调试模式运行代码,并设置异常制动点(捕获和取消锁定)捕捉错误和运行时异常。也许你会发现一些有趣的事情。如果你可以上传一个示例文档文件,以及你的JVM参数和JVM类型,POI版本,我们可以做更多。下面是一个示例文件,其中一些图像被删除。老实说,我不明白你的问题。问题是,你有一些异常,还是你有一些异常太大的输出文件=>仍保留一些要删除的内容?元数据已正确删除,但给定一个6mb的文件,其中包含表、页脚、页眉和图像,poi将输出一个~4.5mb的文件,其中删除了元数据,但也删除了一些随机图像。如果删除了随机图像(每次调用都会删除其他内容),则它必须是线程问题,或者是一个传递不正确的outofmemoryerror(例如)。如果在单个线程中运行线程问题,则可以检查线程问题,然后它可以正常工作。Outofmemory错误可以通过制动点找到。我建议以调试模式运行代码,并设置异常制动点(捕获和取消锁定)捕捉错误和运行时异常。也许你会发现一些有趣的东西。如果你可以上传一个示例文档文件,以及你的JVM参数和JVM类型,POI版本,我们可以做更多。下面是一个示例文件,其中一些图像被删除。我使用了POI 3.8和最新的夜间版本。两者都有错误。然后,这是另一个错误,或者是回归:/I我使用了poi 3.8和最新的夜间版本。两者都有缺陷。然后,它是另一个缺陷,或者回归的回归:/