PDFBox 较新版本以混乱的顺序提取数据
PDFBox Newer version extracts data in jumbled order
我正在尝试使用 PDFTextStripperByArea 从特定 PDF 区域中提取数据,而我有兴趣提取的唯一数据是以混乱的顺序出现的,其余所有页面数据都正确。这是 PDFBox 版本 2.0.7.
当我尝试使用旧版本 1 进行相同操作时。8.x,它会正确提取数据。
与 PDF 中的其他数据相比,我正在提取的区域似乎使用了不同的字体。
我对发生了什么问题感到有点困惑,有什么方法可以使用较新的版本正确地抓取数据,因为由于其他依赖关系我无法退回到旧版本。
我尝试过的:-
- 运行PDFBox最新版本2.0.20上的PDF,还是不行
- 尝试调试并发现 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 中的字体具有非常不切实际的元数据。特别是他们的 Ascent、Descent、CapHeight 和 FontBBox 条目包含的值声称字形大约是实际高度的两倍。由于 PDF 中的可视文本行设置得非常紧密,这意味着遵循这些元数据的 PDF 工具必须假设实际上不是三个文本行,而是一个或可能是两个文本行,其中一些字母稍微升高一些,一些字母稍微降低一些。因此,排序会产生大杂烩。
您可以检查不仅PDFBox对这些字体有问题。例如。在 Adobe 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
现在的结果是:
DANIEL D POWELL
1400 HIDDEN LAKES DR
MT PLEASANT SC 29464-9473
我正在尝试使用 PDFTextStripperByArea 从特定 PDF 区域中提取数据,而我有兴趣提取的唯一数据是以混乱的顺序出现的,其余所有页面数据都正确。这是 PDFBox 版本 2.0.7.
当我尝试使用旧版本 1 进行相同操作时。8.x,它会正确提取数据。
与 PDF 中的其他数据相比,我正在提取的区域似乎使用了不同的字体。 我对发生了什么问题感到有点困惑,有什么方法可以使用较新的版本正确地抓取数据,因为由于其他依赖关系我无法退回到旧版本。
我尝试过的:-
- 运行PDFBox最新版本2.0.20上的PDF,还是不行
- 尝试调试并发现 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 中的字体具有非常不切实际的元数据。特别是他们的 Ascent、Descent、CapHeight 和 FontBBox 条目包含的值声称字形大约是实际高度的两倍。由于 PDF 中的可视文本行设置得非常紧密,这意味着遵循这些元数据的 PDF 工具必须假设实际上不是三个文本行,而是一个或可能是两个文本行,其中一些字母稍微升高一些,一些字母稍微降低一些。因此,排序会产生大杂烩。
您可以检查不仅PDFBox对这些字体有问题。例如。在 Adobe 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
现在的结果是:
DANIEL D POWELL
1400 HIDDEN LAKES DR
MT PLEASANT SC 29464-9473