使用 PDFBox 解析 PDF 文件(尤其是表格)

2022-08-31 12:55:26

我需要解析包含表格数据的PDF文件。我正在使用PDFBox提取文件文本,以便稍后解析结果(字符串)。问题是文本提取无法像我预期的那样为表格数据工作。例如,我有一个文件,其中包含这样的表(7列:前两列始终有数据,只有一个复杂性列有数据,只有一个融资列有数据):

+----------------------------------------------------------------+
| AIH | Value | Complexity                     | Financing       |
|     |       | Medium | High | Not applicable | MAC/Other | FAE |
+----------------------------------------------------------------+
| xyz | 12.43 | 12.34  |      |                | 12.34     |     |
+----------------------------------------------------------------+
| abc | 1.56  |        | 1.56 |                |           | 1.56|
+----------------------------------------------------------------+

然后我使用PDFBox:

PDDocument document = PDDocument.load(pathToFile);
PDFTextStripper s = new PDFTextStripper();
String content = s.getText(document);

这两行数据将按如下方式提取:

xyz 12.43 12.4312.43
abc 1.56 1.561.56

最后两个数字之间没有空格,但这不是最大的问题。问题是我不知道最后两个数字是什么意思:中,高,不适用?MAC/Other, FAE?我没有数字和列之间的关系。

我不需要使用PDFBox库,因此使用另一个库的解决方案很好。我想要的是能够解析文件并知道每个解析的数字的含义。


答案 1

您需要设计一种算法来以可用格式提取数据。无论您使用哪个PDF库,您都需要这样做。字符和图形由一系列有状态绘制操作绘制,即移动到屏幕上的此位置并绘制字符“c”的字形。

我建议您扩展并重写该方法。从那里,您可以截获水平和垂直线段的绘制操作,并使用该信息来确定表的列和行位置。然后,只需设置文本区域并确定在哪个区域绘制哪些数字/字母/字符即可。由于您知道区域的布局,因此您将能够分辨提取的文本属于哪一列。org.apache.pdfbox.pdfviewer.PDFPageDrawerstrokePath

此外,在视觉上分隔的文本之间可能没有空格的原因是,PDF 通常不会绘制空格字符。相反,文本矩阵被更新,并发出“move”的绘制命令,以绘制下一个字符和一个“空间宽度”,而不是最后一个字符。

祝你好运。


答案 2

您可以在PDFBox中按区域提取文本。如果使用的是 Maven,请参阅项目中的示例文件。代码段如下所示ExtractByArea.javapdfbox-examples

   PDFTextStripperByArea stripper = new PDFTextStripperByArea();
   stripper.setSortByPosition( true );
   Rectangle rect = new Rectangle( 464, 59, 55, 5);
   stripper.addRegion( "class1", rect );
   stripper.extractRegions( page );
   String string = stripper.getTextForRegion( "class1" );

问题首先是获取坐标。我已经成功地扩展了正常,覆盖和打印出每个字符的坐标,并弄清楚它们在文档中的位置。TextStripperprocessTextPosition(TextPosition text)

但是有一种更简单的方法,至少如果您使用的是Mac,请在“预览”中打开PDF,⌘I以显示检查器,选择“裁剪”选项卡并确保单位在“磅”中,从“工具”菜单中选择“矩形选择”,然后选择感兴趣的区域。如果选择一个区域,检查器将显示坐标,您可以将坐标舍入并馈送到构造函数参数中。您只需要使用第一种方法确认原点的位置。Rectangle


推荐