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

Pro エディション

Optimizer — 詳細リファレンス

このページは、NextPDF\Pro\Optimizer の公開サーフェスに関する詳細リファレンスです。分析オーケストレーター、最適化レベル、2 つのスキャナー、および結果値オブジェクトを対象とします。パラメータ、デフォルト、見積もりの算術、失敗モードを記述します。分析は読み取り専用であり、削減量を見積もるだけで出力ドキュメントは生成しません。ワークフローのガイダンスについては、まず Optimizer 機能ページ をお読みください。

この機能は NextPDF Pronextpdf/pro)で提供され、Pro ティアのライセンスエンベロープで有効化されます。その権限がないデプロイでは、この機能のクラスはロードされません。エディションを比較してライセンスを取得

Optimizer には機能ごとのライセンスフラグはありません。これは Pro エディションの機能です。最適化レベルはランタイムパラメータであり、ライセンススイッチではありません。

Terminal window
composer require nextpdf/pro:^3

nextpdf/premium メタパッケージは nextpdf/pro のコードをインストールします。このモジュールは NextPDF\Pro\Optimizer 名前空間の下に置かれます。

シンボルパラメータデフォルトの挙動戻り値スロー/失敗条件備考
PdfOptimizer::__constructOptimizationLevel $level = OptimizationLevel::Balanced指定レベルでオプティマイザーを構築PdfOptimizer宣言なし独自のスキャナーインスタンスを構築
PdfOptimizer::analyzestring $pdfData設定レベルでの読み取り専用分析OptimizationResult100,000,000 バイトを超える入力で OverflowException、不正な PDF データではスキャナーから InvalidArgumentException見積もりのみ。出力ドキュメントは生成しない
PdfOptimizer::withLevelOptimizationLevel $level要求レベルの新しいオプティマイザーを返すself宣言なし受け手のインスタンスは不変
OptimizationLevelケース LosslessBalancedAggressive積極度レベルの文字列バック列挙型バッキング値 losslessbalancedaggressive
OptimizationLevel::labelなし人間可読なレベルラベルstring宣言なし表示用
OptimizationLevel::imageQualityなしレベルの目標画像品質int宣言なし100、75、または 50
OptimizationLevel::deduplicateStreamsなしレベルが重複排除を有効にするかbool宣言なしLossless のみ false
OptimizationResult::__constructint $originalSizeint $optimizedSizeint $objectsRemovedint $imagesBeforeint $imagesAfterfloat $processingTimeMsイミュータブルな分析結果OptimizationResult宣言なし全プロパティは public かつ readonly
OptimizationResult::savedBytesなし元のサイズから推定最適化後サイズを引いた値int宣言なしバイト
OptimizationResult::savedPercentなしサイズ削減率float宣言なし元のサイズがゼロの場合は 0.0
OptimizationResult::summaryなし複数行の人間可読レポートstring宣言なしサイズは B、KB、または MB で整形
ObjectDeduplicator::findDuplicatesstring $pdfData同一のオブジェクト本体を SHA-256 ハッシュでグループ化list<DuplicateGroup>%PDF ヘッダーの欠落、268,435,456 バイトを超える入力、または 500,000 個を超えるオブジェクトマーカーで InvalidArgumentExceptionメンバーが 2 個以上のグループのみを返す
ObjectDeduplicator::estimateSavingslist<DuplicateGroup> $groupsグループごとの重複数とオブジェクトサイズの積を合計int宣言なしバイト
ImageRecompressor::analyzeImagesstring $pdfDataすべての画像 XObject のメタデータを抽出list<ImageAnalysis>%PDF ヘッダーの欠落で InvalidArgumentException明示的な幅と高さがないオブジェクトはスキップ
ImageRecompressor::suggestCompressionImageAnalysis $imageOptimizationLevel $levelフィルターを推奨し削減量を見積もるImageCompressionSuggestion宣言なしレベル依存のヒューリスティック。挙動契約を参照
DuplicateGroup::__constructstring $contentHashlist<int> $objectNumbersint $objectSizeイミュータブルな重複グループレコードDuplicateGroup宣言なし最初のオブジェクト番号が正規の保持オブジェクト
DuplicateGroup::duplicateCountなしグループサイズから正規オブジェクトを引いた値int宣言なしマージで削除可能なオブジェクト
ImageAnalysis::__constructint $objectNumberint $widthint $heightstring $colorSpaceint $bitsPerComponentstring $filterint $streamSizeイミュータブルな画像ごとのメタデータレコードImageAnalysis宣言なしフィールドは画像辞書のエントリを反映
ImageAnalysis::estimatedDpifloat $displayWidthPt指定の表示幅における実効 DPIfloat宣言なし表示幅がゼロまたは負の場合は 0.0
ImageAnalysis::isOverResolutionfloat $displayWidthPtint $targetDpi = 300目標 DPI を超えるダウンサンプリング候補をフラグ付けbool宣言なし厳密な大なり比較
ImageCompressionSuggestion::__constructint $objectNumberstring $currentFilterstring $suggestedFilterint $estimatedSavingsstring $reasonイミュータブルな推奨レコードImageCompressionSuggestion宣言なしreason は人間可読な説明テキスト
final class PdfOptimizer
{
public function __construct(
private OptimizationLevel $level = OptimizationLevel::Balanced,
)
public function analyze(string $pdfData): OptimizationResult
public function withLevel(OptimizationLevel $level): self
}
enum OptimizationLevel: string
{
case Lossless = 'lossless';
case Balanced = 'balanced';
case Aggressive = 'aggressive';
public function label(): string
public function imageQuality(): int
public function deduplicateStreams(): bool
}
final readonly class OptimizationResult
{
public function __construct(
public int $originalSize,
public int $optimizedSize,
public int $objectsRemoved,
public int $imagesBefore,
public int $imagesAfter,
public float $processingTimeMs,
)
public function savedBytes(): int
public function savedPercent(): float
public function summary(): string
}
final class ObjectDeduplicator
{
public function findDuplicates(string $pdfData): array
public function estimateSavings(array $groups): int
}
final class ImageRecompressor
{
public function analyzeImages(string $pdfData): array
public function suggestCompression(
ImageAnalysis $image,
OptimizationLevel $level,
): ImageCompressionSuggestion
}

