我的问题是:
如何从PDF文件中提取文本,该文件按列分割,我将结果由此列分隔?
背景:我从事一个关于文本分析(特别是科学文本)的项目 . 这些文本有时以多个列布局发布,每列给出一个单独的页码 . 要通过有层次的页面编号对所提取的文本进行排序,按列提取文本会很有用 .
我使用 pdfBox 并尝试/搜索了几件事:
-
我尝试了
PDPage
类的getThreadBeads()
方法 - >结果:列表0大小 -
我尝试用
getCharactersByArticle()
方法抓取文本 - >文本不分列
(我尝试使用已发布文本的pdf文件以及基于自创的.doc文件,每个文件都有多列布局)
问题是pdfBox似乎自动按列分割文本:如果我将 setSortByPosition()
设置为 PDFTextStripper
,则页面的所有符号都设置在一行而不识别单独的列 . 但是,如果我将 setSortByPosition()
设置为false,则剥离器正在进行此分割 .
为此我查看了pdfBox源代码:关键方法是PDFTextStripper的 writePage()
方法 . 这里显然计算了空间(在大多数pdf中没有给出)和换行符 . 但我无法找到Stripper如何计算柱断裂 .
那么问题又来了:
-
PDFTextStripper如何计算列中断?
-
pdfBox API中是否有方法来捕获/按列提取文本?
-
这可能与其他pdf-api一起使用吗?
提前致谢
1 回答
事实并非如此 .
通过将
SortByPosition
设置为false
,您告诉PDFBox不要尝试从页面内容流中对文本片段进行排序,而是按照它们出现的顺序接受它们 .在您的文档中,文本片段似乎是按阅读顺序绘制的,即逐列 . 对于所有文档都不是这样,并且为了处理其他文档,PDFBox提供了从左到右,从上到下排序文本片段的选项 .
在文档中激活该选项(将
SortByPosition
设置为true
)将返回不考虑列的文本 .PDFBox不会分析页面内容以识别列 . 但是,如果进行分析,则允许您逐列提取文本,如果您将列矩形作为规则提供 .