我一直在玩PdfBox和PDFTextStripperByArea方法 .
如果文本是 bold 或斜体,我能够提取信息,但我无法获得下划线信息 .
据我所知,在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方法中处理,但没有在那里找到行的信息 .
有关可以从中检索此信息的任何建议吗?
5 回答
这是我到目前为止发现的:
PDFBox使用资源文件将PDF操作符/指令绑定到某些类,然后这些类处理信息 .
如果我们看一下下面的 PDFTextStripper.properties 资源文件:
我们可以看到,例如BT运算符绑定到 org.apache.pdfbox.util.operator.BeginText 类,依此类推 .
PDFTextStripper 下
将此考虑在内并利用此类的PDF处理 .
BUT all graphical objects are ignored, therefore no information of underline or table structure!
现在,如果我们看一下PageDrawer.properties资源文件,我们可以看到这个几乎所有可用的运算符 . 哪个是 PageDrawer 类所使用的
"trick"现在要找出哪些图形运算符代表下划线和表格,并将它们与 PDFTextStripper 结合使用 .
现在这意味着要阅读PDF文件规范,这是目前的工作方式 .
如果有人知道哪些操作员负责绘制下划线和表格行的操作,请告诉我 .
您可以使用Itext生成pdf报告 .
通过使用itext,您可以轻松地放置线条 .
尝试以下 .
document.add(new LineSeparator(0.5f, 50, null, 0, 198));
上面的代码用于在pdf报告中生成行 . 并根据您的选择设置尺寸 .
希望这会帮助你 .
据我所知,pdfbox没有选项可以读取下划线 . 也许你可以为此目的尝试itextpdf .
如您所述 - PDFBox使用资源文件,将PDF操作符/指令绑定到将处理信息的访问者 .
您最好将PDFBox的现有访问者复制到您自己的源文件夹中,然后从那里添加/扩展实现 .
我很久以前的PostScript体验让我们回想起'moveto'和'lineto'运营商 . 由于PDF大致基于PS,因此您将寻找类似的东西 .
http://learnpostscript.wordpress.com/category/lineto/
PDF格式是b * tch - 它是HTML,做错了 . 它表示图形实现,而不是语义 . 即使重建句子也很困难 - 单词或甚至单个字符的位置,'空格'或'换行符'必须在算法上重建 . 简而言之,Adobe是一个*漏洞 . 读者是一种非符合人体工程学,虫蛀,不安全,臃肿的猪 .
但是,您可以完成您的要求 - 如果您愿意将12个小时的工作放入其中 . 除了按位置检测外,通常会在文本后立即在PDF中发出下划线 . 所以您可以锁定您的通过PDF文档顺序检测,而不仅仅是页面位置 .
另外,尝试使用带下划线的文本构建一个简单的两行PDF . 然后看看你能做些什么,然后解析它!下划线应该像狗的香蕉一样突出,一旦你能够发现它,你就会很顺利 .
PDFBox不是很好的可扩展性,它主要只是一大堆算法 . 出于这个原因,只需复制PDFTextStripper源(并可能有PageDrawer作为参考)和原型 .
希望这可以帮助!
根据api getfont()返回字体大小 .
您可以使用getStyle()方法,它将为带下划线的字体返回
STYLE_UNDERLINE
. 因此,您可以检索下划线样式 .