我在使用 PDFBox 2.0.13
中的 PDFTextStripper
从 PDF 中提取文本时遇到问题。更具体地说 - 彼此太靠近的线条合并在一起。例如:
第一行有文本“signfieldbig”,第二行包含下划线,但 PDFTextStripper
将其解析为“s_i_g_n_fi_e_ld_b_ig_ _______” (它将两行合并为一条)。我尝试了多种设置(不同的 lineSeparator、阈值等),但没有任何帮助。这两行每次都合并,我不能简单地从文本中删除所有不必要的字符,因为我正在寻找这个占位符的位置来创建签名字段。
更新:我刚刚意识到是什么导致了这个问题 - 在原始文件中不是由行分隔符分隔的两行普通行,而是一行带有下划线和手动放置的文本区域,上面有文本“placeholder” .但是,PDF 查看器(将其作为文本查看)或其他 PDF 库 (iText 2.x) 仍将其解析为两行...
最佳答案
有不同的文本提取策略,一种可以在文本 block 出现时只添加一个新行或类似的东西,当新的下一个 block 的坐标不在前一个之后,或者可以收集所有 block ,按坐标对它们进行排序,并从这些已排序的 block 中提取文本。
(显然,两种策略类型都可以结合一定程度的文本布局分析。)
在您的情况下,排序处于 Activity 状态,导致下划线和上面的文本连接为“s_i_g_n_fi_e_ld_b_ig_ _______”。
您可以使用 setSortByPosition(false)
在 pdfbox 文本剥离器中禁用排序。
没有通用的最佳方法,取决于所讨论的文档,一个或另一个可能更好。
关于java - 使用 PDFBox 2.x 从 PDF 中提取文本时出现合并行问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54187398/