PDFminer:PDFTextExtractionNotAllowed错误

时间:2016-10-11 16:18:17

标签: python pdf text nlp pdfminer

我正在尝试从pdfs中提取文本我已经从互联网上删除了,但是当我尝试下载它们时,我收到错误:

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,someone else who had this error发现他们的pdf是用密码保护的。但是,我可以通过我的mac上的预览访问pdfs。

有人提到预览可能会查看安全的pdf,所以我也在Adobe Acrobat Reader中打开文件,但仍然可以访问pdf。

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

fp = open(filename, 'rb')
PDFPage.get_pages(fp,check_extractable=False)

答案 1 :(得分:2)

我也有此错误。解决方法如下。

之前

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)

答案 2 :(得分:1)

(pdfminer3k)在

中注释这两行代码
  

process_pdf中的文件“ ... \ Python36 \ lib \ site-packages \ pdfminer \ pdfinterp.py”,第701行       提高PDFTextExtractionNotAllowed('不允许文本提取:%r'%fp)

# if check_extractable and not doc.is_extractable:
#    raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp)

for(pdfminer)在此文件中注释以下两行:

  

get_pages中的文件“ ... / python2.7 / dist-packages / pdfminer / pdfpage.py”第124行       提高PDFTextExtractionNotAllowed('不允许文本提取:%r'%fp)

答案 3 :(得分:0)

我也遇到了这个错误,因此将tika合并到本地运行,如果pdfminer无法提取任何数据,我会将其传递给tika。效果很好。

答案 4 :(得分:0)

我也有同样的错误。我已经使用过PyMuPDF软件包,并且有效。