Tyl*_*oen 5 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>
Run Code Online (Sandbox Code Playgroud)
我检查了stackoverflow,其他有此错误的人发现他们的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)
Run Code Online (Sandbox Code Playgroud)
我也尝试将文件重写为新的文件路径,但它仍然导致相同的错误.
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)
Run Code Online (Sandbox Code Playgroud)
最后,这是我用来提取文本的函数.
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
Run Code Online (Sandbox Code Playgroud)
有没有什么办法可以通过编程方式解决这个问题,而不是手动重新导出预览中的文件?
较新版本的 PDFMiner 具有 check_extractable 参数。您可以在 get_pages 方法上使用它:
fp = open(filename, 'rb')
PDFPage.get_pages(fp,check_extractable=False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4617 次 |
| 最近记录: |