PdfOptimizer::analyze は生の PDF バイト列を受け取り、読み取り専用です。まず信頼できない入力を 100,000,000 バイトに制限し、サイズ超過の入力はスキャン実行前に OverflowException を送出します。続いて、レベルが許可する場合は重複排除分析を実行し、画像分析は常に実行して、両者を 1 つの OptimizationResult に集約します。withLevel は新しいオプティマイザーを返し、インスタンスが変更されることはありません。

レベル目標画像品質重複排除意図
Lossless100%オフ品質劣化なし。バイト安定な出力を意図
Balanced75%オン中程度の品質トレードオフ。デフォルト
Aggressive50%オン最大削減。ダウンサンプリング。目に見える品質劣化

Lossless は重複排除をスキップし、出力がバイト安定に保たれるようにします。品質目標は、以下の画像推奨の算術に入力されます。

重複排除器は、世代ゼロの間接オブジェクト定義(N 0 obj から endobj まで)をスキャンします。各本体は前後の空白がトリムされ、SHA-256 でハッシュ化され、ハッシュごとにグループ化されます。したがって、パディングのみが異なる定義も一致します。メンバーが 2 個以上のグループのみが返されます。正規オブジェクト以外はすべて削除できるため、グループごとの推定削減量は重複数と単一本体サイズの積に等しくなります。

オブジェクトは、その本体に /Subtype /Image(内部空白の有無を問わず)を含む場合、画像として扱われます。幅と高さは必須であり、いずれかを欠くオブジェクトはスキップされます。カラースペースはデフォルトで DeviceRGB、コンポーネントあたりのビット数は 8、フィルターは存在しない場合に空文字列となります。ストリームサイズは stream マーカーと endstream マーカーの間で測定されます。インラインストリームが見つからない場合は、代わりに /Length の値が使用されます。

  • Lossless レベルでは、現在のフィルターが維持され、推定削減量はゼロです。
  • DCTDecode ソースの場合、推奨はそのレベルの品質で再エンコードします。見積もりはストリームサイズ × (1 − quality/100) × 0.5 です。
  • FlateDecode ソースの場合、推奨は DCTDecode に変換します。見積もりは Balanced でストリームサイズの 40%、Aggressive で 60% です。
  • その他のフィルター、またはフィルターなしの場合、推奨は FlateDecode に変換します。見積もりはストリームサイズの 20% です。
  • 削除されるオブジェクト数は、すべての重複グループにわたる、正規の最初のオブジェクトを超えるメンバー数の合計に等しくなります。
  • 総削減量は、重複排除の削減量に画像ごとの推奨見積もりを加えた値に等しくなります。
  • 推定最適化後サイズは、元のサイズから総削減量を引いた値で、下限はゼロです。削減量は非負であるため、見積もりが元のサイズを超えることはありません。
  • 最適化後の画像数は、分析済み画像を含む各重複グループについて、そのグループの重複メンバー数を減算します。この数の下限はゼロです。
  • 処理時間は単調増加クロックで測定され、ミリ秒で報告されます。

