"PDF File has not been decrypted" PyPDF2 中问题仍然存在

"PDF File has not been decrypted" issue still persists in PyPDF2

使用 PyPDF2 阅读 PDF 文件时出现以下错误

raise utils.PdfReadError("File has not been decrypted")
PdfReadError: File has not been decrypted

我一直在尝试通过 python 以编程方式阅读 PDF 文档。对于大多数 PDF 文件,它工作正常,但对于少数文件,我收到以下错误

raise utils.PdfReadError("File has not been decrypted")
PdfReadError: File has not been decrypted

我已经尝试过另一个 Whosebug 解决方案的解决方案:PyPDF 2 Decrypt Not Working

上述问题的解决方案仍然没有解决我的问题

import os
import PyPDF2
from PyPDF2 import PdfFileReader

fp = open(filename)
pdfFile = PdfFileReader(fp)
if pdfFile.isEncrypted:
   try:
       pdfFile.decrypt('')
       print('File Decrypted (PyPDF2)')
   except:
       command = ("cp "+ filename +
        " temp.pdf; qpdf --password='' --decrypt temp.pdf " + filename
        + "; rm temp.pdf")
       os.system(command)
       print('File Decrypted (qpdf)')
       fp = open(filename)
       pdfFile = PdfFileReader(fp)
else:
    print('File Not Encrypted')

问题似乎不是 space 文件名之间或将密码设置为“ ”。

不知何故无法解决这个错误。任何帮助表示赞赏。谢谢。

我的代码:

import PyPDF2
import os
from os import listdir
from os.path import isfile, join

mypath='D:/POC PDF'
onlyfiles = [os.path.join(mypath, f) for f in os.listdir(mypath) if os.path.isfile(os.path.join(mypath, f))]
for file in onlyfiles:
    fileReader = PyPDF2.PdfFileReader(open(file,'rb'))
    countpage = fileReader.getNumPages()
    print(countpage)

为了回答我自己 question:Thanks 给一个朋友的问题,我发现了一个比 PyPDF2 更好的包。它是 PyMuPDF。这是一个示例实现

import fitz

def extractText(file): 
    doc = fitz.open(file) 
    text = []
    for page in doc: 
        t = page.getText().encode("utf8") 
        text.append(t)
    return text

使用带有子进程的 'QPDF' 库可以解密给定的 PDF 文件。

安装:

sudo apt-get install -y qpdf

用法:

new_file_path = file_path.replace('.pdf','_decrypt.pdf').replace('.PDF','_decrypt.pdf')
cmd = "qpdf --decrypt " + file_path + " " + new_file_path

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                        shell=True, preexec_fn=os.setsid)
stdout, stderr = proc.communicate()