You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:57:27