如何解锁一个";“有担保”;(阅读保护)Python中的PDF?
在Python中,我使用以下代码从pdf中读取文本。我现在收到一条错误消息,上面说:如何解锁一个";“有担保”;(阅读保护)Python中的PDF?,python,pdf,pdfminer,pdf-scraping,Python,Pdf,Pdfminer,Pdf Scraping,在Python中,我使用以下代码从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 ex
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>
由于有许多服务可以在一秒钟内禁用这种读取保护,我认为这真的很容易做到。似乎.is\u extractable
是doc
的一个简单属性,但我认为它不像将.is\u 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
据我所知,在大多数情况下,PDF的全部内容实际上是加密的,使用密码作为加密密钥,因此简单地将
.is\u extractable
设置为True
对您没有帮助
根据此线程:
我建议使用命令行工具(如qpdf
)删除读取保护(易于安装,例如在Ubuntu上使用apt get install qpdf
,如果您还没有):
然后用pdfminer
打开未锁定的文件,然后开始你的工作
对于纯Python解决方案,您可以尝试使用PyPDF2
及其.decrypt()
方法,但它不能用于所有类型的加密,因此实际上,您最好只使用qpdf
-请参阅:
在我的例子中,没有密码,但简单地设置
check_extractable=False
就可以避免出现问题文件(在其他查看器中打开良好)的pdftextraction异常。我在试图让qpdf在我的程序中正常运行时遇到了一些问题。我发现了一个有用的库,它基于qpdf并自动将PDF转换为可提取的
使用此功能的代码非常简单:
import pikepdf
pdf = pikepdf.open('unextractable.pdf')
pdf.save('extractable.pdf')
“check_extractable=True”参数是经过设计的。
一些PDF明确禁止提取文本,而PDFMiner遵循该指令。您可以覆盖它(给出check_extractable=False),但这样做的风险由您自己承担。我也遇到了解析安全pdf的相同问题,但它已通过pikepdf库得到解决。我在我的jupyter notebbok和windows操作系统上尝试了这个库,但它出现了错误,但在Ubuntu上运行顺利如果你想解锁文件夹中的所有pdf文件而不重命名它们,你可以使用以下代码:
import glob, os, pikepdf
p = os.getcwd()
for file in glob.glob('*.pdf'):
file_path = os.path.join(p, file).replace('\\','/')
init_pdf = pikepdf.open(file_path)
new_pdf = pikepdf.new()
new_pdf.pages.extend(init_pdf.pages)
new_pdf.save(str(file))
在库中,不可能通过使用相同的名称保存现有文件来覆盖该文件。相反,您希望将页面复制到新创建的空pdf文件中,然后保存它。我使用了下面的代码,可以覆盖
pdf=pikepdf.open('filepath',允许\u覆盖\u输入=True)
pdf.save('filepath')
您是否尝试过更改。是否可提取为True?实际上,它很有可能会起作用。你试过传递密码吗?对于PDFPage.get_pages(fileData,set(),maxpages=0,password=password,caching=True,check_extractable=True)中的页面:在文件未加密或未受密码保护的情况下引发错误时的最佳答案。请与示例共享此信息如果pdf受密码保护,则可以使用pikepdf.open设置密码('untractable.pdf',password='thepassword')
import pikepdf
pdf = pikepdf.open('unextractable.pdf')
pdf.save('extractable.pdf')
import glob, os, pikepdf
p = os.getcwd()
for file in glob.glob('*.pdf'):
file_path = os.path.join(p, file).replace('\\','/')
init_pdf = pikepdf.open(file_path)
new_pdf = pikepdf.new()
new_pdf.pages.extend(init_pdf.pages)
new_pdf.save(str(file))