コンテンツにスキップ
getnextpdf.com

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 Pronextpdf/pro)で提供され、Pro ティアのライセンスエンベロープでアクティブ化されます。そのエンタイトルメントを持たないデプロイでは、この機能のクラスはロードされません。エディションを比較してライセンスを取得する

このモジュールをゲートする機能単位のライセンスフラグはありません。Font Tools のクラスは、nextpdf/pro がインストールされていれば常に利用可能です。

シンボルパラメーターデフォルト挙動戻り値スロー/失敗備考
FontDesubsetterなし生の PDF バイト列に対するステートレスなスキャナーfinal;ドキュメント間で再利用しても安全
FontDesubsetter::analyzeSubsets()string $pdfDataサブセットか否かを問わず、すべての個別の /BaseFont エントリを isSubset でフラグ付けして報告list<SubsetInfo>幅由来のサブセット推定が名前由来の完全数推定を超えた場合に InvalidArgumentExceptionバイトレベルのスキャン;圧縮オブジェクトストリームはデコードされない
FontDesubsetter::isSubsetFont()string $baseFontName大文字 6 文字に + を付加する接頭辞規約に一致bool名前の先頭にアンカー
FontDesubsetter::extractSubsetPrefix()string $baseFontName6 文字のサブセットタグを返すstring非サブセット名では空文字列
FontDesubsetter::generateDesubsetPlan()list<SubsetInfo> $subsetsisSubsettrue のエントリを収集し、サイズ推定を合算DesubsetPlanスローしない非サブセットのエントリは黙って除外
SubsetInfoコンストラクター:$fontName$baseFont$subsetGlyphCount$fullGlyphCount$isSubset$encoding1 つの /BaseFont エントリのイミュータブルな記述負のグリフ数、または完全数を超えるサブセット数で InvalidArgumentExceptionfinal readonly;すべてのプロパティは public
SubsetInfo::subsetPrefix()なしfontName から 6 文字のタグを抽出stringサブセットでない場合、または + が 6 番目の位置から外れている場合は空文字列
SubsetInfo::coveragePercent()なし完全なグリフ集合に対するサブセットの割合[0.0, 100.0]floatfullGlyphCount0 の場合は 0.0 を返す
DesubsetPlanコンストラクター:list<SubsetInfo> $targetsint $estimatedSizeIncreaseイミュータブルなデサブセット計画final readonly;すべてのプロパティは public
DesubsetPlan::count()なし対象フォントの数inttargets の長さに等しい
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): DesubsetPlan
public 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(): float
public 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 文字の接頭辞を取り除いた名前です。通常の名前の場合、baseFontfontName に等しくなります。各個別のサブセット名は独自のエントリとして報告され、サブセットを独立した実体として扱う §9.9.2 の指針に一致します。

各フォントについて、スキャナーは /BaseFont の出現後の限定されたバイトウィンドウを探索します。ウィンドウ内の /Encoding 名エントリが優先されます。それがない場合、ウィンドウ内の Identity-H または Identity-V の部分文字列が報告されます。両方ともない場合、エントリは Unknown を報告します。辞書に保持されている、または間接参照を経由して到達するエンコーディング値は Unknown を報告します。

どちらのグリフ数も推定値です。subsetGlyphCount は、フォントエントリ付近に見える幅配列から導出されます。CIDFont の /W 配列は幅トリプルごとにおよそ 1 グリフを生成し、単純フォントの /Widths 配列は数値エントリごとに 1 グリフを生成します。ウィンドウ内にどちらの配列も見えない場合、小さな固定のデフォルトが適用されます。ウィンドウ探索のために /BaseFont の出現を再特定できない場合、数は 0 になります。fullGlyphCount はファミリー名のヒューリスティックから導出されます。よく知られたラテン系ファミリーの表、CJK ファミリー名指標の集合、それ以外は汎用の下限値です。埋め込みフォントプログラムが解析されることは決してありません。具体的な表、ウィンドウサイズ、および定数は実装の詳細であり、公開されておらず、リリース間で変更される可能性があります。

generateDesubsetPlan() は、入力を isSubsettrue のエントリに絞り込みます。各対象は、その不足グリフ数に固定のグリフあたり平均バイト数の定数を掛けたものを estimatedSizeIncrease に寄与させます。この計画はキャパシティ判断のための投影であり、実測の差分ではありません。計画の実行、すなわちフォントプログラムの書き換えは、このモジュールの範囲外です。

この表面全体は、その入力の純粋な関数です。同一のバイト列は同一の結果を生成します。ランダム性、ネットワーク呼び出し、ファイルシステムアクセスは一切ありません。

  • SubsetInfo の構築は不正な状態を拒否します。負のグリフ数、または完全数を超えるサブセット数は InvalidArgumentException をスローします。
  • analyzeSubsets() は、1 つの隅のケースでその例外を伝播する可能性があります。名前が既知のファミリーに一致するが、見える幅配列がそのファミリーの完全数の値よりも大きいサブセット推定を生成するフォントです。
  • 検出はバイト表現に対して機能します。圧縮オブジェクトストリーム内にシリアライズされた /BaseFont エントリは見えません。スキャン前にそれらのストリームを解凍してください。
  • /BaseFont のキーと値が単一のスペース以外の空白で区切られているエントリでも検出はされますが、フォント単位のウィンドウ探索はそれらを再特定できません。そのようなエントリはエンコーディング Unknown とサブセットグリフ数 0 を報告します。
  • # エスケープバイトを使用する PDF 名は、生のエスケープ形式で報告されます。エスケープはデコードされません。
  • 重複する /BaseFont 名は単一のエントリにまとめられます。1 つの名前を共有する 2 つの異なるフォントオブジェクトは、このスキャナーには区別できません。
  • generateDesubsetPlan() は非サブセットの入力で失敗することは決してありません。isSubsetfalse に設定されたエントリは、単に 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/pro 1.9.0 以降で利用可能、nextpdf/pro 3.1.0 で現行です。
  • FontDesubsetter はステートレスです。一度構築し、ドキュメントや作業スレッドをまたいで再利用してください。
  • サブセットのカバレッジが重要な場合は、analyzeSubsets() に解凍済みのバイト列を渡してください。オブジェクトストリームにパックされたフォント辞書は、そうしなければ見落とされます。
  • 処理を行う前に SubsetInfo::isSubset で分岐してください。結果リストは、インベントリ目的で意図的に非サブセットフォントを含みます。
  • 完全なフォントプログラムを調達する前に、デサブセット化がファイルサイズのコストに見合うかを判断するため、DesubsetPlan::totalGlyphsNeeded()estimatedSizeIncrease を使用してください。
  • スキャンは入力長に対して線形であり、フォント単位のウィンドウ探索は有界です。このモジュールは何も保存せず、テレメトリも送出しません。

このページは、外部から観測可能な挙動とサポート対象の公開 API サーフェスのみを記述します。内部名前空間パス、ヘルパークラス、メカニズムの表、ランブックのファイル名、およびチケット接頭辞は範囲外です。