Zum Inhalt springen
getnextpdf.com

Pro Edition

Optimizer — Ausführliche Referenz

Diese Seite ist die Deep-Referenz für die öffentliche Oberfläche von NextPDF\Pro\Optimizer. Sie behandelt den Analyse-Orchestrator, die Optimierungsstufen, die beiden Scanner und die Ergebnis-Wertobjekte. Sie beschreibt Parameter, Standardwerte, die Schätzarithmetik und die Fehlermodi. Die Analyse ist schreibgeschützt: Sie schätzt Einsparungen und erzeugt kein Ausgabedokument. Lesen Sie zuerst die Optimizer-Fähigkeitsseite für Workflow-Hinweise.

Diese Fähigkeit wird in NextPDF Pro (nextpdf/pro) ausgeliefert und aktiviert sich mit einer Lizenzhülle der Pro-Stufe. Ein Deployment ohne diese Berechtigung lädt die Klassen der Fähigkeit nicht. Editionen vergleichen und Lizenz beziehen.

Optimizer hat kein feature-spezifisches Lizenz-Flag. Dies ist eine Fähigkeit der Pro-Edition. Die Optimierungsstufe ist ein Laufzeitparameter, kein Lizenzschalter.

Terminal-Fenster
composer require nextpdf/pro:^3

Das Metapaket nextpdf/premium installiert den nextpdf/pro-Code; dieses Modul liegt im Namespace NextPDF\Pro\Optimizer.

SymbolParameterStandardverhaltenRückgabeWirft oder scheitert mitHinweise
PdfOptimizer::__constructOptimizationLevel $level = OptimizationLevel::BalancedErstellt einen Optimizer auf der angegebenen StufePdfOptimizerNichts deklariertKonstruiert eigene Scanner-Instanzen
PdfOptimizer::analyzestring $pdfDataSchreibgeschützte Analyse auf der konfigurierten StufeOptimizationResultOverflowException bei Eingaben über 100,000,000 Bytes; InvalidArgumentException von den Scannern bei ungültigen PDF-DatenNur Schätzungen; erzeugt kein Ausgabedokument
PdfOptimizer::withLevelOptimizationLevel $levelGibt einen neuen Optimizer auf der angeforderten Stufe zurückselfNichts deklariertDie empfangende Instanz bleibt unverändert
OptimizationLevelFälle Lossless, Balanced, AggressiveString-basiertes Enum der AggressivitätsstufenBacking-Werte lossless, balanced, aggressive
OptimizationLevel::labelkeineMenschenlesbare StufenbezeichnungstringNichts deklariertZur Anzeige
OptimizationLevel::imageQualitykeineZielbildqualität für die StufeintNichts deklariert100, 75 oder 50
OptimizationLevel::deduplicateStreamskeineOb die Stufe die Deduplizierung aktiviertboolNichts deklariertfalse nur für Lossless
OptimizationResult::__constructint $originalSize, int $optimizedSize, int $objectsRemoved, int $imagesBefore, int $imagesAfter, float $processingTimeMsUnveränderliches AnalyseergebnisOptimizationResultNichts deklariertAlle Eigenschaften sind public und readonly
OptimizationResult::savedByteskeineUrsprüngliche Größe minus geschätzte optimierte GrößeintNichts deklariertBytes
OptimizationResult::savedPercentkeineProzentuale GrößenreduktionfloatNichts deklariert0.0, wenn die ursprüngliche Größe null ist
OptimizationResult::summarykeineMehrzeiliger, menschenlesbarer BerichtstringNichts deklariertGrößen formatiert als B, KB oder MB
ObjectDeduplicator::findDuplicatesstring $pdfDataGruppiert identische Objektkörper nach SHA-256-Hashlist<DuplicateGroup>InvalidArgumentException bei fehlendem %PDF-Header, Eingaben über 268,435,456 Bytes oder mehr als 500,000 ObjektmarkierungenGibt nur Gruppen mit zwei oder mehr Mitgliedern zurück
ObjectDeduplicator::estimateSavingslist<DuplicateGroup> $groupsSummiert Duplikatanzahl mal Objektgröße pro GruppeintNichts deklariertBytes
ImageRecompressor::analyzeImagesstring $pdfDataExtrahiert Metadaten für jedes Bild-XObjectlist<ImageAnalysis>InvalidArgumentException bei fehlendem %PDF-HeaderÜberspringt Objekte ohne explizite Breite und Höhe
ImageRecompressor::suggestCompressionImageAnalysis $image, OptimizationLevel $levelEmpfiehlt einen Filter und schätzt die EinsparungenImageCompressionSuggestionNichts deklariertStufenabhängige Heuristiken; siehe den Verhaltensvertrag
DuplicateGroup::__constructstring $contentHash, list<int> $objectNumbers, int $objectSizeUnveränderlicher Duplikatgruppen-DatensatzDuplicateGroupNichts deklariertDie erste Objektnummer ist das kanonische, beibehaltene Objekt
DuplicateGroup::duplicateCountkeineGruppengröße minus das kanonische ObjektintNichts deklariertDurch Zusammenführung entfernbare Objekte
ImageAnalysis::__constructint $objectNumber, int $width, int $height, string $colorSpace, int $bitsPerComponent, string $filter, int $streamSizeUnveränderlicher Metadaten-Datensatz pro BildImageAnalysisNichts deklariertFelder spiegeln die Einträge des Bildwörterbuchs wider
ImageAnalysis::estimatedDpifloat $displayWidthPtEffektive DPI bei der angegebenen AnzeigebreitefloatNichts deklariert0.0, wenn die Anzeigebreite null oder negativ ist
ImageAnalysis::isOverResolutionfloat $displayWidthPt, int $targetDpi = 300Markiert Downsampling-Kandidaten über der Ziel-DPIboolNichts deklariertVergleich strikt größer als
ImageCompressionSuggestion::__constructint $objectNumber, string $currentFilter, string $suggestedFilter, int $estimatedSavings, string $reasonUnveränderlicher Empfehlungs-DatensatzImageCompressionSuggestionNichts deklariertreason ist menschenlesbarer Erläuterungstext
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 nimmt rohe PDF-Bytes entgegen und ist schreibgeschützt. Zunächst begrenzt es die nicht vertrauenswürdige Eingabe auf 100,000,000 Bytes; überdimensionierte Eingaben lösen OverflowException aus, bevor irgendein Scan läuft. Anschließend führt es die Deduplizierungsanalyse aus, wenn die Stufe es erlaubt, führt immer die Bildanalyse aus und aggregiert beide zu einem OptimizationResult. withLevel gibt einen neuen Optimizer zurück; Instanzen werden niemals mutiert.

