【发布时间】:2012-11-05 13:31:06
【问题描述】:
我想从 .doc 文件中删除单词元数据。我的.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());
}
相关帖子:
【问题讨论】:
-
说实话,我不明白你的问题。是问题,你有一些例外,还是你有太大的输出文件=>还有一些要删除的东西?
-
元数据被正确删除,但是给定一个包含表格、页脚、页眉和图像的 6mb 文件,poi 输出一个 ~4.5mb 的文件,其中删除了元数据,但也删除了一些随机图像。
-
如果随机图像被删除(每次调用都会删除其他内容),那么它一定是线程问题,或者例如处理不当的内存不足错误。如果您在单个线程中运行它,则可以检查线程问题,然后它可以正常工作。可以通过刹车点找到内存不足错误。我建议以调试模式运行代码,并设置异常刹车点(捕获和未捕获)以捕获错误和 RuntimeExceptions。也许你会发现一些有趣的东西。
-
如果您可以上传一个示例文档文件,以及您的 JVM 参数和 JVM 类型、POI 版本,我们可以做得更多。
-
这是一个示例文件,其中一些图像被删除。 docs.google.com/open?id=0B04nNVcbjeicenliLW5zSElSdk0
标签: java ms-word apache-poi doc