Pro エディション
Font Tools — 詳細リファレンス
このページは、NextPDF Pro Font Tools のコントラクトレベルのリファレンスです。その表面は 1 つのスキャナー NextPDF\Pro\FontTools\FontDesubsetter と、2 つのイミュータブルな値オブジェクト SubsetInfo および DesubsetPlan です。スキャナーは生の PDF バイト列を読み取り、すべての個別の /BaseFont エントリを報告し、ISO 32000-2:2020 §9.9.2 のサブセット命名規約に従うエントリにフラグを立てます。計画はフラグ付けされたサブセットを集約し、完全なフォントプログラムを復元する際のバイトコストを見積もります。このモジュールは分析と見積もりのみを行い、埋め込みフォントプログラムを書き換えることは決してありません。このページでは、公開 API、観測可能な挙動コントラクト、および失敗モードを述べます。
提供状況とライセンス
「提供状況とライセンス」という見出しのセクションこの機能は NextPDF Pro(nextpdf/pro)で提供され、Pro ティアのライセンスエンベロープでアクティブ化されます。そのエンタイトルメントを持たないデプロイでは、この機能のクラスはロードされません。エディションを比較してライセンスを取得する。
このモジュールをゲートする機能単位のライセンスフラグはありません。Font Tools のクラスは、nextpdf/pro がインストールされていれば常に利用可能です。
公開 API サーフェス
「公開 API サーフェス」という見出しのセクション| シンボル | パラメーター | デフォルト挙動 | 戻り値 | スロー/失敗 | 備考 |
|---|---|---|---|---|---|
FontDesubsetter | なし | 生の PDF バイト列に対するステートレスなスキャナー | — | — | final;ドキュメント間で再利用しても安全 |
FontDesubsetter::analyzeSubsets() | string $pdfData | サブセットか否かを問わず、すべての個別の /BaseFont エントリを isSubset でフラグ付けして報告 | list<SubsetInfo> | 幅由来のサブセット推定が名前由来の完全数推定を超えた場合に InvalidArgumentException | バイトレベルのスキャン;圧縮オブジェクトストリームはデコードされない |
FontDesubsetter::isSubsetFont() | string $baseFontName | 大文字 6 文字に + を付加する接頭辞規約に一致 | bool | — | 名前の先頭にアンカー |
FontDesubsetter::extractSubsetPrefix() | string $baseFontName | 6 文字のサブセットタグを返す | string | — | 非サブセット名では空文字列 |
FontDesubsetter::generateDesubsetPlan() | list<SubsetInfo> $subsets | isSubset が true のエントリを収集し、サイズ推定を合算 | DesubsetPlan | スローしない | 非サブセットのエントリは黙って除外 |
SubsetInfo | コンストラクター:$fontName、$baseFont、$subsetGlyphCount、$fullGlyphCount、$isSubset、$encoding | 1 つの /BaseFont エントリのイミュータブルな記述 | — | 負のグリフ数、または完全数を超えるサブセット数で InvalidArgumentException | final readonly;すべてのプロパティは public |
SubsetInfo::subsetPrefix() | なし | fontName から 6 文字のタグを抽出 | string | — | サブセットでない場合、または + が 6 番目の位置から外れている場合は空文字列 |
SubsetInfo::coveragePercent() | なし | 完全なグリフ集合に対するサブセットの割合 | [0.0, 100.0] の float | — | fullGlyphCount が 0 の場合は 0.0 を返す |
DesubsetPlan | コンストラクター:list<SubsetInfo> $targets、int $estimatedSizeIncrease | イミュータブルなデサブセット計画 | — | — | final readonly;すべてのプロパティは public |
DesubsetPlan::count() | なし | 対象フォントの数 | int | — | targets の長さに等しい |
DesubsetPlan::totalGlyphsNeeded() | なし | すべての対象にわたって合算した不足グリフ数 | int | — | 対象ごとの fullGlyphCount - subsetGlyphCount の合計 |
エントリーポイントのシグネチャ
「エントリーポイントのシグネチャ」という見出しのセクションpublic function analyzeSubsets(string $pdfData): array
public function isSubsetFont(string $baseFontName): bool
public function extractSubsetPrefix(string $baseFontName): string
public function generateDesubsetPlan(array $subsets): DesubsetPlanpublic function __construct( public string $fontName, public string $baseFont, public int $subsetGlyphCount, public int $fullGlyphCount, public bool $isSubset, public string $encoding,)
public function subsetPrefix(): string
public function coveragePercent(): floatpublic function __construct( public array $targets, public int $estimatedSizeIncrease,) {}
public function count(): int
public function totalGlyphsNeeded(): int挙動コントラクト
「挙動コントラクト」という見出しのセクションスキャンとサブセット検出
「スキャンとサブセット検出」という見出しのセクションanalyzeSubsets() は、バイトレベルのパターンマッチによって生のバイト列から /BaseFont 名トークンを抽出します。重複する名前は 1 つのエントリにまとめられ、順序は最初の出現に従います。すべての個別の名前は、サブセットであるか否かにかかわらず SubsetInfo を生成します。名前がちょうど大文字の ASCII 6 文字に続いて + で始まる場合、それはサブセットであり、これが §9.9.2 の規約です。サブセット名の場合、baseFont は 7 文字の接頭辞を取り除いた名前です。通常の名前の場合、baseFont は fontName に等しくなります。各個別のサブセット名は独自のエントリとして報告され、サブセットを独立した実体として扱う §9.9.2 の指針に一致します。
エンコーディング検出
「エンコーディング検出」という見出しのセクション各フォントについて、スキャナーは /BaseFont の出現後の限定されたバイトウィンドウを探索します。ウィンドウ内の /Encoding 名エントリが優先されます。それがない場合、ウィンドウ内の Identity-H または Identity-V の部分文字列が報告されます。両方ともない場合、エントリは Unknown を報告します。辞書に保持されている、または間接参照を経由して到達するエンコーディング値は Unknown を報告します。
グリフ集計
「グリフ集計」という見出しのセクションどちらのグリフ数も推定値です。subsetGlyphCount は、フォントエントリ付近に見える幅配列から導出されます。CIDFont の /W 配列は幅トリプルごとにおよそ 1 グリフを生成し、単純フォントの /Widths 配列は数値エントリごとに 1 グリフを生成します。ウィンドウ内にどちらの配列も見えない場合、小さな固定のデフォルトが適用されます。ウィンドウ探索のために /BaseFont の出現を再特定できない場合、数は 0 になります。fullGlyphCount はファミリー名のヒューリスティックから導出されます。よく知られたラテン系ファミリーの表、CJK ファミリー名指標の集合、それ以外は汎用の下限値です。埋め込みフォントプログラムが解析されることは決してありません。具体的な表、ウィンドウサイズ、および定数は実装の詳細であり、公開されておらず、リリース間で変更される可能性があります。
generateDesubsetPlan() は、入力を isSubset が true のエントリに絞り込みます。各対象は、その不足グリフ数に固定のグリフあたり平均バイト数の定数を掛けたものを estimatedSizeIncrease に寄与させます。この計画はキャパシティ判断のための投影であり、実測の差分ではありません。計画の実行、すなわちフォントプログラムの書き換えは、このモジュールの範囲外です。
この表面全体は、その入力の純粋な関数です。同一のバイト列は同一の結果を生成します。ランダム性、ネットワーク呼び出し、ファイルシステムアクセスは一切ありません。
エッジケースと失敗モード
「エッジケースと失敗モード」という見出しのセクションSubsetInfoの構築は不正な状態を拒否します。負のグリフ数、または完全数を超えるサブセット数はInvalidArgumentExceptionをスローします。analyzeSubsets()は、1 つの隅のケースでその例外を伝播する可能性があります。名前が既知のファミリーに一致するが、見える幅配列がそのファミリーの完全数の値よりも大きいサブセット推定を生成するフォントです。- 検出はバイト表現に対して機能します。圧縮オブジェクトストリーム内にシリアライズされた
/BaseFontエントリは見えません。スキャン前にそれらのストリームを解凍してください。 /BaseFontのキーと値が単一のスペース以外の空白で区切られているエントリでも検出はされますが、フォント単位のウィンドウ探索はそれらを再特定できません。そのようなエントリはエンコーディングUnknownとサブセットグリフ数0を報告します。#エスケープバイトを使用する PDF 名は、生のエスケープ形式で報告されます。エスケープはデコードされません。- 重複する
/BaseFont名は単一のエントリにまとめられます。1 つの名前を共有する 2 つの異なるフォントオブジェクトは、このスキャナーには区別できません。 generateDesubsetPlan()は非サブセットの入力で失敗することは決してありません。isSubsetがfalseに設定されたエントリは、単にtargetsから除外されます。- すべての数と
estimatedSizeIncreaseはヒューリスティックです。それらを実測値として扱わないでください。トリアージとキャパシティ計画にのみ使用してください。 - このモジュールでは暗号操作は一切発生しないため、FIPS モード固有の挙動はありません。
| 主張 | 標準 | 条項 |
|---|---|---|
サブセット検出は、BaseFont 値の前に付加された大文字 6 文字のタグに続く + というサブセット命名規約に一致する。 | ISO 32000-2:2020 | §9.9.2 |
| 各個別のサブセット名は、複数のサブセットを別個の実体として扱う推奨に従い、独立して報告される。 | ISO 32000-2:2020 | §9.9.2 |
すべての条項は言い換えです。NextPDF は規範的テキストを再現しません。これらは能力に関する記述であり、認証ではありません。NextPDF はいかなる認証も保持せず、いかなる認証も付与しません。このモジュールは命名規約の検出と決定的な報告を主張しますが、グリフ数やサイズ推定の正確性は主張しません。
開発上の注意
「開発上の注意」という見出しのセクションcomposer require nextpdf/pro:^3でインストールします。nextpdf/pro1.9.0 以降で利用可能、nextpdf/pro3.1.0 で現行です。FontDesubsetterはステートレスです。一度構築し、ドキュメントや作業スレッドをまたいで再利用してください。- サブセットのカバレッジが重要な場合は、
analyzeSubsets()に解凍済みのバイト列を渡してください。オブジェクトストリームにパックされたフォント辞書は、そうしなければ見落とされます。 - 処理を行う前に
SubsetInfo::isSubsetで分岐してください。結果リストは、インベントリ目的で意図的に非サブセットフォントを含みます。 - 完全なフォントプログラムを調達する前に、デサブセット化がファイルサイズのコストに見合うかを判断するため、
DesubsetPlan::totalGlyphsNeeded()とestimatedSizeIncreaseを使用してください。 - スキャンは入力長に対して線形であり、フォント単位のウィンドウ探索は有界です。このモジュールは何も保存せず、テレメトリも送出しません。
公開範囲の境界
「公開範囲の境界」という見出しのセクションこのページは、外部から観測可能な挙動とサポート対象の公開 API サーフェスのみを記述します。内部名前空間パス、ヘルパークラス、メカニズムの表、ランブックのファイル名、およびチケット接頭辞は範囲外です。
- Font Tools(機能) — インストール、クイックスタート、および計画ワークフローのサンプル。
- Optimizer — 詳細リファレンス — 姉妹となるサイズ削減サーフェス。フォント関連の最適化を含みます。
- Core フォントモジュール — NextPDF Core でのドキュメント作成時のフォント埋め込みとサブセット化。