首页 > 解决方案 > PDFBox 较新版本以混乱的顺序提取数据

问题描述

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

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

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

我试过的: -

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

代码片段 -

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文件链接提前谢谢!!!!!!

标签: javapdfbox

解决方案


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设置为true和现在的结果都是false

丹尼尔 D 鲍威尔
1400 HIDDEN LAKES DR
MT PLEASANT SC 29464-9473


推荐阅读