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