DPI 見積もり器は、ピクセル幅を表示幅(インチ単位、1 インチ 72 ポイント)で割ります。表示幅がゼロまたは負の場合は 0.0 になります。過解像度の判定は、見積もりを目標値(デフォルトで 300 DPI)と比較します。

  • analyze は可能性のみを報告します。最適化された出力は Writer モジュールで生成してください。
  • 空の入力、または %PDF ヘッダーで始まらない入力は、InvalidArgumentException で失敗します。
  • 100,000,000 バイトを超える入力は、スキャン前にオーケストレーターの入口で OverflowException により失敗します。
  • 重複排除器は、268,435,456 バイトを超える入力および 500,000 個を超えるオブジェクトマーカーを独自に拒否します。いずれも InvalidArgumentException でフェイルクローズし、切り詰めや部分的なスキャンは行われません。
  • 世代ゼロのオブジェクト定義のみが対象です。世代番号が非ゼロのオブジェクトはスキャンされません。
  • 閉じ endobj マーカーがない定義はスキップされます。
  • 明示的な幅と高さがない画像オブジェクトは、画像レポートから除外されます。
  • すべての削減量の数値は、オブジェクトメタデータから導かれたヒューリスティックであり、実測された再圧縮結果ではありません。
  • lossless レベルは意図的に小さな削減量を報告します。品質を保ち、重複排除をスキップするためです。
  • 分析は埋め込みコンテンツをデコード、実行、レンダリングすることは一切ありません。オブジェクト構造とメタデータのみを読み取ります。
  • 使用される暗号プリミティブは、重複コンテンツのグループ化のための SHA-256 のみです。このモジュールは FIPS 固有の挙動を定義しません。

両スキャナーは、ISO 32000-2:2020 の PDF オブジェクトおよび画像モデルに対して動作します。重複排除は間接オブジェクト定義を対象とし、その識別子構造は ISO 32000-2:2020, 7.3.10 で定義され、本ページの引用レコードで引用されています。画像分析は、画像辞書が明示的に示すパラメータ(幅、高さ、コンポーネントあたりのビット数)を、同じく引用している ISO 32000-2:2020, 8.9.4 に従って読み取ります。

これらの記述は、引用された各条項に対する能力を説明するものです。NextPDF は適合性認証を保持しておらず、ある条項のサポートは認証の主張ではありません。

  • モジュールソースには @since 1.9.0 が付与されています。本リファレンスは nextpdf/pro 3.1.0 で提供されるサーフェスを記述します。
  • すべてのクラスは final であり、結果および分析レコードは readonly な値オブジェクトです。変更する代わりに新しいインスタンスを構築してください。
  • デフォルトレベルは Balanced です。別のレベルはコンストラクターまたは with スタイルのメソッドで選択してください。
  • 入口での入力上限は、NextPDF の各入力サーフェスで共有される Core の入力サイズガードによって強制されます。
  • 分析は、すでにメモリ上にあるバイト列に対する文字列ベースの処理です。このモジュールはファイルシステムやネットワークへのアクセスを行いません。
  • 内部メカニズムの詳細はソースリポジトリの内部ドキュメントに留まり、本マニュアルの対象外です。

本ページは、外部から観測可能な挙動とサポートされる公開 API サーフェスのみを記述します。内部の名前空間パス、ヘルパークラス、メカニズム表、Runbook のファイル名、チケットのプレフィックスは対象外です。