PDF 查找文本是否带有下划线或表格单元格

2022-09-01 02:11:33

我一直在玩PdfBox和PDFTextStripperByArea方法。

如果文本是粗体斜体,我能够提取信息,但我无法获得下划线信息。

据我所知,在PDF中,下划线是通过绘制线条来完成的。因此,从理论上讲,我应该能够获得有关文本周围某处的行的某种信息。提供这些信息,然后我可以找出文本是带下划线还是在表格中。

这是我到目前为止的代码:

List<TextPosition> textPos = charactersByArticle.get(index);

for (TextPosition t : textPos)
{               
    if (t.getFont().getFontDescriptor() != null)
    {                           
        if (t.getFont().getFontDescriptor().getFontWeight() > BOLD_WEIGHT ||
            t.getFont().getFontDescriptor().isForceBold())
        {
            isBold = true;
        }

        if (t.getFont().getFontDescriptor().isItalic())
        {
            isItalic = true;
        }
    }
}

我试图绕过PDGraphicsState对象,该对象在PDFStreamEngine类的processEncodedText方法中处理,但没有找到行的信息。

可以从中检索此信息的任何建议?


答案 1

以下是我迄今为止的发现:

PDFBox使用资源文件将PDF运算符/指令绑定到某些类,然后处理信息。

如果我们看一下 PDFTextStripper.properties 资源文件,下面是:

pdfbox\src\main\resources\org\apache\pdfbox\resources\

例如,我们可以看到BT运算符绑定到org.apache.pdfbox.util.operator.BeginText类等等。

PDFTextStripper under

pdfbox\src\main\java\org\apache\pdfbox\util\

考虑到这一点,并利用此类处理PDF。

但是所有图形对象都被忽略,因此没有下划线或表格结构的信息!

现在,如果我们看一下PageDrawer.properties资源文件,我们可以看到这个资源文件几乎绑定到所有可用的运算符。它由PageDrawer类在

pdfbox\src\main\java\org\apache\pdfbox\pdfviewer\

现在的“诀窍”是找出哪些图形运算符是那些表示下划线和表格的运算符,并将它们与PDFTextStripper结合使用。

现在,这意味着阅读PDF文件规范,目前需要做很多工作。

如果有人知道哪些操作员负责绘制下划线和表格线的操作,请告诉我。


答案 2

正如你所提到的 - PDFBox使用资源文件,将PDF运算符/指令绑定到将处理信息的访问者。

您可能最好先将PDFBox的现有访问者复制到您自己的源文件夹中,然后从那里添加/扩展实现。

我很久以前的 PostScript 经历让人想起“moveto”和“lineto”运算符。由于PDF大致是基于PS的,因此您将寻找类似的东西。

http://learnpostscript.wordpress.com/category/lineto/

PDF格式是一个b*tch - 它是HTML,做错了。它表示图形实现,而不是语义。即使重构句子也很困难 - 单词甚至单个字符被定位,“空格”或“换行符”必须通过算法重构。简而言之,Adobe是一个*洞。Reader是一头不符合人体工程学的,充满虫子,不安全,臃肿的猪。

但是,你可以完成你的要求 - 如果你愿意投入,比如说,12个以上的工作时间。除了按位置检测外,下划线通常会在 PDF 中紧跟在文本之后发出。因此,您可以通过PDF文档顺序锁定检测,而不仅仅是页面位置。

此外,请尝试使用带下划线的文本构建简单的两行 PDF。然后看看你能用它做什么,把它解析回来!下划线应该像狗的香蕉一样突出,一旦你能检测到这一点,你就会很好地前进。

PDFBox对于可扩展性不是很好,它主要只是一大堆算法。出于这个原因,只需从那里复制PDFTextStripper源代码(也许有PageDrawer供参考)和原型。

希望这有帮助!


推荐