PDFBox 较新版本以混乱的顺序提取数据

PDFBox Newer version extracts data in jumbled order

我正在尝试使用 PDFTextStripperByArea 从特定 PDF 区域中提取数据,而我有兴趣提取的唯一数据是以混乱的顺序出现的,其余所有页面数据都正确。这是 PDFBox 版本 2.0.7.

当我尝试使用旧版本 1 进行相同操作时。8.x,它会正确提取数据。

与 PDF 中的其他数据相比,我正在提取的区域似乎使用了不同的字体。 我对发生了什么问题感到有点困惑,有什么方法可以使用较新的版本正确地抓取数据,因为由于其他依赖关系我无法退回到旧版本。

我尝试过的:-

  1. 运行PDFBox最新版本2.0.20上的PDF,还是不行
  2. 尝试调试并发现 setSortByPosition 在处理页面的初始步骤中进行交换,但是,我不能将其设置为 false 否则我会丢失换行符 [加上旧版本在 setSortByPosition 时工作正常设置为真]

代码片段-

Rectangle region = new Rectangle();
region.setRect(55, 75.80, 160, 100);
PDDocument pdfDoc = PDDocument.load(new File(pdfFilePath));
PDFTextStripperByArea stripperByArea = new PDFTextStripperByArea ();
stripperByArea.setSortByPosition(true);
stripperByArea.addRegion("CVAM", region);
stripperByArea.extractRegions(pdfDoc.getPages().get(0));
return stripperByArea.getTextForRegion("CVAM");

我在评论分享PDF文件link 提前致谢!!!!!

您的 PDF 中的字体具有非常不切实际的元数据。特别是他们的 AscentDescentCapHeightFontBBox 条目包含的值声称字形大约是实际高度的两倍。由于 PDF 中的可视文本行设置得非常紧密,这意味着遵循这些元数据的 PDF 工具必须假设实际上不是三个文本行,而是一个或可能是两个文本行,其中一些字母稍微升高一些,一些字母稍微降低一些。因此,排序会产生大杂烩。

您可以检查不仅PDFBox对这些字体有问题。例如。在 Adob​​e Reader 中打开 PDF 并单击文本,您会看到一个巨大的光标栏:

并复制和粘贴地址结果

1D4A0N0I EHL IDD DEPNO WELALKLES DR MT PLEASANT SC 29464-9473

尽管如此,根据@Tilman 的评论 2.0.21 将有可能设置自己的高度计算, 我在当前的 PDFBox 开发负责人中使用了该功能来提供恒定的低字体高度:

PDFTextStripperByArea stripperByArea = new PDFTextStripperByArea() {
    @Override
    protected float computeFontHeight(PDFont font) throws IOException {
        return .5f;
    }
};
stripperByArea.setSortByPosition(false);
stripperByArea.addRegion("CVAM", region);
stripperByArea.extractRegions(pdfDoc.getPages().get(0));
String text = stripperByArea.getTextForRegion("CVAM");

(来自ExtractText测试testCustomFontHeightYOYO

SortByPosition 设置为 truefalse 现在的结果是:

DANIEL D POWELL
1400 HIDDEN LAKES DR
MT PLEASANT SC 29464-9473