java - PDFBox 较新版本以混乱的顺序提取数据
问题描述
我正在尝试使用 PDFTextStripperByArea 从特定的 PDF 区域中提取数据,而我有兴趣提取的唯一数据是以混乱的顺序出现,其余所有页面数据都正确出现。这是在 PDFBox 版本 2.0.7 上。
当我使用旧版本 1.8.x 尝试相同的操作时,它会正确提取数据。
与 PDF 中的其他数据相比,我正在提取的区域似乎是不同的字体。我对发生了什么问题感到有些困惑,有什么方法可以使用新版本正确抓取数据,因为由于其他依赖项,我无法使用旧版本。
我试过的: -
- 在最新的 PDFBox 版本 2.0.20 上运行 PDF,仍然没有运气
- 尝试调试并发现 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文件链接提前谢谢!!!!!!
解决方案
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
:
丹尼尔 D 鲍威尔
1400 HIDDEN LAKES DR
MT PLEASANT SC 29464-9473
推荐阅读
- r - 按 R 中的分组行折叠/组合日期范围
- visual-studio - 创建新项目 Visual Studio 2015 和 PGI Visual Fortran
- mysql - 在 MAC 上安装 MySQL
- java - 如何加载 gradle 项目,然后将其用作 IntelliJ 中现有项目之一的依赖项
- sql-server - 合并表中的记录并更新相关表
- c# - 从 AD 检索凭据/密码
- java - 如何从同步 RequestFuture 请求中获取响应代码
- ios - 当我尝试为 CIContext 设置选项时,类型“String”没有成员“cacheIntermediates”错误
- reactjs - React Native fbsdk 0.8.0 版本 crash the RN project for iOS
- chatbot - Dialogflow 使用 Rest api 访问代理历史记录