Ir al contenido
getnextpdf.com

Pro edición

Optimizer — Referencia detallada

Esta página es la referencia detallada de la superficie pública de NextPDF\Pro\Optimizer. Cubre el orquestador de análisis, los niveles de optimización, los dos escáneres y los objetos de valor de resultado. Expone parámetros, valores predeterminados, la aritmética de estimación y los modos de fallo. El análisis es de solo lectura: estima el ahorro y no produce ningún documento de salida. Leer primero la página de capacidad de Optimizer para orientarse sobre el flujo de trabajo.

Esta capacidad se distribuye en NextPDF Pro (nextpdf/pro) y se activa con un sobre de licencia de nivel Pro. Un despliegue sin esa habilitación no carga las clases de la capacidad. Comparar ediciones y obtener una licencia.

Optimizer no tiene ningún indicador de licencia por función. Esta es una capacidad de la edición Pro. El nivel de optimización es un parámetro en tiempo de ejecución, no un conmutador de licencia.

Ventana de terminal
composer require nextpdf/pro:^3

El metapaquete nextpdf/premium instala el código de nextpdf/pro; este módulo reside en el espacio de nombres NextPDF\Pro\Optimizer.

SímboloParámetrosComportamiento predeterminadoDevuelveLanza o falla conNotas
PdfOptimizer::__constructOptimizationLevel $level = OptimizationLevel::BalancedConstruye un optimizador en el nivel dadoPdfOptimizerNada declaradoConstruye sus propias instancias de escáner
PdfOptimizer::analyzestring $pdfDataAnálisis de solo lectura en el nivel configuradoOptimizationResultOverflowException con entrada superior a 100,000,000 bytes; InvalidArgumentException de los escáneres con datos PDF no válidosSolo estima; no produce ningún documento de salida
PdfOptimizer::withLevelOptimizationLevel $levelDevuelve un nuevo optimizador en el nivel solicitadoselfNada declaradoLa instancia receptora no se modifica
OptimizationLevelcasos Lossless, Balanced, AggressiveEnumeración respaldada por cadenas de niveles de agresividadValores de respaldo lossless, balanced, aggressive
OptimizationLevel::labelningunoEtiqueta de nivel legible para humanosstringNada declaradoPara uso en pantalla
OptimizationLevel::imageQualityningunoCalidad de imagen objetivo para el nivelintNada declarado100, 75 o 50
OptimizationLevel::deduplicateStreamsningunoSi el nivel habilita la deduplicaciónboolNada declaradofalse solo para Lossless
OptimizationResult::__constructint $originalSize, int $optimizedSize, int $objectsRemoved, int $imagesBefore, int $imagesAfter, float $processingTimeMsResultado de análisis inmutableOptimizationResultNada declaradoTodas las propiedades son públicas y de solo lectura
OptimizationResult::savedBytesningunoTamaño original menos el tamaño optimizado estimadointNada declaradoBytes
OptimizationResult::savedPercentningunoPorcentaje de reducción de tamañofloatNada declarado0.0 cuando el tamaño original es cero
OptimizationResult::summaryningunoInforme multilínea legible para humanosstringNada declaradoTamaños formateados como B, KB o MB
ObjectDeduplicator::findDuplicatesstring $pdfDataAgrupa cuerpos de objeto idénticos por hash SHA-256list<DuplicateGroup>InvalidArgumentException cuando falta la cabecera %PDF, con entrada superior a 268,435,456 bytes, o con más de 500,000 marcadores de objetoDevuelve solo grupos con dos o más miembros
ObjectDeduplicator::estimateSavingslist<DuplicateGroup> $groupsSuma el recuento de duplicados por el tamaño del objeto en cada grupointNada declaradoBytes
ImageRecompressor::analyzeImagesstring $pdfDataExtrae metadatos de cada XObject de imagenlist<ImageAnalysis>InvalidArgumentException cuando falta la cabecera %PDFOmite objetos sin ancho y alto explícitos
ImageRecompressor::suggestCompressionImageAnalysis $image, OptimizationLevel $levelRecomienda un filtro y estima el ahorroImageCompressionSuggestionNada declaradoHeurísticas dependientes del nivel; véase el contrato de comportamiento
DuplicateGroup::__constructstring $contentHash, list<int> $objectNumbers, int $objectSizeRegistro de grupo de duplicados inmutableDuplicateGroupNada declaradoEl primer número de objeto es el objeto canónico conservado
DuplicateGroup::duplicateCountningunoTamaño del grupo menos el objeto canónicointNada declaradoObjetos eliminables al fusionar
ImageAnalysis::__constructint $objectNumber, int $width, int $height, string $colorSpace, int $bitsPerComponent, string $filter, int $streamSizeRegistro de metadatos por imagen inmutableImageAnalysisNada declaradoLos campos reflejan las entradas del diccionario de imagen
ImageAnalysis::estimatedDpifloat $displayWidthPtDPI efectivo al ancho de visualización dadofloatNada declarado0.0 cuando el ancho de visualización es cero o negativo
ImageAnalysis::isOverResolutionfloat $displayWidthPt, int $targetDpi = 300Marca candidatos a submuestreo por encima del DPI objetivoboolNada declaradoComparación estrictamente mayor que
ImageCompressionSuggestion::__constructint $objectNumber, string $currentFilter, string $suggestedFilter, int $estimatedSavings, string $reasonRegistro de recomendación inmutableImageCompressionSuggestionNada declaradoreason es texto explicativo legible para humanos
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 acepta bytes PDF sin procesar y es de solo lectura. Primero acota la entrada no confiable en 100,000,000 bytes; una entrada de tamaño excesivo lanza OverflowException antes de que se ejecute cualquier escaneo. Después ejecuta el análisis de deduplicación cuando el nivel lo permite, ejecuta siempre el análisis de imágenes y agrega ambos en un único OptimizationResult. withLevel devuelve un nuevo optimizador; las instancias nunca se modifican.

