Pro エディション
Font Tools
NextPDF Pro は、埋め込みフォントプログラムを検査し、標準的な命名規則によってサブセットフォントを識別して、推定サイズ影響を含む構造化されたデサブセット化計画を生成します。
利用可否とライセンス
「利用可否とライセンス」という見出しのセクションこの機能は NextPDF Pro(nextpdf/pro)に同梱され、Pro ティアのライセンスエンベロープで有効化されます。そのエンタイトルメントを持たないデプロイでは、この機能のクラスは読み込まれません。エディションを比較してライセンスを取得する。
このモジュールをゲートする機能ごとのライセンスフラグはありません。Font Tools のクラスは nextpdf/pro がインストールされていれば常に利用できます。
インストール
「インストール」という見出しのセクションcomposer require nextpdf/pro:^3概念の概要
「概念の概要」という見出しのセクションPDF 内のサブセットフォントは、ドキュメントが使用するグリフのみを埋め込みます。規約により、その /BaseFont 名は 6 文字の大文字タグの後に + を続けて保持します。たとえば ABCDEF+Arial です。NextPDF Pro は次のことを行います。
- サブセットを検出する。
FontDesubsetterは、生 PDF データから/BaseFontエントリをスキャンし、サブセットのプレフィックスパターンを認識して、各エントリを、元のファミリー名、サブセットグリフ数、フルグリフ数、エンコーディングを持つSubsetInfo値オブジェクトとしてレポートします。 - デサブセット化を計画する。
DesubsetPlanは、フルフォントプログラムでの置き換えを対象とするサブセットフォントを収集し、推定バイトサイズ増加をレポートします。これにより、実行に移す前に、デサブセット化がファイルサイズのコストに見合うかどうかを判断できます。
Font Tools は分析と計画のレイヤーです。何が存在し、デサブセット化に何のコストがかかるかを記述します。フォントプログラム自体を書き換えることはありません。
なぜこの仕組みなのか
「なぜこの仕組みなのか」という見出しのセクション埋め込みフォントプログラムを書き換えることは、難しく、リスクの高い部分です。グリフのアウトライン、ヒンティング、cmap テーブルは整合を保たねばならず、1 つのミスがレンダリングを破損させます。そこで NextPDF Pro は、安価で安全な作業(インベントリとコスト見積もり)を、その高価な書き換えから切り離します。スキャナーはバイトを読み取るだけで、フォントプログラムを解析したり実行したりすることは決してないため、決定論的で副作用がありません。グリフ数とサイズ差分は意図的にヒューリスティックとしてラベル付けされており、モジュールが計測できない数値を信頼するのではなく、キャパシティの判断を誠実に保ちます。これにより、フルフォントプログラムを調達する前に、デサブセット化がコストに見合うかどうかを判断できます。
設計の背景: Fonts: the hard part。
API サーフェス
「API サーフェス」という見出しのセクション| クラス | 責務 |
|---|---|
FontDesubsetter | PDF データをスキャンしてサブセットフォントエントリをレポート。 |
SubsetInfo | 検出された 1 つのサブセットの不変の記述。 |
DesubsetPlan | 対象のサブセットと推定サイズ増加。 |
コードサンプル — クイックスタート
「コードサンプル — クイックスタート」という見出しのセクションuse NextPDF\Pro\FontTools\FontDesubsetter;
$subsets = (new FontDesubsetter())->analyzeSubsets($pdfBytes);foreach ($subsets as $info) { echo $info->baseFont . ': ' . $info->subsetGlyphCount . " glyphs\n";}コードサンプル — 本番
「コードサンプル — 本番」という見出しのセクションuse NextPDF\Pro\FontTools\FontDesubsetter;
$desubsetter = new FontDesubsetter();$subsets = $desubsetter->analyzeSubsets($pdfBytes);$logger->info('fonttools.scan', ['subset_count' => count($subsets)]);エッジケースと落とし穴
「エッジケースと落とし穴」という見出しのセクション- スキャナーは、6 文字のプレフィックスを持たない
/BaseFontを、スキップするのではなく非サブセットエントリとしてレポートします。 - 推定サイズ増加は、計測値ではなく、グリフあたりの平均バイト数に基づくヒューリスティックです。
- 検出は
/BaseFontエントリのバイト表現に対して機能します。暗号化された、または高度に圧縮されたオブジェクトストリームは、先にデコードが必要な場合があります。
パフォーマンス
「パフォーマンス」という見出しのセクションサブセットのスキャンは PDF バイト長に対して線形です。計画は、検出されたサブセットの数に対して線形です。
セキュリティに関する注意
「セキュリティに関する注意」という見出しのセクションFont Tools は構造メタデータのみを読み取ります。フォントプログラムを実行したり、外部フォント参照を解決したりはしません。
| 振る舞い | 参照 | ステータス |
|---|---|---|
| サブセットフォントの命名規則 | ISO 32000-2 §9.9.2 | 整合(言い換え) |
振る舞いの契約
「振る舞いの契約」という見出しのセクションFontDesubsetter::analyzeSubsets()は、生 PDF データから/BaseFontエントリをスキャンし、6 文字の大文字に+を続けたサブセットプレフィックスを認識して、各エントリを、元のファミリー名、サブセットグリフ数、フルグリフ数、エンコーディングを持つ不変のSubsetInfoとして返します。- サブセットプレフィックスを持たない
/BaseFontは、スキップされるのではなく非サブセットエントリとしてレポートされます。 DesubsetPlanは、置き換えの対象とするサブセットを収集し、グリフあたりの平均バイト数に基づく推定バイトサイズ増加をレポートします。これは計測値ではなくヒューリスティックです。- これは分析と計画のレイヤーです。何が存在し、デサブセット化に何のコストがかかるかをレポートします。フォントプログラムの書き換え、フォントプログラムの実行、外部フォント参照の解決のいずれも行いません。
Enterprise の境界に関する注意
「Enterprise の境界に関する注意」という見出しのセクションEnterprise は Font Tools の振る舞いを変更しません。Enterprise は別途文書化された上位ティアの機能を追加しますが、それらはサブセット検出やデサブセット計画には必要ありません。
Core のフォールバック/代替手段
「Core のフォールバック/代替手段」という見出しのセクションNextPDF Core のオープンソースのフォントパイプラインは、基本的なフォント埋め込みを処理します。サブセットの計上とデサブセット計画は Pro の追加機能です。/modules/font/ を参照してください。
公開範囲の境界
「公開範囲の境界」という見出しのセクションこのページは、外部から観測可能な振る舞いと、サポートされる公開 API サーフェスのみを記述します。内部の名前空間パス、ヘルパークラス、メカニズムの表、ランブックのファイル名、チケットのプレフィックスは対象外です。
- Font Tools — Deep Reference — API 契約、振る舞い、障害モード。
- Optimizer — ファイルサイズの最適化。
- Core font module — オープンソースのフォント処理。