java - 使用 PDFBox 2.x 从 PDF 中提取文本时出现合并行的问题
问题描述
我在使用PDFTextStripper
from从 PDF 中提取文本时遇到问题PDFBox 2.0.13
。更具体地说 - 彼此太接近的线被合并在一起。例如:
在第一行,有文本“ signfieldbig ”,第二行包含下划线,但PDFTextStripper
将其解析为“ s_i_g_n_fi_e_ld_b_ig_ _______ ”(将两行合并为一个)。我尝试了多种设置(不同的 lineSeparator、阈值等),但没有任何帮助。这两行每次都合并,我不能简单地从文本中删除所有不必要的字符,因为我正在寻找这个占位符的位置来创建签名字段。
更新:我刚刚意识到是什么导致了这个问题 - 在原始文件中,不是由行分隔符分隔的两条普通行,而是一条带下划线的行,并在其上方手动放置带有文本“占位符”的文本区域。但是,PDF 查看器(将其作为文本查看)或其他 PDF 库(iText 2.x)将其解析为两个单独的行......
解决方案
文本提取有不同的策略,一个可以获取文本块,当新的下一个块的坐标不在前一个之后时只添加一个新行或类似的东西,或者可以收集所有块,对它们进行排序通过坐标,并从这些排序的块中提取文本。
(显然这两种策略类型都可以结合一定程度的文本布局分析。)
在您的情况下,排序处于活动状态,导致下划线和上面的文本连接为“s_i_g_n_fi_e_ld_b_ig_ _______”。
您可以使用禁用 pdfbox 文本剥离器中的排序setSortByPosition(false)
。
没有通用的最佳方法,取决于所讨论的文档,其中一个可能更好。
推荐阅读
- pyqt - 圆边无框窗口的边框问题(pyqt5)
- python - 如何使输入格式正确
- python - 在Python中循环整数列表与字典列表
- python - 无法将 foxyproxy 插件添加到 selenium 配置文件
- laravel - 如何使用 id 搜索与 laravel 中的另一列有关系?
- html - 仅当父元素在 Sass 中没有特定类时才绘制边框
- java - NeuralNetwork 无法训练 XOR(但 OR 工作得很好)
- flutter - 是否建议根据显示大小设置字体大小?
- bootstrap-modal - Bootstrap 4 Modal 上缺少图像
- javascript - 如何用纯 javascript 编写这个 jquery 字符串(在我的在线商店中)?