StufeZielbildqualitätDeduplizierungAbsicht
Lossless100%AusKein Qualitätsverlust; Absicht byte-stabiler Ausgabe
Balanced75%AnModerater Qualitätskompromiss; die Standardeinstellung
Aggressive50%AnMaximale Reduktion; Downsampling; sichtbarer Qualitätsverlust

Lossless überspringt die Deduplizierung, damit die Ausgabe byte-stabil bleiben kann. Die Zielqualität fließt in die untenstehende Bildvorschlags-Arithmetik ein.

Der Deduplikator scannt indirekte Objektdefinitionen der Generation null (N 0 obj bis endobj). Jeder Körper wird von umgebendem Leerraum befreit, mit SHA-256 gehasht und nach Hash gruppiert. Definitionen, die sich nur in der Auffüllung unterscheiden, stimmen daher weiterhin überein. Es werden nur Gruppen mit zwei oder mehr Mitgliedern zurückgegeben. Die geschätzten Einsparungen pro Gruppe entsprechen der Duplikatanzahl mal der Größe eines einzelnen Körpers, da alle außer dem kanonischen Objekt entfernt werden können.

Ein Objekt wird als Bild behandelt, wenn sein Körper /Subtype /Image enthält (mit oder ohne inneres Leerzeichen). Breite und Höhe sind erforderlich; ein Objekt, dem eines von beiden fehlt, wird übersprungen. Der Farbraum wird standardmäßig auf DeviceRGB gesetzt, die Bits pro Komponente auf 8 und der Filter auf einen leeren String, wenn er fehlt. Die Stream-Größe wird zwischen den Markierungen stream und endstream gemessen; wird kein Inline-Stream gefunden, wird stattdessen der Wert /Length verwendet.

  • Auf der Stufe Lossless wird der aktuelle Filter beibehalten und die geschätzten Einsparungen betragen null.
  • Für DCTDecode-Quellen kodiert der Vorschlag mit der Qualität der Stufe neu. Die Schätzung ist die Stream-Größe mal (1 − Qualität/100) mal 0.5.
  • Für FlateDecode-Quellen konvertiert der Vorschlag zu DCTDecode. Die Schätzung beträgt 40% der Stream-Größe bei Balanced und 60% bei Aggressive.
  • Für jeden anderen Filter oder keinen Filter konvertiert der Vorschlag zu FlateDecode. Die Schätzung beträgt 20% der Stream-Größe.
  • Entfernte Objekte entsprechen der Summe, über alle Duplikatgruppen, der Mitglieder jenseits des kanonischen ersten.
  • Die Gesamteinsparungen entsprechen den Deduplizierungseinsparungen plus den Vorschlagsschätzungen pro Bild.
  • Die geschätzte optimierte Größe ist die ursprüngliche Größe minus Gesamteinsparungen, nach unten auf null begrenzt. Einsparungen sind nicht negativ, daher überschreitet die Schätzung nie die ursprüngliche Größe.
  • Die Bildzahl danach subtrahiert für jede Duplikatgruppe, die ein analysiertes Bild enthält, die Duplikatmitgliederzahl dieser Gruppe. Die Zahl wird nach unten auf null begrenzt.
  • Die Verarbeitungszeit wird mit einer monotonen Uhr gemessen und in Millisekunden angegeben.

