PDF字体子集化原理:である什么能减小90%サイズ

結論先行:PDF字体子集化能减小90%サイズ,根本原因是中文字体动辄15-20MB,而文档实际只用到一2千つ字符。子集化的核心原理是三步——扫描文档中实际使用的字符集合、重建CMap映射表、重排字形索引破棄未用字形。思源宋体完整ファイル18MB,子集化后仅0.4MB,降幅97.7%。以下では字体ファイル構造から説明し,詳解子集化的技術原理,并附三款字体的实测比較データ。

もしPDF圧縮的整体方法まだ慣れていない場合は,まずPDF圧縮原理与方法詳解

一、字体ファイル構造:である什么中文嵌入字体那么大

要理解子集化である什么有效,先得搞清楚字体ファイル里装了什么。TrueType(.ttf)和OpenType(.otf)字体ファイル由多张データ表グループ成,每张表负责不同機能。嵌入PDF时,この些表被完整打包进ファイル,不管文档用了几つ字。

データ表機能典型占比子集化能否裁剪
cmap字符エンコード到字形索引的映射1%–3%需重建
glyfTrueType字形轮廓データ70%–85%可大幅裁剪
CFFOpenType CFF字形轮廓(PostScript)60%–80%可大幅裁剪
loca字形データ位置索引1%–2%需重建
hmtx水平度量(字宽/前进量)2%–5%需重建
name字体名称、版权等元信息0.5%–1%保持
postPostScript名称映射1%–3%部分裁剪

上の表から分かるように、字形轮廓データ(glyf表或CFF表)占了字体ファイル60%–85%的サイズ。一つ中文字体含む2万到7万つ字形,每つ汉字的矢量轮廓データ平均300–600字节,合计である是10–20MB。而一部50页的PDF文档通常只用到800–2000つ不同字符,意味着95%以上的字形データ是浪费的——この正是子集化的圧縮空間所在。

二、子集化原理:三步裁剪未用字形

字体子集化的核心思路是:只保持文档实际用到的字形,破棄其余。実現プロセス分三つ重要ステップ,每步都涉及字体表構造的精确操作。

ステップ操作原理処理的データ表
1. 字符使用扫描遍历PDF所有页面コンテンツ流,提取表示的字符エンコードを通じて解析文本操作符(Tj/TJ)收集Unicode码点无(生成字符集合)
2. CMap表重建根据使用字符重建エンコード到字形索引的映射仅保持使用字符的映射条目,削除其余cmap
3. 字形索引重映射を使用字形连续重排,更新所有引用索引原索引可能不连续,重排后索引0到N连续glyf/CFF, loca, hmtx

1. 字符使用扫描

第一步是扫描PDF文档,找出所有实际表示的字符。PDF中的文字を通じて文本操作符(Tj表示字符串、TJ表示数グループ)写入コンテンツ流,每つ字符に対して应一つエンコード。子集化ツール遍历所有页面的コンテンツ流,提取この些エンコード,再を通じて字体当前的CMap表変換であるUnicode码点,最终得到一つ"已使用字符集合"。

扫描时また需要処理特殊情况:ToUnicode CMap(反向映射)、多字节エンコード(CJK字体常用)、嵌入字体的子集化前缀(六字符+号形式)。一部50页中文PDF通常扫描出800–2000つ不同Unicode字符,加上标点和数字,总计约1000–2500つ字形需要保持。

2. CMap表重建

CMap表是字体的"目录",记录每つ字符エンコードに対して应的字形索引(glyph ID)。元中文字体的CMap表含む2万到7万条映射,子集化后只保持使用字符に対して应的条目。重建时また需要処理多種類エンコード子表形式。

CMap子表形式エンコード範囲用途子集化処理
Format 00–255单字节ASCII/Latin裁剪未用条目
Format 4BMP基本平面中日韩常用字符重建区段表
Format 12全Unicode覆盖所有字符裁剪未用区段

3. 字形索引重映射

この是最重要也最複雑的一步。元字体中字形索引(GID)から0到N连续排列,但需要保持的字形可能分散在各处。重映射である是を保持的字形按新顺序连续排列:原GID 0(.notdef)保持不变,原GID 1523可能变成新GID 1,原GID 8944变成新GID 2,以此类推。

重映射后需要同步更新所有引用GID的表:glyf表(或CFF表)只保持に対して应字形データ并按新索引排列、loca表重建位置索引、hmtx表重建水平度量データ、post表更新PostScript名称映射。この一步処理不当会导致字体损坏,因此需要严格遵循OpenType规范。

三、实测データ:三款字体子集化前后比較

我たち选取三款常用字体行う子集化实测,分别代表中文字体(思源宋体、微软雅黑)和英文字体(Arial)。テスト文档である50页中文投标书,使用字符数1342つ。

字体元ファイル字形数(元)字形数(子集)子集化后降幅
思源宋体 Regular18.2MB6553513420.42MB97.7%
微软雅黑 Regular15.6MB2862213420.35MB97.8%
Arial Regular0.82MB3257960.06MB92.7%

