Python提取PDF文本替换cid标记及加密PDF解密技术问询
问题解答
1. 替换PDF提取文本中的(cid:<数字>)字符
PDF里的(cid:<数字>)是字符ID引用,对应字体文件里的字形,通常是提取工具没正确解析字体字符映射表导致的。用pdfplumber可以直接获取解析后的字符,不用手动替换,修改你的parse函数即可:
def parse(self, response): pdf = pdfplumber.open(io.BytesIO(response.body)) extract_text = "" # 遍历每页,直接获取解析后的字符 for page in pdf.pages: for char in page.chars: extract_text += char["text"] pdf.close() # 后续处理extract_text
如果pdfplumber仍解析失败,试试PyMuPDF(fitz),它对字体映射的支持更全面:
import fitz def parse(self, response): doc = fitz.open("pdf", response.body) extract_text = "" for page in doc: extract_text += page.get_text() doc.close() # 后续处理extract_text
2. 加密PDF的处理方法
你提到的世界银行PDF加密后无法提取内容,注意:
- 合法前提下,只有拿到该文档的访问密码才能解密提取内容。建议去文档对应的页面查看是否有公开的无加密版本,或者通过官方渠道申请访问权限。
- 任何破解第三方加密PDF的行为都可能涉及版权和法律风险,不建议尝试。
在代码里可以添加加密检测的异常处理:
def parse(self, response): try: pdf = pdfplumber.open(io.BytesIO(response.body)) extract_text = "" for page in pdf.pages: for char in page.chars: extract_text += char["text"] pdf.close() return extract_text except Exception as e: if "encrypted" in str(e).lower(): print("PDF已加密,需获取访问密码才能提取内容") else: print(f"提取失败:{str(e)}")
内容的提问来源于stack exchange,提问作者lils
相关产品推荐
相关产品推荐