Der DPI-Schätzer teilt die Pixelbreite durch die Anzeigebreite in Zoll (72 Punkte pro Zoll). Eine Anzeigebreite von null oder negativ ergibt 0.0. Das Überauflösungs-Prädikat vergleicht die Schätzung mit einem Ziel, standardmäßig 300 DPI.

  • analyze meldet nur das Potenzial. Erzeugen Sie optimierte Ausgaben mit dem Writer-Modul.
  • Leere Eingaben oder Eingaben, die nicht mit dem %PDF-Header beginnen, scheitern mit InvalidArgumentException.
  • Eingaben über 100,000,000 Bytes scheitern mit OverflowException am Eingang des Orchestrators, vor jedem Scan.
  • Der Deduplikator lehnt unabhängig Eingaben über 268,435,456 Bytes und mehr als 500,000 Objektmarkierungen ab. Beide lehnen fail-closed mit InvalidArgumentException ab; nichts wird abgeschnitten oder teilweise gescannt.
  • Nur Objektdefinitionen der Generation null nehmen teil. Objekte mit von null verschiedenen Generationsnummern werden nicht gescannt.
  • Eine Definition ohne abschließende endobj-Markierung wird übersprungen.
  • Bildobjekte ohne explizite Breite und Höhe werden vom Bildbericht ausgeschlossen.
  • Alle Einsparungswerte sind Heuristiken, abgeleitet aus Objektmetadaten, keine gemessenen Rekompressionsergebnisse.
  • Die Lossless-Stufe meldet absichtlich kleine Reduktionen; sie bewahrt die Qualität und überspringt die Deduplizierung.
  • Die Analyse dekodiert, führt aus oder rendert eingebettete Inhalte niemals. Sie liest ausschließlich Objektstruktur und Metadaten.
  • Das einzige verwendete kryptografische Primitiv ist SHA-256, zur Gruppierung doppelter Inhalte. Das Modul definiert kein FIPS-spezifisches Verhalten.

Beide Scanner operieren auf dem PDF-Objekt- und Bildmodell von ISO 32000-2:2020. Die Deduplizierung zielt auf indirekte Objektdefinitionen; ihre Bezeichnerstruktur ist in ISO 32000-2:2020, 7.3.10, definiert, zitiert im Zitat-Datensatz dieser Seite. Die Bildanalyse liest die Parameter, die ein Bildwörterbuch explizit angibt — Breite, Höhe und Bits pro Komponente — gemäß ISO 32000-2:2020, 8.9.4, ebenfalls zitiert.

Diese Aussagen beschreiben die Fähigkeit gegenüber den zitierten Klauseln. NextPDF besitzt keine Konformitätszertifizierung, und die Unterstützung einer Klausel ist keine Zertifizierungsbehauptung.

  • Der Modulquellcode trägt @since 1.9.0; diese Referenz dokumentiert die Oberfläche, wie sie in nextpdf/pro 3.1.0 ausgeliefert wird.
  • Alle Klassen sind final; die Ergebnis- und Analyse-Datensätze sind readonly-Wertobjekte. Konstruieren Sie neue Instanzen, anstatt zu mutieren.
  • Die Standardstufe ist Balanced. Wählen Sie über den Konstruktor oder die with-artige Methode eine andere Stufe.
  • Die Eingangs-Eingabegrenze wird durch einen Core-Eingabegrößenwächter durchgesetzt, der über die NextPDF-Eingabeoberflächen hinweg geteilt wird.
  • Die Analyse ist string-basiert über bereits im Speicher befindliche Bytes. Das Modul führt keinen Dateisystem- oder Netzwerkzugriff durch.
  • Interne Mechanismusdetails verbleiben in der internen Dokumentation des Quellrepositorys und liegen außerhalb des Umfangs dieses Handbuchs.

Diese Seite dokumentiert ausschließlich extern beobachtbares Verhalten und die unterstützte öffentliche API-Oberfläche. Interne Namespace-Pfade, Hilfsklassen, Mechanismustabellen, Runbook-Dateinamen und Ticket-Präfixe liegen außerhalb des Umfangs.