Ga naar inhoud
getnextpdf.com

Pro editie

Optimizer — Diepe referentie

Deze pagina is de diepe referentie voor het openbare oppervlak van NextPDF\Pro\Optimizer. Ze behandelt de analyse-orchestrator, de optimalisatieniveaus, de twee scanners en de resultaat-waardeobjecten. Ze beschrijft parameters, standaardwaarden, schattingsberekeningen en foutmodi. Analyse is alleen-lezen: ze schat besparingen en produceert geen uitvoerdocument. Lees eerst de Optimizer-capabilitypagina voor begeleiding bij de workflow.

Deze capability wordt geleverd in NextPDF Pro (nextpdf/pro) en activeert met een licentie-envelop op Pro-niveau. Een deployment zonder dat recht laadt de klassen van de capability niet. Vergelijk edities en vraag een licentie aan.

Optimizer heeft geen licentievlag per functie. Dit is een capability van de Pro-editie. Het optimalisatieniveau is een runtime-parameter, geen licentieschakelaar.

Terminal window
composer require nextpdf/pro:^3

Het nextpdf/premium-metapackage installeert de nextpdf/pro-code; deze module bevindt zich onder de namespace NextPDF\Pro\Optimizer.

SymboolParametersStandaardgedragRetourneertWerpt of faalt metOpmerkingen
PdfOptimizer::__constructOptimizationLevel $level = OptimizationLevel::BalancedBouwt een optimizer op het gegeven niveauPdfOptimizerNiets gedeclareerdConstrueert zijn eigen scanner-instanties
PdfOptimizer::analyzestring $pdfDataAlleen-lezen analyse op het geconfigureerde niveauOptimizationResultOverflowException bij invoer boven 100,000,000 bytes; InvalidArgumentException van de scanners bij ongeldige PDF-dataSchat alleen; produceert geen uitvoerdocument
PdfOptimizer::withLevelOptimizationLevel $levelRetourneert een nieuwe optimizer op het gevraagde niveauselfNiets gedeclareerdDe ontvangende instantie blijft ongewijzigd
OptimizationLevelcases Lossless, Balanced, AggressiveString-backed enum van agressiviteitsniveausBacking-waarden lossless, balanced, aggressive
OptimizationLevel::labelgeenLeesbaar niveaulabelstringNiets gedeclareerdVoor weergavedoeleinden
OptimizationLevel::imageQualitygeenDoelbeeldkwaliteit voor het niveauintNiets gedeclareerd100, 75 of 50
OptimizationLevel::deduplicateStreamsgeenOf het niveau deduplicatie inschakeltboolNiets gedeclareerdfalse alleen voor Lossless
OptimizationResult::__constructint $originalSize, int $optimizedSize, int $objectsRemoved, int $imagesBefore, int $imagesAfter, float $processingTimeMsOnveranderlijk analyseresultaatOptimizationResultNiets gedeclareerdAlle eigenschappen zijn public en readonly
OptimizationResult::savedBytesgeenOorspronkelijke grootte minus geschatte geoptimaliseerde grootteintNiets gedeclareerdBytes
OptimizationResult::savedPercentgeenProcentuele groottereductiefloatNiets gedeclareerd0.0 wanneer de oorspronkelijke grootte nul is
OptimizationResult::summarygeenLeesbaar rapport over meerdere regelsstringNiets gedeclareerdGroottes opgemaakt als B, KB of MB
ObjectDeduplicator::findDuplicatesstring $pdfDataGroepeert identieke objectbodies op SHA-256-hashlist<DuplicateGroup>InvalidArgumentException bij een ontbrekende %PDF-header, invoer boven 268,435,456 bytes of meer dan 500,000 objectmarkeringenRetourneert alleen groepen met twee of meer leden
ObjectDeduplicator::estimateSavingslist<DuplicateGroup> $groupsTelt per groep het aantal duplicaten maal de objectgrootte opintNiets gedeclareerdBytes
ImageRecompressor::analyzeImagesstring $pdfDataExtraheert metadata voor elk image-XObjectlist<ImageAnalysis>InvalidArgumentException bij een ontbrekende %PDF-headerSlaat objecten zonder expliciete breedte en hoogte over
ImageRecompressor::suggestCompressionImageAnalysis $image, OptimizationLevel $levelBeveelt een filter aan en schat de besparingImageCompressionSuggestionNiets gedeclareerdNiveauafhankelijke heuristieken; zie het gedragscontract
DuplicateGroup::__constructstring $contentHash, list<int> $objectNumbers, int $objectSizeOnveranderlijk duplicaatgroep-recordDuplicateGroupNiets gedeclareerdHet eerste objectnummer is het canonieke behouden object
DuplicateGroup::duplicateCountgeenGroepsgrootte minus het canonieke objectintNiets gedeclareerdObjecten die door samenvoegen verwijderd kunnen worden
ImageAnalysis::__constructint $objectNumber, int $width, int $height, string $colorSpace, int $bitsPerComponent, string $filter, int $streamSizeOnveranderlijk metadata-record per afbeeldingImageAnalysisNiets gedeclareerdVelden weerspiegelen de items in de image dictionary
ImageAnalysis::estimatedDpifloat $displayWidthPtEffectieve DPI bij de gegeven weergavebreedtefloatNiets gedeclareerd0.0 wanneer de weergavebreedte nul of negatief is
ImageAnalysis::isOverResolutionfloat $displayWidthPt, int $targetDpi = 300Markeert downsampling-kandidaten boven de doel-DPIboolNiets gedeclareerdStrikt groter-dan-vergelijking
ImageCompressionSuggestion::__constructint $objectNumber, string $currentFilter, string $suggestedFilter, int $estimatedSavings, string $reasonOnveranderlijk aanbevelingsrecordImageCompressionSuggestionNiets gedeclareerdreason is leesbare uitleg
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 accepteert ruwe PDF-bytes en is alleen-lezen. Ze begrenst eerst de niet-vertrouwde invoer op 100,000,000 bytes; te grote invoer werpt OverflowException voordat er een scan draait. Vervolgens draait ze deduplicatie-analyse wanneer het niveau dit toestaat, draait ze altijd image-analyse en aggregeert ze beide tot één OptimizationResult. withLevel retourneert een nieuwe optimizer; instanties worden nooit gemuteerd.

