Java Apache POI无法保存(HWPFDocument.write)大型word文档文件
我想从.doc文件中删除word元数据。MyJava 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
.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 这似乎是最重要的 请升级到,然后重试
希望能有帮助。老实说,我不理解你的问题。问题是,您有一些异常,还是您有太大的输出文件=>要删除的内容仍然存在?元数据已正确删除,但给定一个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和最新的夜间版本。两者都有缺陷。然后,它是另一个缺陷,或者回归的回归:/