結論先行:PDF字体子集化能减小90%サイズ,根本原因是中文字体动辄15-20MB,而文档实际只用到一2千つ字符。子集化的核心原理是三步——扫描文档中实际使用的字符集合、重建CMap映射表、重排字形索引破棄未用字形。思源宋体完整ファイル18MB,子集化后仅0.4MB,降幅97.7%。以下では字体ファイル構造から説明し,詳解子集化的技術原理,并附三款字体的实测比較データ。
もしPDF圧縮的整体方法まだ慣れていない場合は,まずPDF圧縮原理与方法詳解。
一、字体ファイル構造:である什么中文嵌入字体那么大
要理解子集化である什么有效,先得搞清楚字体ファイル里装了什么。TrueType(.ttf)和OpenType(.otf)字体ファイル由多张データ表グループ成,每张表负责不同機能。嵌入PDF时,この些表被完整打包进ファイル,不管文档用了几つ字。
| データ表 | 機能 | 典型占比 | 子集化能否裁剪 |
|---|---|---|---|
| cmap | 字符エンコード到字形索引的映射 | 1%–3% | 需重建 |
| glyf | TrueType字形轮廓データ | 70%–85% | 可大幅裁剪 |
| CFF | OpenType CFF字形轮廓(PostScript) | 60%–80% | 可大幅裁剪 |
| loca | 字形データ位置索引 | 1%–2% | 需重建 |
| hmtx | 水平度量(字宽/前进量) | 2%–5% | 需重建 |
| name | 字体名称、版权等元信息 | 0.5%–1% | 保持 |
| post | PostScript名称映射 | 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 0 | 0–255 | 单字节ASCII/Latin | 裁剪未用条目 |
| Format 4 | BMP基本平面 | 中日韩常用字符 | 重建区段表 |
| 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つ。
| 字体 | 元ファイル | 字形数(元) | 字形数(子集) | 子集化后 | 降幅 |
|---|---|---|---|---|---|
| 思源宋体 Regular | 18.2MB | 65535 | 1342 | 0.42MB | 97.7% |
| 微软雅黑 Regular | 15.6MB | 28622 | 1342 | 0.35MB | 97.8% |
| Arial Regular | 0.82MB | 3257 | 96 | 0.06MB | 92.7% |
实测データ表示,中文字体子集化効果最である显著——思源宋体から18.2MB降到0.42MB,降幅97.7%。この是因である中文字体字形多(6万+)但文档用到的少(1000+),裁剪空間巨大。英文字体Arial元仅0.82MB,子集化后0.06MB,降幅92.7%,绝に対してサイズ虽小但比例同样可观。
再看不同字符使用量下的子集化効果,以思源宋体である例:
| 文档タイプ | 使用字符数 | 子集化后サイズ | 降幅 | 説明 |
|---|---|---|---|---|
| 短通知(1页) | 约200 | 0.08MB | 99.6% | 字符极少,子集极小 |
| 会议纪要(10页) | 约600 | 0.19MB | 99.0% | 日常办公文档 |
| 投标书(50页) | 约1342 | 0.42MB | 97.7% | 专业文档字符覆盖广 |
| 技術手册(200页) | 约2800 | 0.85MB | 95.3% | 字符使用量大 |
| 百科全书(1000页) | 约6500 | 1.92MB | 89.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以上の形式に対応。ローカル圧縮でデータは外部に送信されません。