# NotoEmoji-Regular の埋め込みサブセットが複数表示される件の調査報告

UIGraphicsPDFRenderer で作ったPDFの文書プロパティに、NotoEmoji-Regular の埋め込みサブセットが複数表示された。 同じフォントの複数サブセットはPDFで許容される構成で、表示・印刷・埋め込み検証に問題がなければ不具合ではない。 ただし、Quartzがサブセットを分割する条件を明記したApple公式文書は見つからなかった。

# pdffonts では接頭辞の異なる NotoEmoji-Regular が並んでいた

対象のPDFは次のファイルである。

all_emoji_noto_only_list_20260621155521.pdf

pdffonts で確認すると、異なるサブセット接頭辞を持つ NotoEmoji-Regular が複数埋め込まれていた。

AAAAAE+NotoEmoji-Regular
AAAAAF+NotoEmoji-Regular
...

各フォントは次の状態である。

type: TrueType
embedded: yes
subset: yes
ToUnicode: yes

同じファミリー名が誤って重複表示されているわけではない。 異なるサブセット名を持つ、複数の独立したPDFフォントリソースとして格納されている。

# 同じフォントの複数サブセットがPDFで正常に存在する根拠

# Adobe Community:同じフォントファミリーでも複数の埋め込みサブセットになるのは既知の挙動

Adobe Communityの回答では、PDFの編集やフォント置換時の挙動が説明されている。 Acrobatは複数の埋め込みフォントサブセットを作り、同じファミリーでも文書プロパティでは別項目として表示する。 回答の要点は次のとおりである。

  • 「known and expected behavior」である
  • 同じフォントファミリーでも、複数の埋め込みサブセットが作成される
  • エンコーディングが異なる場合もある
  • 文書プロパティのFonts一覧では別項目として表示される

この資料はQuartz固有の説明ではない。 しかし、同一フォントの複数サブセットがPDFに正常に存在し得ることを直接示している。

確認した箇所は次のとおりである。

This is a known and expected behavior when editing fonts in PDFs.
When text is edited or fonts are replaced, Acrobat often creates
multiple embedded font subsets, sometimes with different encodings.
Even if it’s the same font family, these appear as separate entries
in Menu > Properties > Fonts.

# pdfRest 公式ドキュメント:同じフォントが複数のサブセットとして格納される場合がある

pdfRestの公式ドキュメントは、PDF最適化機能 consolidate-duplicate-fonts を説明している。 その中で、PDFに同一フォントの複数コピーが含まれる場合について明記している。

  • PDFは同じフォントを複数コピーとして含む場合がある
  • その形態には「複数のサブセット」が含まれる
  • 必要に応じて、それらを単一のフォントへ統合できる

複数サブセットは、壊れたPDFにだけ現れる構造ではない。 PDF最適化製品が通常の入力として想定している構造である。

該当する説明は次のとおりである。

Sometimes PDF documents are created with multiple copies of the same font,
either as multiple subsets or multiple, fully embedded copies of a font file.
When multiple copies of the same font appear, they may be merged into a single font.

# PDF Association:PDFではページのリソース辞書からフォントリソースを参照する

PDF Associationの資料では、PDFページが内部名でフォントリソースを参照する構造が説明されている。

/F25 12 Tf
/Resources << /Font << /F25 12 0 R >> >>

PDFの各ページはリソース辞書を持てる。 フォントはPDFオブジェクトとして管理される。 そのため、同じベースフォント由来でも、別のフォントオブジェクトや別のサブセットとして登録できる。

# PDF Association:シンプルフォントと複合フォントのグリフ数

同じ資料では、フォントタイプによって扱えるグリフ数が異なることも説明されている。

Simple fonts:
1 byte character codes can address max. 256 glyphs

Composite fonts:
1 or 2 byte character codes can address max. 65535 glyphs

これは、すべてのPDFサブセットが必ず256グリフごとに分割されるという意味ではない。 この資料から言えるのは次の3点である。

  • PDFのシンプルフォントは、1つのエンコーディングで最大256グリフを扱う
  • Type 0/CIDの複合フォントは、より多くのグリフを扱える
  • PDF生成エンジンは、フォント形式やエンコーディング、描画方法に応じて複数のフォントリソースを生成できる

対象PDFの pdffonts 結果は TrueType / WinAnsi と表示されている。 複数のTrueTypeサブセットへ分割されている構成と整合する。

# PDFDancer:サブセットは閲覧用途では正常

PDFDancerの技術解説によると、多くのPDFは完全なフォントではなくサブセットを埋め込む。 サブセットには、文書内で使ったグリフだけが含まれる。

閲覧については次のように説明されている。

For viewing, this is fine.
The PDF only draws glyphs that exist in the subset,
so it always looks correct.

サブセットフォントは、閲覧用PDFとして正常な設計である。 問題になるのは、主に後から文言を編集し、サブセットにないグリフを追加しようとする場合である。

# Apple Support Community:macOS PDF で大量の重複・サブセットフォントが生じた事例

Apple Support Communityには、Previewで保存したPDFに同じフォントが多数埋め込まれた事例がある。