NivelCalidad de imagen objetivoDeduplicaciónIntención
Lossless100%DesactivadaSin pérdida de calidad; salida con intención de estabilidad de bytes
Balanced75%ActivadaCompromiso de calidad moderado; el predeterminado
Aggressive50%ActivadaReducción máxima; submuestreo; pérdida de calidad visible

Lossless omite la deduplicación para que la salida pueda mantener la estabilidad de bytes. La calidad objetivo alimenta la aritmética de sugerencia de imágenes que se describe a continuación.

El deduplicador escanea las definiciones de objeto indirecto de generación cero (N 0 obj hasta endobj). Cada cuerpo se recorta de los espacios en blanco circundantes, se calcula su hash con SHA-256 y se agrupa por hash. Las definiciones que difieren únicamente en el relleno, por lo tanto, siguen coincidiendo. Solo se devuelven los grupos con dos o más miembros. El ahorro estimado por grupo es igual al recuento de duplicados por el tamaño de un solo cuerpo, ya que todos los objetos salvo el canónico pueden eliminarse.

Un objeto se trata como imagen cuando su cuerpo contiene /Subtype /Image (con o sin un espacio interno). El ancho y el alto son obligatorios; un objeto al que le falte cualquiera de ellos se omite. El espacio de color toma como valor predeterminado DeviceRGB, los bits por componente 8 y el filtro una cadena vacía cuando está ausente. El tamaño del flujo se mide entre los marcadores stream y endstream; cuando no se encuentra ningún flujo en línea, se usa en su lugar el valor de /Length.

  • En el nivel Lossless, se conserva el filtro actual y el ahorro estimado es cero.
  • Para fuentes DCTDecode, la sugerencia vuelve a codificar con la calidad del nivel. La estimación es el tamaño del flujo por (1 − calidad/100) por 0,5.
  • Para fuentes FlateDecode, la sugerencia convierte a DCTDecode. La estimación es el 40% del tamaño del flujo en Balanced y el 60% en Aggressive.
  • Para cualquier otro filtro, o sin filtro, la sugerencia convierte a FlateDecode. La estimación es el 20% del tamaño del flujo.
  • Los objetos eliminados equivalen a la suma, sobre todos los grupos de duplicados, de los miembros más allá del primero canónico.
  • El ahorro total equivale al ahorro por deduplicación más las estimaciones de sugerencia por imagen.
  • El tamaño optimizado estimado es el tamaño original menos el ahorro total, con un mínimo de cero. El ahorro es no negativo, por lo que la estimación nunca supera el tamaño original.
  • El recuento de imágenes posterior resta, por cada grupo de duplicados que contenga una imagen analizada, el recuento de miembros duplicados de ese grupo. El recuento tiene un mínimo de cero.
  • El tiempo de procesamiento se mide con un reloj monótono y se informa en milisegundos.

