42

我一直在玩 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;
        }
    }
}

我试图玩转在PDFStreamEngine类的processEncodedText方法中处理的 PDGraphicsState 对象,但在那里没有找到行的信息。

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

4

5 回答 5

5

这是我到目前为止发现的:

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

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

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

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

PDFTextStripper下_

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

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

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

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

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

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

现在这意味着阅读 PDF 文件规范,这是目前很多工作的方式。

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

于 2012-12-28T08:38:11.607 回答
2

正如您所提到的——PDFBox 使用资源文件,将 PDF 运算符/说明绑定到将处理信息的访问者。

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

我很久以前的 PostScript 经验回忆起 'moveto' 和 'lineto' 运算符。由于 PDF 大致基于 PS,因此您将寻找类似的东西。

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

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

但是,您可以完成您的要求——如果您愿意投入 12 个多小时的工作。除了按位置检测外,下划线通常会在 PDF 中的文本之后立即发出......所以您可以锁定您通过 PDF 文档顺序进行检测,而不仅仅是页面位置。

另外,尝试用带下划线的文本构建一个简单的两行 PDF。然后看看你能做什么,把它解析回来!下划线应该像狗的香蕉一样突出,一旦你能察觉到这一点,你就会顺利上路。

PDFBox的可扩展性不是很好,主要是一堆算法。出于这个原因,只需从那里复制 PDFTextStripper 源(并且可能有 PageDrawer 供参考)和原型。

希望这可以帮助!

于 2013-03-02T02:01:41.210 回答
1

您可以使用 Itext 生成 pdf 报告。

通过使用 itext,您可以轻松地放置线条。

尝试以下。

document.add(new LineSeparator(0.5f, 50, null, 0, 198));

上面的代码用于生成 pdf 报告中的行。并根据您的选择设置尺寸。

希望这会帮助你。

于 2013-02-28T07:59:39.827 回答
1

据我了解pdfbox,没有选项可以阅读下划线。也许您可以为此尝试 itextpdf 。

于 2013-03-01T07:57:20.373 回答
-3

根据 api getfont()返回的字体大小。

您可以使用getStyle()方法,它将返回STYLE_UNDERLINE带下划线的字体。因此,您可以检索下划线样式。

于 2012-12-26T21:25:43.370 回答