使用Python读取PDF并将其转换为文本

4

我使用了这段代码将PDF转换为文本。

input1 = '//Home//Sai Krishna Dubagunta.pdf'
output = '//Home//Me.txt'
os.system(("pdftotext %s %s") %( input1, output))

我已经创建了“Home”目录并将源文件粘贴到其中。

我得到的输出结果是:

1

没有创建带有 .txt 扩展名的文件。问题出在哪里?

1
检查错误代码1 http://msdn.microsoft.com/zh-cn/library/ms681382(v=vs.85).aspx - ashishmaurya
3个回答

12

有多种Python包可用于从PDF中提取文本。您可以查看速度/质量基准

作为pypdfPyPDF2的维护者,我有偏见,但我建议初学者使用pypdf。它是纯Python编写的,采用BSD 3条款许可证。对大多数人来说,这应该就够了。此外,pypdf可以在PDF文件中执行更多操作(例如转换)。

如果您熟悉C依赖项并且不想修改PDF,请尝试使用pypdfium2。pypdfium2非常快,而且提取质量非常好。

我之前推荐过popplers pdftotext。不要使用它。它的质量比PDFium / PyPDF2还要差。

Tika和PyMuPDF的效果与PDFium类似,但它们也具有非Python依赖性。由于商业许可证的原因,PyMuPDF可能无法适用于您。

我不建议使用pdfminer / pdfminer.six / pdfplumber / pdftotext / borb / PyPDF2 / PyPDF3 / PyPDF4。

pypdf:纯Python

安装:pip install pypdf更多说明

from pypdf import PdfReader

reader = PdfReader("example.pdf")
text = ""
for page in reader.pages:
    text += page.extract_text() + "\n"

PDFium:高质量且非常快速,但有C依赖

安装:pip install pypdfium2

import pypdfium2 as pdfium

text = ""
pdf = pdfium.PdfDocument(data)
for i in range(len(pdf)):
    page = pdf.get_page(i)
    textpage = page.get_textpage()
    text += textpage.get_text()
    text += "\n"
    [g.close() for g in (textpage, page)]
pdf.close()

这是最好的答案。顺便说一下,pdftotext 要求您首先安装 poppler,在 Windows 上有点麻烦。 (https://dev59.com/blcO5IYBdhLWcg3wXwh3) - smci
我尝试了PyMuPDF,完美地运行了,而且没有任何许可证限制。 - Tomás Gomez Pizarro
你使用的每个软件都有许可证。 - Martin Thoma
1
@TomásGomezPizarro PyMuPDF是AGPLv3。简单来说,这意味着您不得在闭源(即没有自由许可证)的公共项目中使用它。这在法律上具有约束力(有相关案例法)。对于不符合AGPL的用途,您必须从Artifex购买许可证。 - mara004
1
@TomásGomezPizarro PyMuPDF是AGPLv3授权的。简单来说,这意味着你不能在闭源(或者说没有自由许可证)的公共项目中使用它。这是法律约束力的(有相关案例法)。对于不符合AGPL的使用方式,你需要从Artifex购买许可证。 - undefined

4

您的表达

("pdftotext %s %s") %( input1, output)

我会翻译成

pdftotext //Home//Sai Krishna Dubagunta.pdf //Home//Me.txt

这意味着传递给pdftotext的第一个参数是//Home//Sai,第二个参数是Krishna。显然这是行不通的。

请用引号将这些参数括起来:

os.system("pdftotext '%s' '%s'" % (input1, output))

那行不通 @Tim Pietzcker - Krishna
2
“Didn't work”并不是很有帮助。当您使用该命令时,确切的结果是什么?我不是Unix专家,但路径中真的应该有双斜杠吗?如果您在运行Python脚本的目录中键入pdftotext '//Home//Sai Krishna Dubagunta.pdf' '//Home//Me.txt'会发生什么? - Tim Pietzcker
双斜杠用于在输入字符串中指定单个斜杠。与使用//打印或指定/的C语言相同。结果是1。这意味着根据错误代码,它是无效函数。 - Krishna
1
@Krishna:你确定你没有混淆斜杠“/”和反斜杠“\”吗? - Tim Pietzcker
困惑。一直有这个问题。 - Krishna
显示剩余2条评论

0

我认为 pdftotext 命令只接受一个参数。请尝试使用:

os.system(("pdftotext %s") % input1)

然后看看会发生什么。希望这能有所帮助。


那么输出结果在哪里呢?我需要提供一个输出路径,对吧?一个存储文件的地方。同样的输出。抱歉。 - Krishna
我在搜索有关pdf自动化(测试)的信息时遇到了你的问题。我基于这个做出了评论:http://en.wikipedia.org/wiki/Pdftotext,在这里提到:$ pdftotext file.pdf这种用法会生成一个与输入文件同名的文本文件。通配符(*),例如$ pdftotext *pdf,用于转换多个文件,不能使用,因为pdftotext只期望一个文件名。我可能误解了问题。 - haraprasadj
我错过了一个必须安装的软件包,根据另一个论坛用户的说法。链接 但是我不知道如何安装那个软件包,所以无法尝试。我将使用PyCharm进行尝试。 - Krishna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接