NiveauDoelbeeldkwaliteitDeduplicatieDoel
Lossless100%UitGeen kwaliteitsverlies; intentie van byte-stabiele uitvoer
Balanced75%AanGematigde kwaliteitsafweging; de standaard
Aggressive50%AanMaximale reductie; downsampling; zichtbaar kwaliteitsverlies

Lossless slaat deduplicatie over zodat de uitvoer byte-stabiel kan blijven. Het kwaliteitsdoel voedt de image-suggestieberekening hieronder.

De deduplicator scant indirecte objectdefinities van generatie nul (N 0 obj tot en met endobj). Elke body wordt ontdaan van omringende witruimte, gehasht met SHA-256 en gegroepeerd op hash. Definities die alleen in padding verschillen, matchen daardoor toch. Alleen groepen met twee of meer leden worden geretourneerd. De geschatte besparing per groep is gelijk aan het aantal duplicaten maal de grootte van één body, aangezien alle objecten behalve het canonieke verwijderd kunnen worden.

Een object wordt als afbeelding behandeld wanneer zijn body /Subtype /Image bevat (met of zonder interne spatie). Breedte en hoogte zijn verplicht; een object waarin een van beide ontbreekt, wordt overgeslagen. Bij afwezigheid vallen kleurruimte terug op DeviceRGB, bits per component op 8 en het filter op een lege string. De streamgrootte wordt gemeten tussen de markeringen stream en endstream; wanneer geen inline stream wordt gevonden, wordt in plaats daarvan de /Length-waarde gebruikt.

  • Op het Lossless-niveau wordt het huidige filter behouden en is de geschatte besparing nul.
  • Voor DCTDecode-bronnen hercodeert de suggestie op de kwaliteit van het niveau. De schatting is streamgrootte maal (1 − kwaliteit/100) maal 0.5.
  • Voor FlateDecode-bronnen converteert de suggestie naar DCTDecode. De schatting is 40% van de streamgrootte bij Balanced en 60% bij Aggressive.
  • Voor elk ander filter, of geen filter, converteert de suggestie naar FlateDecode. De schatting is 20% van de streamgrootte.
  • Het aantal verwijderde objecten is de som, over alle duplicaatgroepen, van de leden voorbij het canonieke eerste.
  • De totale besparing is gelijk aan de deduplicatiebesparing plus de suggestieschattingen per afbeelding.
  • De geschatte geoptimaliseerde grootte is de oorspronkelijke grootte minus de totale besparing, met een ondergrens van nul. Besparingen zijn niet-negatief, dus de schatting overschrijdt de oorspronkelijke grootte nooit.
  • Het afbeeldingsaantal-na trekt, voor elke duplicaatgroep die een geanalyseerde afbeelding bevat, het aantal duplicaatleden van die groep af. Het aantal heeft een ondergrens van nul.
  • De verwerkingstijd wordt gemeten met een monotone klok en gerapporteerd in milliseconden.

