Python 使用pdftotext从pdf中提取文本

Python 使用pdftotext从pdf中提取文本,python,pdf,text,extract,pdftotext,Python,Pdf,Text,Extract,Pdftotext,我正在尝试使用python和pdftotext从pdf中提取文本。 我有一些奇怪的角色,我不知道怎么了。 例如,第4页: 它给了我这个: “比利时”有一个问题。 以下是我用于从pdf(取自另一篇SO文章)中获取文本的函数: 我应该使用其他工具吗?这在很大程度上取决于您的PDF最初是如何编码的。从我测试过的免费软件来看,pdftotext提供了更好的结果(这并不是说它们“好”)。firefox-28.0-3.fc20.x86_64(带有内置的PDF查看器)在我尝试将该部分复制粘贴到gVim时也

我正在尝试使用python和pdftotext从pdf中提取文本。 我有一些奇怪的角色,我不知道怎么了。 例如,第4页:

它给了我这个:

“比利时”有一个问题。 以下是我用于从pdf(取自另一篇SO文章)中获取文本的函数:


我应该使用其他工具吗?

这在很大程度上取决于您的PDF最初是如何编码的。从我测试过的免费软件来看,pdftotext提供了更好的结果(这并不是说它们“好”)。firefox-28.0-3.fc20.x86_64(带有内置的PDF查看器)在我尝试将该部分复制粘贴到gVim时也做了类似的事情。evice-3.10.3-1.fc20.x86_64和okula-4.12.4-1.fc20.x86_64也会发生同样的情况。我想您可能遇到了
pdftotext
手册页中提到的这个问题:一些PDF文件包含的字体编码已被损坏,无法识别。没有办法(缺少OCR)从这些文件中提取文本。在LibreOffice中导入显示了相同的问题,因此我担心您可能缺少使用OCR的运气。我同意@PedroRomano。检查“损坏的”字体显示它有一个
字符集
(/G3/G11/G12/G13/G15/G16/G17/G18..
(依此类推)。这些名称与嵌入的Type1C字体中具有相同名称的“glyphs”绑定。找到名称的唯一方法可能是找到原始字体(“Monotype:Times\u New\u Roman\u Bold:Version\u 2.50”),将其转换为类型1,然后比较每个字符字符串(我不确定这是否可行)。您可能可以使用这样一个事实,即在整个文档中,特定字体实例的编码是一致的,即字体“Zugmggn+Times\u New\u Roman\u Gras0133”“您可以将
%
替换为
B
H
替换为
e
等。不过,不要假设其他“不可读”字体的编码相同。
def pdf_to_string(file_object):
    pdfData = file_object.read()

    tf = tempfile.NamedTemporaryFile()
    tf.write(pdfData)
    tf.seek(0)

    outputTf = tempfile.NamedTemporaryFile()

    if (len(pdfData) > 0) :
        out, err = subprocess.Popen(["pdftotext", "-layout", tf.name, outputTf.name ]).communicate()
        return outputTf.read()
    else :
        return None