实测データ表示,中文字体子集化効果最である显著——思源宋体から18.2MB降到0.42MB,降幅97.7%。この是因である中文字体字形多(6万+)但文档用到的少(1000+),裁剪空間巨大。英文字体Arial元仅0.82MB,子集化后0.06MB,降幅92.7%,绝に対してサイズ虽小但比例同样可观。

再看不同字符使用量下的子集化効果,以思源宋体である例:

文档タイプ使用字符数子集化后サイズ降幅説明
短通知(1页)约2000.08MB99.6%字符极少,子集极小
会议纪要(10页)约6000.19MB99.0%日常办公文档
投标书(50页)约13420.42MB97.7%专业文档字符覆盖广
技術手册(200页)约28000.85MB95.3%字符使用量大
百科全书(1000页)约65001.92MB89.5%接近极限覆盖率

四、子集化ツール比較与シナリオ推奨

字体子集化有多種類ツール可选,から开源命令行ツール到商业圧縮引擎,各有优劣。下表比較主流ソリューション。

ツール子集化能力CFFサポートバッチ量処理集成难度
SmartSlim★★★★★サポートSDK/API/桌面
fonttools (Python)★★★★☆需脚本中等
Adobe Acrobat★★★★☆有限GUI操作
Ghostscript★★★☆☆部分サポート命令行
在线ツール★★☆☆☆部分不サポート低(有隐私风险)

SmartSlim 基于自研 Rust 圧縮引擎,在子集化时自動処理TrueType和OpenType CFF2種類字形形式,サポートバッチ量拖拽処理数百つPDF。更重要的是,整つ子集化プロセス在ローカル完成,字体データ和文档コンテンツ不经过任何外部サービス器,に対して涉密文档和企業敏感ファイル尤である重要。

不同シナリオ的子集化戦略推奨:

シナリオ是否推奨子集化注意事項目推奨ツール
终稿アーカイブ分发强烈推奨子集化后不可编辑新字符SmartSlim
企業バッチ量アーカイブ强烈推奨用API自動化バッチ量処理智压通サービス器版
在线发布/预览推奨减小ダウンロードサイズ向上読み込み速度fonttools脚本
仍需编辑的草稿不推奨保持完整字体以便编辑暂不子集化
涉密/机密文档推奨必须ローカル処理,禁用在线ツールSmartSlim

更多PDF最適化技巧,を参照してくださいPDF线性化最適化指南Word文档圧縮方法

五、よくある質問FAQ

Q1:PDF字体子集化会影响表示効果吗?

不会。字体子集化只破棄文档中未使用的字符和字形データ,保持的字符与原字体完全一致,表示効果零影响。子集化后字体仍是矢量轮廓,放大缩小不失真,颜色粗细等属性也保持不变。唯一制限是子集化后的字体只能用于该文档,无法在其他文档中复用。

Q2:字体子集化能减小多少サイズ?

取决于字符使用量与原字体大小的比值。中文字体(如思源宋体18MB)通常只用1000-2000つ字符,子集化后サイズ降至0.3-0.8MB,降幅95%以上。英文字体(如Arial 0.8MB)使用字符更少,子集化后0.05-0.1MB,降幅约90%。字体越大、使用字符越少,子集化効果越显著。

Q3:子集化后的PDFまた能编辑文字吗?

有制限。子集化只保持了文档已使用的字符,如果编辑时输入了新字符(原文档中未出现的字),该字符を无法表示,会表示である方框或空白。因此子集化適した终稿アーカイブ和分发,不適した仍需大量编辑的文档。若需编辑,推奨保持完整字体或重新嵌入子集。

Q4:如何確認PDF是否已经做了字体子集化?

用Adobe Acrobat打开PDF,点击ファイル-属性-字体,查看嵌入字体列表。如果字体名称带有六字符前缀(如ABCDEO+思源宋体),説明已子集化。也可以用SmartSlim 打开PDF,引擎会自動分析字体嵌入状态并ヒント是否需要子集化,同时に出预估圧縮サイズ。

まとめ

PDF字体子集化是减小PDFサイズ最有效的手段之一,尤其に対して嵌入中文字体的文档効果显著。核心原理是三步操作:扫描使用字符、重建CMap映射表、重排字形索引破棄未用字形。实测データ表示,思源宋体18MB子集化后仅0.4MB,降幅97.7%,且に対して表示効果零影响。

实操推奨:终稿分发前务必做字体子集化,涉密文档用ローカルツール処理。如果你需要バッチ量処理PDFファイル,SmartSlim サポート PDF/画像/動画/Office/OFD 等 10 大类 40+ 形式,基于自研 Rust 圧縮引擎自動完成字体子集化,データ不出域。

ファイルを圧縮してみませんか?SmartSlimを試す

独自開発のRust圧縮エンジンに基づき、PDF/画像/動画/Office/OFDなど10分野40以上の形式に対応。ローカル圧縮でデータは外部に送信されません。