この事例は極端な大量重複であり、正常性を直接保証する資料ではない。 ただし、macOSのPDF生成経路で、同じフォント由来の複数フォントリソースが作られる事例は確認できる。

# Mac OS X Preview と「multiple font subsets」

Mac OS X Previewが複数のフォントサブセットを使うことを述べた記事がある。 記事の趣旨は次のとおりである。

  • Adobe PDF標準には、multiple font subsetsの仕組みがある
  • Mac OS X Previewは、PostScriptからPDFへの変換やPDF保存でそれを使う
  • 一部の印刷サービスが対応していない場合があった

Apple公式資料ではないが、Quartz/Preview系のPDFで複数サブセットが生成される実例である。

# サブセット名の接頭辞はサブセットを区別するタグ

PDFのサブセットフォントは、通常、フォント名の前に英字の接頭辞と + が付く。

AAAAAE+NotoEmoji-Regular
AAAAAF+NotoEmoji-Regular

NotoEmoji-Regular がベースフォント名である。 AAAAAE+ や AAAAAF+ の部分は、それぞれのサブセットを区別するタグである。 ベースフォント名が同じでも、接頭辞が異なればPDF内では別のサブセットフォントとして扱われる。 この説明は、前述のPDFDancerの技術解説による。

# 問題の有無は複数サブセットの有無ではなく表示・印刷・検証で判断する

複数サブセットが存在すること自体ではなく、次の観点でPDFを検証する。

# 問題なしと判断できる状態

  • Acrobat Readerで全ページが正常に表示される
  • 対象の絵文字が欠落していない
  • 文字化けや別グリフへの置換がない
  • 印刷プレビューと実際の印刷で正常に出力される
  • pdffonts で対象フォントの emb が yes
  • pdffonts で対象フォントの sub が yes
  • 必要に応じて uni が yes
  • Acrobat PreflightやveraPDFなどで重大なエラーが出ない
  • ファイルサイズが業務要件内に収まっている

# 問題として扱う状態

  • 絵文字が豆腐文字、四角、別の記号になる
  • 一部のページだけフォントが欠落する
  • 印刷すると文字化けする
  • サブセットが異常に大量に生成され、ファイルサイズが著しく増える
  • PDF/AやPDF/Xなど、必要な規格の検証に失敗する
  • PDFを後から編集する際、サブセットにない文字を入力できない
  • 印刷会社や外部システムが複数サブセットを処理できない

# Acrobat Readerでは接頭辞が省略されて同じ名前に見える

Acrobat Readerの「文書のプロパティ」→「フォント」に、次のような表示が複数並ぶ場合がある。

NotoEmoji-Regular
種類: TrueType
エンコーディング: ANSI
実際のフォント: NotoEmoji-Regular
実際のフォントの種類: TrueType
埋め込みサブセット

同じ表示が複数あっても、内部の完全なPDFフォント名は次のように異なる可能性がある。

AAAAAE+NotoEmoji-Regular
AAAAAF+NotoEmoji-Regular
AAAAAG+NotoEmoji-Regular

Acrobatの画面では、サブセット接頭辞が省略・簡略表示されることがある。 そのため、画面上で同じ名前が並んで見えても、内部では異なるフォントオブジェクトである。

内部の名前は次のコマンドで確認できる。

pdffonts all_emoji_noto_only_list_20260621155521.pdf

macOSで pdffonts がない場合は、Popplerを導入する。

brew install poppler

# Quartzがサブセットを分割する単位は公開資料では特定できなかった

次の説明は、公開資料で直接確認できた範囲を超える。

# 根拠がなく断定できない説明

Quartz は、必ずページ単位で NotoEmoji-Regular のサブセットを生成する。
Quartz は、必ず 256 グリフごとにサブセットを分割する。

今回確認したPDFでは、複数の TrueType / WinAnsi サブセットが生成されている。 しかし、Quartzの内部アルゴリズムが何を基準に分割したかは、公開API文書だけでは特定できない。 考えられる基準は次のとおりである。

  • ページ単位
  • 描画セッション単位
  • テキストラン単位
  • エンコーディングの上限
  • グリフセットの上限
  • Core Textのフォントフォールバック単位
  • Quartz内部のフォントキャッシュ単位

次の内容を明記したApple公式文書も、確認できた範囲では見つからなかった。

UIGraphicsPDFRenderer または Quartz PDFContext は、一定数のグリフごと、またはページごとに、同じ TrueType フォントを複数のサブセットへ分割する。

筆者の考えでは、この点は断定しない方が安全である。

# 報告で使う説明文

UIGraphicsPDFRenderer/Quartz PDFContext が生成した PDF では、
同じ NotoEmoji-Regular が異なるサブセットフォントリソースとして
複数埋め込まれる場合があります。

PDF では同一ベースフォントの複数サブセットを保持でき、
Adobe 系資料や PDF 最適化製品もこの構造を通常の PDF 構成として扱っています。

したがって、表示・印刷・埋め込み検証に問題がなければ、
文書プロパティに複数の NotoEmoji-Regular 埋め込みサブセットが
表示されること自体は不具合ではありません。

# 調査で参照した資料の一覧

本文で触れた資料に加え、同じフォントの重複埋め込みに関する事例も参照した。