PDF查明文本是带下划线还是表格单元格
我一直在玩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对象,但没有在其中find行的信息。
任何build议,这些信息可以从中检索?
这是我迄今发现的:
PDFBox使用资源文件将PDF操作符/指令绑定到某些类,然后处理这些信息。
如果我们看看下面的PDFTextStripper.properties资源文件:
PDFBOX的\ src \主\资源\组织\阿帕奇\ PDFBOX \资源\
我们可以看到,例如,BT运算符绑定到org.apache.pdfbox.util.operator.BeginText类等等。
下的PDFTextStripper
PDFBOX的\ src \主\ java的\组织\阿帕奇\ PDFBOX \ UTIL \
考虑到这一点,并利用这个类的PDF处理。
但所有graphics对象都被忽略,因此没有下划线或表格结构的信息!
现在,如果我们看一下PageDrawer.properties资源文件,我们可以看到这个界面几乎包含了所有可用的操作符。 下面是PageDrawer类所使用的
PDFBOX的\ src \主\ java的\组织\阿帕奇\ PDFBOX \ PDF查看器\
“技巧”现在是找出哪些graphics操作符是代表下划线和表格的graphics操作符,并将它们与PDFTextStripper结合使用。
现在这意味着阅读PDF文件规范,这是目前的工作方式。
如果有人知道哪些操作员负责哪些操作来绘制下划线和表格线,请让我知道。
你可以使用Itext来生成pdf报告。
通过使用itext你可以很容易地把线条。
试试看。
document.add(new LineSeparator(0.5f,50,null,0,198));
上面的代码用于在pdf报告中生成行。 并根据您的select设置尺寸。
希望这会帮助你。
就我所了解的pdfbox而言,没有哪个选项可以读取下划线。 也许你可以为此目的尝试itextpdf。
正如您所说 – PDFBox使用资源文件,将PDF操作员/指令绑定到将处理信息的访问者。
您可能最好先将PDFBox的现有访问者复制到您自己的源文件夹中,然后从那里添加/扩展实现。
我很久以前的PostScript经历让人想起“moveto”和“lineto”操作符。 由于PDF大致是基于PS的,所以你会寻找类似的东西。
http://learnpostscript.wordpress.com/category/lineto/
PDF格式是ab * tch – 这是HTML,做错了。 它代表graphics实现,而不是语义。 即使重构句子也很困难 – 单词甚至单个的字符都被定位,“空格”或“换行”必须在algorithm上被重构。 总之,Adobe是一个*漏洞。 读者是一个非人体工程学,错误的,不安全,臃肿的猪。
但是,您可以完成您的要求 – 如果您愿意投入12个小时以上的工作。除了位置检测外,下划线通常会在文本之后立即以PDFforms发出..因此,您可以locking您的PDF文档顺序检测,而不仅仅是页面位置。
另外,尝试构build一个带有下划线的文本的简单的两行PDF。 然后看看你能做些什么,把它parsing回来! 下划线应该像狗的香蕉一样突出,一旦你发现,你就会顺利的。
PDFBox不是很好的可扩展性,它主要是一大堆algorithm。 出于这个原因,只需复制PDFTextStripper源(也许有PageDrawer作为参考)和原型。
希望这可以帮助!
根据api getfont()返回字体大小。
您可以使用getStyle()方法,它将返回STYLE_UNDERLINE
下划线字体。 因此你可以检索下划线样式。