Python提取PDF文本出现乱码及cid代码问题如何解决?
解决PDF提取文本出现(cid:xxx)问题的实用方案
出现(cid:xxx)这类代码,本质是PDF使用了无完整ToUnicode映射的嵌入字体,导致文本提取库无法将内部字符ID映射为可读字符。以下是针对性的解决方法:
1. 检查字体映射并尝试修复
先用PyMuPDF排查字体是否缺失映射:
import fitz doc = fitz.open("target.pdf") for page in doc: for font in page.get_fonts(): font_name = font[2] has_unicode_map = bool(font[3]) print(f"字体 {font_name}: {'含ToUnicode映射' if has_unicode_map else '无ToUnicode映射'}")
如果发现无映射的字体,可以用FontForge打开PDF中的嵌入字体,导出字符编码映射表,再编写脚本批量替换cid为对应字符。
2. 切换为OCR文本提取
如果PDF的文本层本身损坏(比如扫描件伪装成可编辑PDF),直接用OCR提取是最可靠的方式:
import fitz import pytesseract # Windows需指定Tesseract路径,Linux/Mac可省略 pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" doc = fitz.open("target.pdf") for idx, page in enumerate(doc): # 页面转图片,提高dpi提升识别精度 pix = page.get_pixmap(dpi=300) pix.save(f"page_{idx}.png") # OCR识别(中文用chi_sim,英文用eng) text = pytesseract.image_to_string(f"page_{idx}.png", lang="chi_sim") print(f"第{idx+1}页内容:\n{text}")
提前安装Tesseract OCR引擎和pytesseract、PyMuPDF库即可运行。
3. 用Ghostscript重构PDF
通过Ghostscript重新生成PDF,强制嵌入完整字体映射:
# 生成修复后的PDF gs -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dEmbedAllFonts=true -dSubsetFonts=true -o fixed.pdf target.pdf
生成的fixed.pdf再用你熟悉的Python库提取文本,大概率能正常显示。
4. 手动解析cid对应字符
如果cid数量较少,可直接通过字体对象解析映射:
import fitz import re doc = fitz.open("target.pdf") page = doc.load_page(0) text_dict = page.get_text("dict") for block in text_dict["blocks"]: for line in block.get("lines", []): for span in line.get("spans", []): raw_text = span["text"] if "(cid:" not in raw_text: continue # 获取当前span使用的字体 font = doc.get_font(span["font"]) # 替换每个cid为对应字符 cid_matches = re.findall(r"\(cid:(\d+)\)", raw_text) for cid in cid_matches: unicode_char = font.glyph_name_to_unicode(f"cid{cid}") raw_text = raw_text.replace(f"(cid:{cid})", unicode_char) print(raw_text)
内容的提问来源于stack exchange,提问作者EKatia
相关产品推荐
相关产品推荐

