如何在Python中解锁"安全"(读保护)PDF?

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_extractableTrue是不会帮你的.

按此线程:

是否存在以编程方式从PDF中删除密码的库?

我建议使用命令行工具删除读保护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)

  • 如果 pdf 受密码保护,则可以使用 pikepdf.open('unextractable.pdf', password='thepassword') 设置密码 (10认同)
  • 确认,pikepdf就像一个吊饰一样起作用! (2认同)

小智 7

我使用pikepdf使用下面的代码并能够覆盖。

import pikepdf

pdf = pikepdf.open('filepath', allow_overwriting_input=True)
pdf.save('filepath')
Run Code Online (Sandbox Code Playgroud)