PDF文字显示方块或乱码主因是字体未嵌入,解决方法有四:一、Acrobat Pro用预检工具分析并嵌入缺失字体;二、Ghostscript命令行强制嵌入所有字体;三、PDFtk配合Python脚本定制化嵌入;四、InDesign源文件重新导出并启用完整嵌入选项。

如果打开PDF文件时部分文字显示为方块或乱码,通常是因为文档中使用的字体未被嵌入,且查看设备缺少对应字体。预检工具可识别缺失字体并支持嵌入操作。以下是使用预检工具嵌入缺失字体的步骤:
一、使用Adobe Acrobat Pro进行预检与字体嵌入
Adobe Acrobat Pro内置“印刷质量”预检功能,可自动扫描PDF中未嵌入的字体,并提供嵌入选项。该方法适用于已拥有编辑权限的PDF文件,且支持TrueType和OpenType字体嵌入。
1、在Adobe Acrobat Pro中打开目标PDF文件。
2、点击右上角“工具”按钮,展开工具面板,选择“印刷制作”→“预检”。
3、在预检对话框中,点击“配置文件”下拉菜单,选择“PDF/X-4:2010”或“ISO PDF/A-1b”等含字体嵌入检查的配置文件。
4、点击“分析”按钮,等待扫描完成;若报告中标注“字体未嵌入”,则勾选该条目。
5、点击“修复”按钮,在弹出窗口中确认嵌入操作,Acrobat将尝试将缺失字体以子集形式嵌入PDF。
6、保存文件:点击“文件”→“另存为”,生成新PDF文件。
二、使用Ghostscript命令行强制嵌入所有字体
Ghostscript是一款开源命令行工具,可通过PDF重生成过程强制嵌入所有可用字体,尤其适用于无图形界面环境或批量处理场景。该方式不依赖原始编辑权限,但要求系统中已安装对应字体文件。
1、确认系统中已安装PDF内缺失字体(如SimSun、Noto Sans CJK SC等),并记录其路径。
2、打开终端或命令提示符,执行以下命令:
3、gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dEmbedAllFonts=true -dSubsetFonts=true -dCompressFonts=true -sOutputFile=output.pdf input.pdf
4、若需指定字体搜索路径,追加参数:-sFONTPATH="/usr/share/fonts:/Windows/Fonts"
5、等待命令执行完毕,检查output.pdf中文字是否正常显示。
三、使用PDFtk与字体补全脚本配合嵌入
PDFtk本身不直接嵌入字体,但可与Python脚本(如PyPDF2 + fontTools)协同工作:先用PDFtk分离含文本的页面,再通过脚本提取字体需求并调用系统字体渲染后重新合成PDF。该方法适合定制化嵌入控制,例如仅嵌入特定Unicode区段字形。
1、使用PDFtk拆分原始PDF:pdftk input.pdf burst output pg_%04d.pdf
2、运行Python脚本,调用fitz(PyMuPDF)读取每页的font_name及missing_glyphs信息。
3、脚本比对系统字体列表,定位匹配字体文件(如simhei.ttf),并调用fontTools.subset生成子集字体文件。
4、使用fitz.Page.insert_font()将子集字体注册到页面资源字典中。
5、遍历所有文本对象,将原font_ref替换为新嵌入字体的引用,并更新ToUnicode映射表。
6、合并各页生成最终PDF:pdftk pg_*.pdf cat output final.pdf
四、在InDesign中重新导出并启用字体嵌入选项
若原始PDF由Adobe InDesign生成,且保留有IDML或INDD源文件,则应优先通过设计软件重新导出,确保嵌入设置完整生效。InDesign导出引擎对CJK字体子集嵌入支持更稳定,可避免第三方工具因字体许可限制导致的嵌入失败。
1、用Adobe InDesign打开原始INDD文件。
2、点击“文件”→“导出”,格式选择“Adobe PDF(印刷)”。
3、在导出对话框中,切换至“字体”选项卡,确认“嵌入所有字体”复选框已勾选。
4、在“子集化阈值”中设为0%,确保所有字符(包括中文标点、扩展汉字)均被包含。
5、点击“导出”,在弹出的警告中确认接受字体嵌入许可提示(部分商业字体可能限制嵌入)。
6、用Adobe Reader打开新生成PDF,验证方块区域是否恢复正常显示。










