我正在尝试将 pdf(我最喜欢的书 Effective Java,如果重要的话)转换为文本,我检查了 iText 和 Apache PdfBox。我看到性能上的巨大差异:使用 iText 需要 2:521,使用 PdfBox:6:117。 如果我的 PdfBOx 代码
PDFTextStripper stripper = new PDFTextStripper();
BUFFER.append(stripper.getText(PDDocument.load(pdf)));
这是给 iText 的
PdfReader reader = new PdfReader(pdf);
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
BUFFER.append(PdfTextExtractor.getTextFromPage(reader, i));
}
我的问题是性能取决于什么,有没有办法让 PdfBox 更快?或者只使用 iText?你能解释更多关于策略如何影响绩效的信息吗?
我的问题是性能取决于什么,有没有办法让 PdfBox 更快?
一个主要区别是 PDFBox 总是逐个字形处理文本字形,而 iText 通常逐块处理它(即文本绘制操作的单个字符串参数);这大大减少了 iText 中所需的资源。此外,iText 文本解析的面向事件的架构意味着比 PDFBox 的资源负担更低。并且 PDFBox 保留纯文本提取不严格需要的信息的可用时间更长,从而消耗更多资源。
但是库最初加载文档的方式也可能有所不同。在这里您可以尝试一下,PDFBox 不仅提供多个
PDDocument.load
重载,还提供一些 PDDocument.loadNonSeq
重载(实际上 PDDocument.loadNonSeq
可以正确读取文档,而 PDDocument.load
可以被欺骗以误解 PDF)。所有这些不同的变体可能具有不同的运行时行为。
更多关于战略如何影响绩效的信息?
iText 带来了简单和更高级的文本提取策略。简单的假定页面内容流中的文本按阅读顺序出现,而更高级的假定排序。默认情况下使用更高级的。因此,您可能可以通过使用简单策略进一步加快 iText 的速度。 PDFBox 总是排序。
在 PDFBox - 版本 2.0.12 中,他们将 PDFunctionType3.eval() 优化了 30%,降低了 COSOutputStream 的 RAM 要求,并在合并文件时删除了中间流。所有这些信息都在他们的发行说明中提供。请参阅以下链接以获取更多信息: