Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解锁一个";“有担保”;(阅读保护)Python中的PDF?_Python_Pdf_Pdfminer_Pdf Scraping - Fatal编程技术网

如何解锁一个";“有担保”;(阅读保护)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

在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 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))