De DPI-schatter deelt de pixelbreedte door de weergavebreedte in inches (72 points per inch). Een weergavebreedte van nul of negatief levert 0.0 op. Het over-resolutiepredicaat vergelijkt de schatting met een doel, standaard 300 DPI.

  • analyze rapporteert alleen het potentieel. Produceer geoptimaliseerde uitvoer met de Writer-module.
  • Lege invoer, of invoer die niet met de %PDF-header begint, faalt met InvalidArgumentException.
  • Invoer boven 100,000,000 bytes faalt met OverflowException bij de voordeur van de orchestrator, vóór elke scan.
  • De deduplicator wijst onafhankelijk invoer boven 268,435,456 bytes en meer dan 500,000 objectmarkeringen af. Beide wijzen fail-closed af met InvalidArgumentException; er wordt niets afgekapt of gedeeltelijk gescand.
  • Alleen objectdefinities van generatie nul doen mee. Objecten met een generatienummer ongelijk aan nul worden niet gescand.
  • Een definitie zonder afsluitende endobj-markering wordt overgeslagen.
  • Afbeeldingsobjecten zonder expliciete breedte en hoogte worden uitgesloten van het afbeeldingsrapport.
  • Alle besparingscijfers zijn heuristieken afgeleid van objectmetadata, geen gemeten hercompressieresultaten.
  • Het lossless-niveau rapporteert opzettelijk kleine reducties; het behoudt de kwaliteit en slaat deduplicatie over.
  • Analyse decodeert ingebedde inhoud nooit, voert deze niet uit en rendert deze niet. Ze leest alleen de objectstructuur en metadata.
  • De enige gebruikte cryptografische primitieve is SHA-256, voor het groeperen van dubbele inhoud. De module definieert geen FIPS-specifiek gedrag.

Beide scanners werken op het PDF-object- en afbeeldingsmodel van ISO 32000-2:2020. Deduplicatie richt zich op indirecte objectdefinities; hun identifier-structuur is gedefinieerd in ISO 32000-2:2020, 7.3.10, geciteerd in het citatierecord van deze pagina. Image-analyse leest de parameters die een image dictionary expliciet vermeldt — breedte, hoogte en bits per component — conform ISO 32000-2:2020, 8.9.4, eveneens geciteerd.

Deze uitspraken beschrijven de capability ten opzichte van de geciteerde clausules. NextPDF beschikt over geen conformiteitscertificering, en ondersteuning voor een clausule is geen certificeringsclaim.

  • De modulebron draagt @since 1.9.0; deze referentie documenteert het oppervlak zoals geleverd in nextpdf/pro 3.1.0.
  • Alle klassen zijn final; de resultaat- en analyserecords zijn readonly-waardeobjecten. Construeer nieuwe instanties in plaats van te muteren.
  • Het standaardniveau is Balanced. Selecteer een ander niveau via de constructor of de with-stijlmethode.
  • De invoerbegrenzing aan de voordeur wordt afgedwongen door een Core-invoergrootte-guard die over de NextPDF-invoeroppervlakken wordt gedeeld.
  • Analyse is string-gebaseerd over bytes die al in het geheugen staan. De module voert geen bestandssysteem- of netwerktoegang uit.
  • Interne mechanismedetails blijven in de interne documentatie van de bronrepository en vallen buiten de scope van deze handleiding.

Deze pagina documenteert alleen extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, helperklassen, mechanismetabellen, runbook-bestandsnamen en ticketprefixen vallen buiten de scope.