使用pypdf处理PDF遇加密算法不支持报错 如何跳过受密码保护文件
PDF批量处理报错解决方案
加密限制说明
当前你遇到的NotImplementedError是PyPDF2库的固有功能限制:该库仅支持版本为1、2的旧版PDF加密算法,现在多数新型加密PDF(如采用AES-256加密的V4/V5版本PDF)无法使用空密码解密。在无正确密码的前提下,没有合规、稳定的加密绕过方案,破解加密PDF不符合版权相关规定,不建议尝试。
代码修改方案(异常捕获返回指定标识)
你可以通过增加异常捕获逻辑,实现解密失败时返回"encrypted"、不中断批量处理的效果,修改后的完整代码如下:
import requests from io import BytesIO from PyPDF2 import PdfFileReader def getResponse(url): try: response = requests.get(url, timeout=10) # 增加超时避免长时间卡住 # 校验响应状态码和内容类型,避免非PDF内容进入后续处理 if response.status_code == 200 and 'application/pdf' in response.headers.get('Content-Type', ''): return response return None except: return None def getNumberOfPages(response): # 先判断响应是否为空 if not response: return "request_failed" try: with BytesIO(response.content) as open_pdf_file: read_pdf = PdfFileReader(open_pdf_file) if read_pdf.isEncrypted: # 尝试空密码解密,失败直接抛出异常到外层捕获 read_pdf.decrypt("") num_pages = read_pdf.getNumPages() return num_pages except NotImplementedError: # 匹配不支持加密算法的报错 return "encrypted" except Exception as e: # 其他加密相关报错、PDF格式无效等情况,可根据需求调整返回值 if "encrypt" in str(e).lower() or "decrypt" in str(e).lower(): return "encrypted" return "invalid_pdf" def checkPDFs(pdfLinks): pdfDetails = {} for link in pdfLinks: pdfDetails[link] = {} response = getResponse(link) pdfDetails[link]["numberOfPages"] = getNumberOfPages(response) #pdfDetails[link]["creationDate"] = getDocumentInfo(response) print("PDF details", pdfDetails) return pdfDetails
核心修改点
- 优化了
getResponse函数,增加超时判断和响应校验,避免非PDF内容、请求失败的情况进入后续处理 - 给
getNumberOfPages增加了多层异常捕获,对不支持的加密算法、解密失败的场景统一返回"encrypted" - 对请求失败、PDF格式无效的场景也增加了对应返回标识,方便后续统计处理
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

