如何使用 PDFPlumber 从两列 PDF 中提取文本

Ram*_*kar 5 python text-extraction information-extraction topic-modeling pdfplumber

我正在使用 python 进行主题建模任务,我想从年度/可持续性报告中提取文本。然而我的问题是,当我尝试提取报告时,提取的行在页面中的两个不同列之间断开,即它连接相邻段落中的两个不同行以构成一个句子。如何按照报告中的显示方式准确提取行。我已附上报告的版本和函数提取的行。

\n

下面是我使用的函数:

\n

#从url获取pdf的函数

\n
def converter(url):\n    text=[]\n    req= requests.get(url)\n    with pdfplumber.open(BytesIO(req.content)) as pdf:\n        for i in range(0, len(pdf.pages)):\n            pages= pdf.pages[i]\n            text.append(pages.extract_text())\n    return "\\n".join(str(i) for i in text)\n
Run Code Online (Sandbox Code Playgroud)\n

该图像是我正在提取的报告中的一个片段,报告中的文本分为两列,而 extract_content 函数将这两列混合起来得到一行,即将两列中的行连接起来并显示为一行。

\n

这是报告的第一行(第一列和第二列的开头由函数合并在一起):

\n
\n

\\n2019 年我的首要职责之一是接受采访。当我们\n在 2016 年\n开始新的战略时期\xe2\x80\x9c早安挪威\xe2\x80\x9d节目\n进行谈话时,我表示希望AF 会感到 \\n关于 AF\xe2\x80\x99s\n当我们\n希望超越 \\n女性时,将同样紧密结合的百分比增加一倍的目标

\n
\n

如果我能按照报告中给出的确切方式提取句子,那将会很有帮助。

\n

Kai*_*aia 6

这是基于samkit-jain对软件包问题的响应。

关键是page.crop

假设没有标题信息,将页面裁剪成两半:

left = page.crop((0, 0, 0.5 * page.width, 0.9 * page.height))
right = page.crop((0.5 * page.width, 0, page.width, page.height)
Run Code Online (Sandbox Code Playgroud)

然后提取文本并连接:

l_text = left.extract_text()
r_text = right.extract_text()
text = l_text + " " + r_text
Run Code Online (Sandbox Code Playgroud)

当然,如果报告中的某个页面有一个跨越两列的数字,则这种方法会弄乱该数据,因此您可能必须在每个页面上对此进行自定义。