TOOLPIPO LAB PDF · 19条件
PDFのフォント埋め込みあり・なしは、どう違う?
未埋め込みのHelvetica、実TTF埋め込み、subset、Type3などの自作PDFを解析し、画面に表示できることとPDF自身にフォントがあることの違いを確認しました。
公開日・検証日:2026年10月7日
結論
PDFで文字が正常に見えていても、フォントファイルがPDFに埋め込まれているとは限りません。同じToolで比較すると、未埋め込みのStandard14フォントと、実TTFを埋め込んだPDFは異なる状態になりました。
subsetは異常ではなく、Type3も通常のTrueType等とは別の仕組みです。未埋め込みなら必ず文字化けする、埋め込みありなら全環境で同じ、と判断する検査ではありません。
今回比較したPDF
- 入力
- 既存の自作19 fixture+公開サンプル。本文は主要10条件を比較。実在資料・個人情報なし。
- 使用Tool
- PDFフォント埋め込み・使用状況チェッカー。PDF.js 6.3.289。
- 実測
- 現行mainで全19件を再測定。代表6件は操作画面とも一致。Tool入力の外部送信0。
- 再現データ
- 19 PDF・README・実測JSON・ライセンス。公開サンプルはmixedと同一ハッシュです。
文字が見える=フォントが埋め込まれている、ではない
未埋め込みHelveticaのPDFにはテキストとフォント名があり、FontFileはありません。それでも、同じPDF.jsを使ったローカルChromiumの補助表示実験では「NON_EMBEDDED Helvetica」を画面に表示できました。
この表示実験は表示側のフォント利用を許可したCanvas処理です。埋め込みを調べるToolの解析設定とは分けています。別PC・Acrobat・プリンターとの見た目比較や、全環境での表示保証はしていません。
未埋め込みHelveticaと、実TTF埋め込みを確認
a-standard14.pdfは使用フォント1件、埋め込みなし候補1件。Helveticaを1ページで使用していました。独立したPDF構造の確認でもFontFileなしです。
b-embedded.pdfは使用フォント1件、埋め込みあり1件。名前はToolPipoFixtureSans-Regular、種類はTrueType、使用ページは1です。実際に有効なTrueTypeをFontFile2へ格納したfixtureを使っています。これは全glyphの完全性や印刷品質の保証とは別です。
subsetは異常ではない
c-subset.pdfは埋め込みあり1件でした。raw nameはAAAAAA+ToolPipoFixtureSans-Regular、表示名はToolPipoFixtureSans-Regular、subset tagはAAAAAA+です。
subsetは、PDFで使うglyph(文字の形)だけを含める方式として使われます。このToolは6文字の大文字英字+「+」という名前形式からsubset候補を表示します。全glyph収録内容を比較してsubsetを証明したり、必要なglyphが全て揃うと判定したりしていません。
Type3は別の仕組み
d-type3.pdfはType3 1件、通常の埋め込みあり・なしは0件でした。実際の結果表示は「Type3(PDF内のglyph定義)」です。
Type3はPDFの描画命令でglyphを定義できます。今回のfixtureは三角形を描くCharProcsを使っているため、通常のFontFile埋め込み判定とは分けます。Type3であることを危険扱いしません。
1つのPDFに埋め込みあり・なしが混在することもある
e-mixed.pdfは使用フォント2件、埋め込みあり1件、埋め込みなし候補1件でした。TrueTypeとHelveticaはどちらも1ページで使用しています。1つのPDFだから、フォント状態も1種類とは限りません。
使用ページを確認すると、PDF内の使い分けが分かる
f-page-fonts.pdfでは、埋め込みTrueTypeは1ページ、未埋め込みHelveticaは2ページでした。g-repeated.pdfの同一TrueTypeは1–3, 5–7ページに集計され、4ページのHelveticaと分かれました。同じフォントオブジェクトをページごとに別件へ増やしてはいません。
同じフォント名でも、別resourceの場合がある
duplicate-resource.pdfは同じraw nameのTrueTypeを使いますが、内部のフォントオブジェクトは別です。結果は埋め込みあり2件で、「同名のfont resourceが2件」と表示されました。
名前が同じ=PDF内部でも同じ1個のresourceとは限りません。Toolは人が読む名前だけでまとめず、内部IDを使って使用ページを集計します。
画像だけのPDFでは使用フォント0件
h-image-only.pdfは使用フォント0件で正常完了しました。今回のfixtureは色見本の画像XObjectで、文字画像をOCRした実験ではありません。
スキャンPDFなどで文字の見た目が画像として保存されている場合も、テキスト用のフォントを使用していないことがあります。画像に見える文字や書体を調べることは別の処理です。このToolはOCRしません。
未使用resourceは、初版の一覧対象ではない
unused-resource.pdfは、resource辞書に埋め込みTrueTypeと未使用Helveticaを定義しています。実際のtext描画はTrueTypeだけなので、結果は使用フォント1件、埋め込みあり1件でした。
初版は「実際にページのtext contentで使われているfont」を対象としており、未使用resourceは一覧に含めません。PDF内部に定義された全resourceを完全列挙する検査ではありません。
主要10条件で分かったことと、分からないこと
| 条件 | Tool判定 | 分かったこと | 分からないこと |
|---|---|---|---|
| 未埋め込みHelvetica | 埋め込みなし候補 | FontFileなしを構造でも確認 | 別PCでの実際の表示 |
| 実TTF埋め込み | 埋め込みあり | 利用可能なfont dataを確認 | 全glyphの完全性 |
| subset埋め込み | 埋め込みあり+subset名 | AAAAAA+という名前形式 | 必要glyphが全て揃うか |
| Type3 | Type3 | glyphをPDF描画命令で定義 | 出力品質全体 |
| 埋め込み+未埋め込み混在 | 埋め込みあり/埋め込みなし候補 | 1つのPDFに2状態 | 表示・印刷の保証 |
| ページ別フォント | 埋め込みあり/埋め込みなし候補 | 使用ページ1と2を識別 | 全ページの見た目 |
| 同じフォントを複数ページ | 埋め込みあり/埋め込みなし候補 | 1–3, 5–7に集計 | glyphの健全性 |
| 同名・別resource | 埋め込みあり/埋め込みあり | 同名でも2件として集計 | 同じ描画結果か |
| 画像だけ | 使用フォント0件 | 使用フォント0件で正常完了 | 画像内の文字・OCR |
| 未使用resource | 埋め込みあり | 未使用Helveticaは対象外 | 未使用resourceの完全列挙 |
Standard14全14種と、Arialも確認
all-standard14.pdfの全14種は埋め込みあり0件、埋め込みなし候補14件でした。以下は埋め込み解析の結果です。14種全ての表示品質を別環境で検証したという意味ではありません。
Standard14全14種の実測結果を見る
| Font | Tool判定 |
|---|---|
| Helvetica | 埋め込みなし候補 |
| Helvetica-Bold | 埋め込みなし候補 |
| Helvetica-Oblique | 埋め込みなし候補 |
| Helvetica-BoldOblique | 埋め込みなし候補 |
| Times-Roman | 埋め込みなし候補 |
| Times-Bold | 埋め込みなし候補 |
| Times-Italic | 埋め込みなし候補 |
| Times-BoldItalic | 埋め込みなし候補 |
| Courier | 埋め込みなし候補 |
| Courier-Bold | 埋め込みなし候補 |
| Courier-Oblique | 埋め込みなし候補 |
| Courier-BoldOblique | 埋め込みなし候補 |
| Symbol | 埋め込みなし候補 |
| ZapfDingbats | 埋め込みなし候補 |
Standard14以外のsystem-arial.pdfもArial、埋め込みなし候補1件でした。Standard14だけを名前で特別扱いする結果ではありません。解析ではOSのフォントを使わない設定です。
開発時に確認した全fixture
現行mainで19件を再測定しました。保護・破損・501ページは意図した拒否結果です。ページ数はPDF構造から別途取得し、Toolの解析成功と区別しています。
19 fixtureの期待値と実測値を見る
| fixture名 | ページ数 | 期待する状態 | 実際の状態 | 備考 |
|---|---|---|---|---|
a-standard14.pdf | 1 | 埋め込み0/候補1/Type3 0 | 使用1件/埋め込み0/未埋め込み候補1/Type3 0/判定不能0 | FontFileなしのHelvetica |
b-embedded.pdf | 1 | 埋め込み1/候補0/Type3 0 | 使用1件/埋め込み1/未埋め込み候補0/Type3 0/判定不能0 | 有効なTrueType FontFile2 |
c-subset.pdf | 1 | 埋め込み1/候補0/Type3 0 | 使用1件/埋め込み1/未埋め込み候補0/Type3 0/判定不能0 | AAAAAA+のsubset名 |
d-type3.pdf | 1 | 埋め込み0/候補0/Type3 1 | 使用1件/埋め込み0/未埋め込み候補0/Type3 1/判定不能0 | 実際のCharProcs描画命令 |
e-mixed.pdf | 1 | 埋め込み1/候補1/Type3 0 | 使用2件/埋め込み1/未埋め込み候補1/Type3 0/判定不能0 | 埋め込みと未埋め込みの混在 |
f-page-fonts.pdf | 2 | 埋め込み1/候補1/Type3 0 | 使用2件/埋め込み1/未埋め込み候補1/Type3 0/判定不能0 | ページ1と2で使用フォントが異なる |
g-repeated.pdf | 7 | 埋め込み1/候補1/Type3 0 | 使用2件/埋め込み1/未埋め込み候補1/Type3 0/判定不能0 | 同一フォントを1–3, 5–7ページで使用 |
h-image-only.pdf | 1 | 埋め込み0/候補0/Type3 0 | 使用0件/埋め込み0/未埋め込み候補0/Type3 0/判定不能0 | 色見本の画像XObject。文字画像やOCRの検証ではない |
duplicate-resource.pdf | 1 | 埋め込み2/候補0/Type3 0 | 使用2件/埋め込み2/未埋め込み候補0/Type3 0/判定不能0 | 同名の独立したフォントオブジェクト2件 |
unused-resource.pdf | 1 | 埋め込み1/候補0/Type3 0 | 使用1件/埋め込み1/未埋め込み候補0/Type3 0/判定不能0 | 未使用Helvetica resourceは対象外 |
all-standard14.pdf | 1 | 埋め込み0/候補14/Type3 0 | 使用14件/埋め込み0/未埋め込み候補14/Type3 0/判定不能0 | Standard14全14種。表示品質の一括検証ではない |
system-arial.pdf | 1 | 埋め込み0/候補1/Type3 0 | 使用1件/埋め込み0/未埋め込み候補1/Type3 0/判定不能0 | Arial。OSフォントを解析に使わない |
long-name.pdf | 1 | 埋め込み1/候補0/Type3 0 | 使用1件/埋め込み1/未埋め込み候補0/Type3 0/判定不能0 | 長いPDF内部フォント名 |
pages-20.pdf | 20 | 埋め込み1/候補0/Type3 0 | 使用1件/埋め込み1/未埋め込み候補0/Type3 0/判定不能0 | 同じフォントを20ページ |
pages-100.pdf | 100 | 埋め込み1/候補0/Type3 0 | 使用1件/埋め込み1/未埋め込み候補0/Type3 0/判定不能0 | 同じフォントを100ページ |
pages-501.pdf | 501 | 500ページまでのPDFに対応しています。 | 500ページまでのPDFに対応しています。 | 上限超過で拒否 |
password.pdf | 1 | パスワード付きPDFには対応していません。 | パスワード付きPDFには対応していません。 | 保護PDF。パスワードfixture-password |
malformed.pdf | 取得不能 | PDFを解析できませんでした。破損または対応外のPDFの可能性があります。 | PDFを解析できませんでした。破損または対応外のPDFの可能性があります。 | 意図した破損PDF |
security.pdf | 1 | 埋め込み1/候補1/Type3 0 | 使用2件/埋め込み1/未埋め込み候補1/Type3 0/判定不能0 | JavaScript・URI・添付を含む。開かず検査する |
使用ページ・raw name・内部IDの詳細を見る
| fixture | フォント名 | 状態 | 使用ページ | 内部ID |
|---|---|---|---|---|
a-standard14.pdf | Helvetica | 埋め込みなし候補 | 1 | g_d0_f1 |
b-embedded.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d1_f1 |
c-subset.pdf | AAAAAA+ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d2_f2 |
d-type3.pdf | Type3 | Type3 | 1 | g_d3_f1 |
e-mixed.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d4_f1 |
e-mixed.pdf | Helvetica | 埋め込みなし候補 | 1 | g_d4_f2 |
f-page-fonts.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d5_f1 |
f-page-fonts.pdf | Helvetica | 埋め込みなし候補 | 2 | g_d5_f2 |
g-repeated.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1–3, 5–7 | g_d6_f1 |
g-repeated.pdf | Helvetica | 埋め込みなし候補 | 4 | g_d6_f2 |
duplicate-resource.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d8_f1 |
duplicate-resource.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d8_f2 |
unused-resource.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d9_f1 |
all-standard14.pdf | Helvetica | 埋め込みなし候補 | 1 | g_d10_f1 |
all-standard14.pdf | Helvetica-Bold | 埋め込みなし候補 | 1 | g_d10_f2 |
all-standard14.pdf | Helvetica-Oblique | 埋め込みなし候補 | 1 | g_d10_f3 |
all-standard14.pdf | Helvetica-BoldOblique | 埋め込みなし候補 | 1 | g_d10_f4 |
all-standard14.pdf | Times-Roman | 埋め込みなし候補 | 1 | g_d10_f5 |
all-standard14.pdf | Times-Bold | 埋め込みなし候補 | 1 | g_d10_f6 |
all-standard14.pdf | Times-Italic | 埋め込みなし候補 | 1 | g_d10_f7 |
all-standard14.pdf | Times-BoldItalic | 埋め込みなし候補 | 1 | g_d10_f8 |
all-standard14.pdf | Courier | 埋め込みなし候補 | 1 | g_d10_f9 |
all-standard14.pdf | Courier-Bold | 埋め込みなし候補 | 1 | g_d10_f10 |
all-standard14.pdf | Courier-Oblique | 埋め込みなし候補 | 1 | g_d10_f11 |
all-standard14.pdf | Courier-BoldOblique | 埋め込みなし候補 | 1 | g_d10_f12 |
all-standard14.pdf | Symbol | 埋め込みなし候補 | 1 | g_d10_f13 |
all-standard14.pdf | ZapfDingbats | 埋め込みなし候補 | 1 | g_d10_f14 |
system-arial.pdf | Arial | 埋め込みなし候補 | 1 | g_d11_f1 |
long-name.pdf | ToolPipoLongFontNameVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLong | 埋め込みあり | 1 | g_d12_f1 |
pages-20.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1–20 | g_d13_f1 |
pages-100.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1–100 | g_d14_f1 |
security.pdf | ToolPipoFixtureSans-Regular | 埋め込みあり | 1 | g_d18_f1 |
security.pdf | Helvetica | 埋め込みなし候補 | 1 | g_d18_f2 |
内部IDはPDF.jsの読込順などで変わる場合があり、ファイルをまたぐ同一性の証明には使えません。
「埋め込みなし候補」と表示する理由
表示は「埋め込みなし候補・代替フォントに依存する可能性」です。利用可能なfont fileを確認できない理由には、元からない場合のほか、破損フォント、対応外構造、parser上の取得不能もあり得ます。
未埋め込みは、表示環境によって代替フォントが使われる可能性を考える材料の1つです。文字化けやレイアウト崩れをこの検査だけで予測することはできません。
このToolで分からないこと
- 別PC・Adobe Acrobatの最終表示、プリンターの出力結果
- glyphの完全性、ToUnicodeの正しさ、フォントデータ破損の完全検査
- フォントライセンス、埋め込み権限、商用利用条件、PDF/A適合
- 未使用resourceの完全列挙、OCR画像内のフォント
埋め込みありは、埋め込み権限ありという意味ではありません。
自分のPDFの使用フォントを確認する
PDFを入れると、使用フォント・状態・subset名・使用ページをブラウザ内で確認できます。本文・フォントバイナリの外部送信や抽出保存はしません。
自分のPDFの使用フォントを確認する再現ファイルと実測JSON
19条件のPDFと実測結果をダウンロード/公開results JSON/fixtureフォントのライセンス
全て自作の合成資料です。font binary単体は配布せず、ライセンスに従ってPDFへ埋め込まれたものだけを含めます。security.pdfには検証用JavaScript・URI・添付があります。実行・展開せずToolで検査してください。保護PDFの検証パスワードはREADMEに記載しています。
package:500,207 bytes
SHA-256:c6324f76081c392cbb0d9ee95b8b05bf04f25ed8d87d3ffbc569fb7576361f6c
循環参照を避け、ZIP自身の最終ハッシュは外部の公開JSONを正本とします。同梱JSONは同じ測定値のsnapshotです。
検証条件・実装資料
測定時のToolはcommit 525eb505b602779cc58fdb07367f97875715b1ba、PDF.js 6.3.289です。ページごとに描画命令を読み、text itemのfontNameとcommonObjsを対応させます。
fontExtraProperties: true、disableFontFace: true、useSystemFonts: false、useWorkerFetch: false、enableXfa: false、isEvalSupported: false。Standard14用の内部font data URLは指定しません。表示のための代替フォントを「PDF自身の埋め込みフォント」と誤認しないためです。
font objectの実測値とclassifierを見る
| fixture | font名 | missingFile | dataあり | Type3 | type | systemFontInfo |
|---|---|---|---|---|---|---|
| a-standard14.pdf | Helvetica | true | false | false | Type1 | false |
| b-embedded.pdf | ToolPipoFixtureSans-Regular | false | true | false | TrueType | false |
| c-subset.pdf | AAAAAA+ToolPipoFixtureSans-Regular | false | true | false | TrueType | false |
| d-type3.pdf | Type3 | false | false | true | Type3 | false |
- font objectを取得できない・error・invalid PDF.js font・system font情報ありは「判定不能」。
isType3Font === trueはType3。通常分類と分けます。- 必要なType3フラグ・missingFile・type情報が不足する場合は「判定不能」。
missingFile === trueかつ利用可能なUint8Arrayデータなしは「埋め込みなし候補」。dataもある矛盾した状態は「判定不能」。missingFile === falseかつ利用可能なUint8Arrayデータありは、固定設定の実fixture検証に基づき「埋め込みあり」。dataなしは「判定不能」。
font.data単独では判定していません。PDF.jsの内部Standard14 fontやsystem substitutionを原本のfont streamと混同しない条件で照合します。data.lengthは変換後データの可能性があるため、原本に埋め込まれた容量として表示しません。