13

我正在尝试从互联网上抓取的 pdf 中提取文本,但是当我尝试下载它们时出现错误:

File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfpage.py", line 124, in get_pages
    raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp)
PDFTextExtractionNotAllowed: Text extraction is not allowed <cStringIO.StringO object at 0x7f79137a1ab0>

我检查了 stackoverflow,其他遇到此错误的人发现他们的 pdf 文件用密码保护。但是,我可以通过我的 Mac 上的预览访问 pdf。

有人提到预览可能会查看受保护的 pdf,所以我也在 Adob​​e Acrobat Reader 中打开了文件,并且仍然能够访问 pdf。

这是我从以下网站下载 pdf 的示例:http: //www.sophia-project.org/uploads/1/3/9/5/13955288/aristotle_firstprinciples.pdf

我发现如果我手动打开 pdf 并将其作为 pdf 重新导出到相同的文件路径(基本上用“新”文件替换原始文件),那么我可以从中提取文本。我猜这与从网站下载它们有关。我只是使用 urllib 来下载 pdf,如下所示:

if not os.path.isfile(filepath):
    print '\nDownloading pdf'
    urllib.urlretrieve(link, filepath)
else:
    print '\nFile {} already exists!'.format(title)

我也尝试将文件重写为新的文件路径,但仍然导致相同的错误。

if not os.path.isfile(filepath):
    print '\nDownloading pdf'
    urllib.urlretrieve(link, filepath)

    with open(filepath) as f:
        new_filepath = re.split(r'\.', filepath)[0] + '_.pdf'
        new_f = file(new_filepath, 'w')
        new_f.write(f.read())
        new_f.close()

    os.remove(filepath)
    filepath = new_filepath
else:
    print '\nFile {} already exists!'.format(title)

最后,这是我用来提取文本的函数。

def convert(fname, pages=None):
    '''
    Get text from pdf
    '''
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = file(fname, 'rb')
    try:
        for page in PDFPage.get_pages(infile, pagenums):
            interpreter.process_page(page)
    except PDFTextExtractionNotAllowed:
        print 'This pdf won\'t allow text extraction!'

    infile.close()
    converter.close()
    text = output.getvalue()
    output.close

    return text

有什么办法可以以编程方式解决这个问题,而不是手动重新导出预览中的文件?

4

5 回答 5

9

更新版本的 PDFMiner 具有 check_extractable 参数。您可以在 get_pages 方法上使用它:

fp = open(filename, 'rb')
PDFPage.get_pages(fp,check_extractable=False)
于 2019-09-10T18:14:15.337 回答
3

我也有这个错误。解决如下。

for page in PDFPage.get_pages(fp, caching=caching, check_extractable=True): interpreter.process_page(page)

for page in PDFPage.get_pages(fp, caching=caching, check_extractable=False): interpreter.process_page(page)

于 2020-01-08T05:34:41.817 回答
2

完全披露,我是pdfminer.six的维护者之一。它是用于 python 3 的 pdfminer 的社区维护版本。

此问题已在 2020 年check_extractable通过默认禁用来修复。它现在显示警告而不是引发错误。

类似的问答在这里

于 2021-11-21T15:17:19.657 回答
1

我也有同样的错误。我用过PyMuPDF包,它有效。

于 2019-04-01T14:27:41.733 回答
-2

我也遇到过这个错误,所以将 tika 合并到本地运行,如果 pdfminer 无法提取任何数据,我会将其传递给 tika。工作正常。

于 2019-02-18T10:42:13.050 回答