有没有办法在使用PDFBox提取PDF时保留文本格式?
我有一个解析PDF文档的程序以获取信息 . 当发布新版本的PDF时,作者使用粗体或斜体文本来表示新信息,并使用Strike through或underlined来指示省略的文本 . 使用PDFbox中的基础剥离器类会返回所有文本,但格式化将被删除,因此我无法确定文本是新的还是省略 . 我目前正在使用下面的项目示例代码:
Dim doc As PDDocument = Nothing
Try
doc = PDDocument.load(RFPFilePath)
Dim stripper As New PDFTextStripper()
stripper.setAddMoreFormatting(True)
stripper.setSortByPosition(True)
rtxt_DocumentViewer.Text = stripper.getText(doc)
Finally
If doc IsNot Nothing Then
doc.close()
End If
End Try
如果我只是将PDF文本复制并粘贴到保存格式的richtextbox中,我的解析代码就可以正常工作 . 我打算通过打开PDF,选择全部,复制,关闭文档然后将其粘贴到我的richtextbox中,以编程方式执行此操作,但这看起来很笨重 .
1 回答
正如OP在一个Java示例所做的评论中提到的那样,我还只使用了JavaBox和Java,这个答案就是一个Java示例 . 此外,此示例仅使用PDFBox版本1.8.11进行开发和测试 .
自定义文本剥离器
正如评论中已经提到的,
这是一个扩展
PDFTextStripper
的示例类,如下所示:(PDFStyledTextStripper.java)
除了
PDFTextStripper
所做的,这个类也使用
AppendRectangleToPath
运算符处理器内部类的实例从内容(使用 re 指令定义)收集矩形,检查
determineStyle
中样本文档中样式变体的文本,以及每当样式发生变化时,将新样式添加到
writeString
中的结果中 .Beware: 这仅仅是一个概念证明!特别是
TransformedRectangle.underlines(TextPosition)和TransformedRectangle#strikesThrough(TextPosition)中的测试实现非常简单,仅适用于没有页面旋转的水平文本和水平矩形strikeThroughs和下划线,左下角为p0,右上角为p2 ;
收集所有矩形,而不检查它们是否实际上充满了可见颜色;
"bold"和"italic"的测试只是检查所用字体的名称,这通常是不够的 .
测试输出
像这样使用
PDFStyledTextStripper
(来自ExtractText.java,从测试方法调用
testExtractStyledFromExampleDocument
)一个得到结果
对于OP的样本文档
PS 同时
PDFStyledTextStripper
的代码略有改变,也适用于github问题中共享的示例文档,特别是其内部类的代码TransformedRectangle
,cf . here .