我想从PDF文件中提取表格数据, 我正在使用Itext但我不明白如何搜索dablur数据,(分裂) 任何人都可以提供与搜索表格内容相关的想法。这些数据是无序格式,如何将数据转换为可理解的格式。 提前谢谢。
答案 0 :(得分:0)
获取页面内容并扫描MoveTo(x,y)(tm
)和文本(tj
)命令。
另外,字体更改(tf
)(如标记粗体字)可能会拆分文本。
final String NUM = "\\d*\\.?\\d+";
Pattern tj = Pattern.compile(".*\\((.*)\\) Tj");
Pattern tm = Pattern.compile("\\d+ \\d+ \\d+ \\d+ ("
+ NUM + ") (" + NUM + ") Tm");
Pattern tf = Pattern.compile("/(F\\d+) (" + NUM + ") Tf");
byte[] pageContent = pdfReader.getPageContent(pageno);
String pc = new String(pageContent, "Cp1252");
try (BufferedReader pin = new BufferedReader(new StringReader(pc))) {
for (;;) {
String cline = pin.readLine();
if (cline == null) {
break;
}
Matcher m = tm.matcher(cline);
if (m.matches()) {
请注意,可能不会出现一小部分(.123),因此简单的Double.parseDouble(m.group(1))
是不够的。
如何运作
在“页面匹配”的上方,您可以获得创建页面的PostScript命令行: 选择一种字体,移动到(x,y),打印一些字符。
暂且不说:这些命令采用所谓的后缀表示法:100.0 200.0 Tm
(移动到x:100,y:200)。第一个参数,然后是命令。对于堆栈机器处理全部。因此名称为“PostScript。”
如果你得到两个相同y的移动命令,那么你就在同一条线上。 选择另一种字体,例如单词变为粗体,或者您在表格中。
你可以想象,分析PDF是一项有趣的编程工作。我已经羡慕你了。
Java 7:
try (BufferedReader pin = new BufferedReader(new StringReader(pc))) {
...
}
Java 6:
BufferedReader pin = new BufferedReader(new StringReader(pc));
try {
...
} finally {
pin.close();
}