kra*_*r65 14 python pdf pdf-scraping pdfminer
在Python中,我使用pdfminer从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 0x7f79137a1
ab0>
Run Code Online (Sandbox Code Playgroud)
当我用Acrobat Pro打开这个pdf时,它证明它是安全的(或"读保护").但是,从这个链接,我读到有很多服务可以轻松禁用这种读保护(例如pdfunlock.com.当潜入pdfminer的源代码时,我看到上面的错误是在这些行上生成的.
if check_extractable and not doc.is_extractable:
raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp)
Run Code Online (Sandbox Code Playgroud)
由于有许多服务可以在一秒钟内禁用这种读保护,我认为这很容易做到.它似乎.is_extractable是一个简单的属性doc,但我认为它不像.is_extractable改为True 那么简单.
有谁知道如何使用Python禁用pdf上的读保护?欢迎所有提示!
================================================
您将在下面找到我目前从非读保护中提取文本的代码.
def getTextFromPDF(rawFile):
resourceManager = PDFResourceManager(caching=True)
outfp = StringIO()
device = TextConverter(resourceManager, outfp, codec='utf-8', laparams=LAParams(), imagewriter=None)
interpreter = PDFPageInterpreter(resourceManager, device)
fileData = StringIO()
fileData.write(rawFile)
for page in PDFPage.get_pages(fileData, set(), maxpages=0, caching=True, check_extractable=True):
interpreter.process_page(page)
fileData.close()
device.close()
result = outfp.getvalue()
outfp.close()
return result
Run Code Online (Sandbox Code Playgroud)
Jaz*_*aza 18
据我所知,在大多数情况下,PDF中的全部内容实际上是加密,使用密码作为加密密钥,因此简单地设置.is_extractable到True是不会帮你的.
按此线程:
我建议使用命令行工具删除读保护qpdf(例如,apt-get install qpdf如果你还没有,可以轻松安装,例如在Ubuntu上使用):
qpdf --password=PASSWORD --decrypt SECURED.pdf UNSECURED.pdf
Run Code Online (Sandbox Code Playgroud)
然后打开解锁文件pdfminer并执行您的操作.
对于纯Python解决方案,您可以尝试使用PyPDF2它的.decrypt()方法,但它不适用于所有类型的加密,所以真的,你最好只使用qpdf- 参见:
https://github.com/mstamy2/PyPDF2/issues/53
小智 12
我在尝试使qpdf在程序中运行时遇到一些问题。我发现了一个有用的库pikepdf,它基于qpdf并自动将pdf转换为可提取的。
使用此代码非常简单:
import pikepdf
pdf = pikepdf.open('unextractable.pdf')
pdf.save('extractable.pdf')
Run Code Online (Sandbox Code Playgroud)
小智 7
我使用pikepdf使用下面的代码并能够覆盖。
import pikepdf
pdf = pikepdf.open('filepath', allow_overwriting_input=True)
pdf.save('filepath')
Run Code Online (Sandbox Code Playgroud)