El estimador de DPI divide el ancho en píxeles por el ancho de visualización en pulgadas (72 puntos por pulgada). Un ancho de visualización cero o negativo produce 0.0. El predicado de exceso de resolución compara la estimación con un objetivo, 300 DPI por defecto.

  • analyze solo informa del potencial. Producir la salida optimizada con el módulo Writer.
  • Una entrada vacía, o una entrada que no comienza con la cabecera %PDF, falla con InvalidArgumentException.
  • Una entrada superior a 100,000,000 bytes falla con OverflowException en la puerta de entrada del orquestador, antes de cualquier escaneo.
  • El deduplicador rechaza de forma independiente las entradas superiores a 268,435,456 bytes y con más de 500,000 marcadores de objeto. Ambos rechazos son a prueba de fallos con InvalidArgumentException; nada se trunca ni se escanea parcialmente.
  • Solo participan las definiciones de objeto de generación cero. Los objetos con números de generación distintos de cero no se escanean.
  • Una definición sin un marcador endobj de cierre se omite.
  • Los objetos de imagen sin un ancho y un alto explícitos se excluyen del informe de imágenes.
  • Todas las cifras de ahorro son heurísticas derivadas de los metadatos del objeto, no resultados de recompresión medidos.
  • El nivel sin pérdidas informa intencionadamente de reducciones pequeñas; preserva la calidad y omite la deduplicación.
  • El análisis nunca decodifica, ejecuta ni renderiza contenido incrustado. Lee únicamente la estructura y los metadatos del objeto.
  • La única primitiva criptográfica utilizada es SHA-256, para la agrupación de contenido duplicado. El módulo no define ningún comportamiento específico de FIPS.

Ambos escáneres operan sobre el modelo de objeto e imagen PDF de ISO 32000-2:2020. La deduplicación se dirige a las definiciones de objeto indirecto; la estructura de su identificador se define en ISO 32000-2:2020, 7.3.10, citada en el registro de citas de esta página. El análisis de imágenes lee los parámetros que un diccionario de imagen declara explícitamente —ancho, alto y bits por componente— conforme a ISO 32000-2:2020, 8.9.4, también citada.

Estas afirmaciones describen la capacidad frente a las cláusulas citadas. NextPDF no posee ninguna certificación de conformidad, y el soporte de una cláusula no es una afirmación de certificación.

  • El código fuente del módulo lleva @since 1.9.0; esta referencia documenta la superficie tal como se distribuye en nextpdf/pro 3.1.0.
  • Todas las clases son final; los registros de resultado y de análisis son objetos de valor de solo lectura. Construir nuevas instancias en lugar de modificarlas.
  • El nivel predeterminado es Balanced. Seleccionar otro nivel mediante el constructor o el método de estilo with.
  • El límite de entrada de la puerta de entrada lo impone una salvaguarda de tamaño de entrada de Core compartida entre las superficies de entrada de NextPDF.
  • El análisis se basa en cadenas sobre bytes ya en memoria. El módulo no realiza ningún acceso al sistema de archivos ni a la red.
  • El detalle del mecanismo interno permanece en la documentación interna del repositorio de código fuente y queda fuera del alcance de este manual.

Esta página documenta únicamente el comportamiento observable externamente y la superficie de la API pública admitida. Las rutas de espacio de nombres internas, las clases auxiliares, las tablas de mecanismos, los nombres de archivo de runbook y los prefijos de tickets quedan fuera del alcance.