【发布时间】:2014-10-13 10:24:25
【问题描述】:
我有一个 PDF,我使用 PDFBox 从中提取了一个页面:
(...)
File input = new File("C:\\temp\\sample.pdf");
document = PDDocument.load(input);
List allPages = document.getDocumentCatalog().getAllPages();
PDPage page = (PDPage) allPages.get(2);
PDStream contents = page.getContents();
if (contents != null) {
System.out.println(contents.getInputStreamAsString());
(...)
这会根据PDF spec 给出以下结果,看起来就像您所期望的那样。
q
/GS0 gs
/Fm0 Do
Q
/Span <</Lang (en-US)/MCID 88 >>BDC
BT
/CS0 cs 0 0 0 scn
/GS1 gs
/T1_0 1 Tf
8.5 0 0 8.5 70.8661 576 Tm
(This page has been intentionally left blank.)Tj
ET
EMC
1 1 1 scn
/GS0 gs
22.677 761.102 28.346 32.599 re
f
/Span <</Lang (en-US)/MCID 89 >>BDC
BT
0.531 0.53 0.528 scn
/T1_1 1 Tf
9 0 0 9 45.7136 761.1024 Tm
(2)Tj
ET
EMC
q
0 g
/Fm1 Do
Q
我正在寻找的是将页面上的 PDF TextObjects(如 PDF 规范的第 5.3 节所述)提取为 java 对象,所以基本上是 BT 和 ET 之间的部分(本页上的两个) . 它们至少应包含“Tj”之前的括号之间的所有内容作为字符串,以及基于“Tm”(或“Td”运算符等)的 x 和 y 坐标。其他属性将是一个奖励,但不是必需的。
PDFTextStripper 似乎给了我每个具有属性的字符作为 TextPosition(对我的目的来说噪音太大),或者所有的 Text 作为一个长字符串。
PDFBox 是否具有解析页面并提供我错过的此类 TextObjects 的功能?或者,如果我要扩展 PDFBox 以获得我需要的东西,我应该从哪里开始?欢迎任何帮助。
编辑:发现另一个问题here,这为我如何构建我需要的东西提供了灵感。如果我成功了,我会回来检查的。不过,仍然期待您的任何帮助。
谢谢,
菲尔
【问题讨论】:
-
使用 PDFBox 获得的最佳效果是 PDFStreamParser 返回的令牌。不完全是文本对象,而是可以从中隔离文本对象的操作集合。