Pro edición
Optimizer
De un vistazo
Sección titulada «De un vistazo»El Optimizer analiza un PDF en busca de objetos duplicados y potencial de recompresión de imágenes, y luego informa de la reducción de tamaño estimada. Tres niveles equilibran la fidelidad de la salida frente al tamaño de archivo.
Disponibilidad y licencias
Sección titulada «Disponibilidad y licencias»Esta capacidad se incluye en NextPDF Pro (nextpdf/pro) y se activa con un sobre de licencia de nivel Pro. Un despliegue sin ese derecho de uso no carga las clases de la capacidad. Comparar ediciones y obtener una licencia.
No existe un indicador de licencia por función independiente. El nivel de optimización (sin pérdidas, equilibrado, agresivo) es un parámetro en tiempo de ejecución, no un interruptor de licencia.
Instalación
Sección titulada «Instalación»composer require nextpdf/pro:^3El código reside en el espacio de nombres NextPDF\Pro\Optimizer.
Panorama conceptual
Sección titulada «Panorama conceptual»PdfOptimizer coordina un deduplicador de objetos y un recompresor de imágenes. Dados los bytes de PDF en bruto, encuentra grupos de objetos duplicados (cuando el nivel lo permite), analiza las imágenes y estima la compresión de cada imagen con la calidad objetivo del nivel. Agrega los hallazgos en un OptimizationResult que informa del tamaño original, el tamaño optimizado estimado, los objetos eliminados y los recuentos de imágenes antes y después.
OptimizationLevel define el equilibrio: sin pérdidas conserva la calidad de imagen y omite la deduplicación para una salida estable a nivel de bytes; equilibrado deduplica y apunta al 75 por ciento de calidad de imagen; agresivo deduplica, submuestrea y apunta al 50 por ciento de calidad.
Por qué funciona así
Sección titulada «Por qué funciona así»El optimizador analiza en lugar de reescribir. analyze() estima el ahorro potencial y devuelve un OptimizationResult sin mutar la entrada. Eso mantiene el proceso no destructivo y permite decidir si aplicarlo a través del Writer. La abstracción de nivel concentra el equilibrio en un solo lugar: sin pérdidas devuelve false desde deduplicateStreams() para que la salida pueda mantenerse idéntica a nivel de bytes, mientras que equilibrado y agresivo recomprimen los flujos de imagen con objetivos de calidad más bajos. El ahorro alcanzable depende de cómo un documento ya codifica sus flujos e imágenes, por lo que el módulo informa de una estimación a partir de los objetos realmente presentes en lugar de una cifra destacada fija. Contexto de diseño: Flujos y filtros.
Contrato de comportamiento
Sección titulada «Contrato de comportamiento»analyze($pdfData)devuelve unOptimizationResult; no muta la entrada.- El nivel sin pérdidas omite la deduplicación de flujos para que la salida pueda mantenerse estable a nivel de bytes; equilibrado y agresivo habilitan la deduplicación.
- Los objetivos de calidad de imagen son del 100, 75 y 50 por ciento para sin pérdidas, equilibrado y agresivo respectivamente.
- El tamaño optimizado estimado nunca cae por debajo de cero ni supera el original.
withLevel($level)devuelve un nuevo optimizador en el nivel solicitado; las instancias no se mutan.
Ejemplo de código — Inicio rápido
Sección titulada «Ejemplo de código — Inicio rápido»Lo siguiente refleja la API pública documentada. El repositorio no incluye un ejemplo ejecutable para este módulo.
use NextPDF\Pro\Optimizer\PdfOptimizer;
$result = (new PdfOptimizer())->analyze($pdfBytes);Ejemplo de código — Producción
Sección titulada «Ejemplo de código — Producción»use NextPDF\Pro\Optimizer\PdfOptimizer;use NextPDF\Pro\Optimizer\OptimizationLevel;
$optimizer = new PdfOptimizer(OptimizationLevel::Aggressive);$result = $optimizer->analyze($pdfBytes);
$savings = $result->originalSize > 0 ? (1 - $result->optimizedSize / $result->originalSize) * 100 : 0.0;Casos límite y trampas
Sección titulada «Casos límite y trampas»analyze()estima el potencial; combínalo con el módulo Writer para producir un documento optimizado.- El nivel sin pérdidas produce intencionadamente poca reducción de tamaño porque conserva la calidad y omite la deduplicación.
- El recuento de imágenes posterior refleja las imágenes eliminadas mediante deduplicación, no las imágenes descartadas.
Rendimiento
Sección titulada «Rendimiento»El análisis es lineal respecto al tamaño de entrada más el coste de escanear las estructuras de objetos e imágenes. El nivel controla cuán agresivas son las estimaciones de deduplicación y recompresión. No hay una cifra fija publicada de reducción de tamaño; los resultados dependen por completo del documento. Mide con documentos representativos.
Notas de seguridad
Sección titulada «Notas de seguridad»Trata la entrada como no confiable. El análisis permanece en solo lectura y no ejecuta contenido incrustado. Este módulo no registra ningún contenido del documento.
Conformidad
Sección titulada «Conformidad»La optimización opera sobre el modelo de objetos e imágenes de PDF definido por ISO 32000-2; la fuente anota las cláusulas relevantes. El corpus RAG no estaba disponible en el momento de la redacción, por lo que esta página no afirma identificadores de cláusula externos y limita las declaraciones de conformidad al comportamiento verificado por las pruebas del módulo.
Nota sobre el límite de Enterprise
Sección titulada «Nota sobre el límite de Enterprise»Enterprise no cambia el comportamiento de Optimizer. Enterprise añade funciones de cumplimiento y archivo de nivel superior documentadas por separado; no son necesarias para analizar el potencial de optimización.
Alternativa / opción de respaldo en Core
Sección titulada «Alternativa / opción de respaldo en Core»Sin Pro, usa la optimización base de NextPDF Core; la deduplicación de objetos y el análisis ajustable de recompresión de imágenes son adiciones de Pro..
Límite de publicación
Sección titulada «Límite de publicación»Esta página documenta únicamente el comportamiento observable externamente y la superficie pública de API admitida. Las rutas de espacios de nombres internos, las clases auxiliares, las tablas de mecanismos, los nombres de archivos de runbook y los prefijos de tickets quedan fuera del alcance.