我的问题是:
如何从PDF文件中提取文本,该文件按列分割,以此方式将结果分隔为此列?
背景: 我正在开展一个关于文本分析(特别是科学文本)的项目。 这些文本有时以多个列布局发布,每列给出一个单独的页码。 要通过有层次的页面编号来对提取的文本进行排序,按列提取文本会很有用。
我使用 pdfBox 并尝试/搜索了几件事:
getThreadBeads()
类的PDPage
方法 - >结果:0大小的列表getCharactersByArticle()
方法抓取文字 - >文字未分列于
(我尝试使用已发布文本的pdf文件以及基于自创的.doc文件,每个文件都有多列布局)问题是pdfBox似乎自动按列分割文本:
如果我将setSortByPosition()
设置为PDFTextStripper
,则页面中的所有符号都会在一行中设置,而不会识别单独的列。
但是,如果我将setSortByPosition()
设置为false,则剥离器正在进行此分割。
为此我查看了pdfBox源代码:
关键方法是PDFTextStripper的writePage()
方法。
这里显然计算了空间(在大多数pdf中没有给出)和换行符。
但我无法找到Stripper如何计算柱断裂。
再次提出问题:
提前致谢
答案 0 :(得分:2)
如果我将PDFTextStripper的setSortByPosition()设置为true,则页面的所有符号都会在一行中设置,而不会识别单独的列。但是如果我在false上设置setSortByPosition(),那么剥离器正在进行这种划分。
[...] PDFTextStripper如何计算列中断?
不是。
通过将SortByPosition
设置为false
,您告诉PDFBox 不尝试对页面内容流中的文本片段进行排序,而是按照它们出现的顺序接受它们。
在您的文档中,文本片段似乎是按阅读顺序绘制的,即逐列。对于所有文档都不是这样,并且为了处理其他文档,PDFBox提供了从左到右,从上到下排序文本片段的选项。
在文档中激活该选项(将SortByPosition
设置为true
)会返回不考虑列的文本。
pdfBox API中是否有方法来捕获/按列提取文本?
PDFBox不会分析页面内容以识别列。但是,如果进行分析,如果将列矩形作为规则提供,则可以逐列提取文本。
答案 1 :(得分:0)
结合@mkl的答案,我使用PDFbox完成了按列的文本提取。
我发现两列边界的方法一直在不断尝试。 =:
StringBuilder pdfText = new StringBuilder();
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
Rectangle rectLeft = new Rectangle(10, 60, 320, 820);
Rectangle rectRight = new Rectangle(330, 60, 320, 820);
stripper.addRegion("leftColumn", rectLeft);
stripper.addRegion("rightColumn", rectRight);
PDPageTree allPages = document.getDocumentCatalog().getPages();
int pageNumber = document.getNumberOfPages();
String leftText = "";
String rightText = "";
for (int i = 0; i < pageNumber; i++) {
PDPage page = (PDPage) allPages.get(i);
stripper.extractRegions(page);
leftText = stripper.getTextForRegion("leftColumn");
rightText = stripper.getTextForRegion("rightColumn");
pdfText.append(leftText);
pdfText.append(rightText);
}