Ir al contenido

Cobertura de métodos TCPDF en NextPDF compat-legacy

nextpdf/compat-legacy es una capa de compatibilidad, no un fork de TCPDF ni una réplica con comportamiento garantizado. Expone los nombres de método públicos, el orden de los parámetros y los valores por defecto de TCPDF 6.x sobre el motor central de NextPDF. La mayoría de las llamadas se asignan directamente a una operación Document de NextPDF. Una minoría definida acepta parámetros heredados que NextPDF no tiene en cuenta o no produce ningún efecto.

Esta página resume, para consulta, la auditoría por método. La matriz de cobertura autoritativa y verificada por pruebas se encuentra en el repositorio, en docs/TCPDF_COVERAGE.md. Cuando esta página y la matriz del repositorio discrepan, prevalece la matriz del repositorio, porque está respaldada por el conjunto de pruebas.

Esta página sirve para responder una pregunta antes de migrar: para cada método de TCPDF que invoca la base de código, ¿qué hace realmente el adaptador?

La auditoría revisó alrededor de 120 métodos públicos de TCPDF 6.x. Cada uno se ubicó en exactamente una de cuatro categorías.

CategoríaRecuentoQué implica
Reflejados — delegación completa94La llamada se asigna directamente a un método Document de NextPDF. El comportamiento es compatible para los parámetros documentados.
Ignorado-silencioso — parcial15El método se ejecuta y produce salida, pero uno o más parámetros de TCPDF no surten efecto. Es una diferencia de comportamiento documentada.
No implementados — cuerpo vacío4El método existe por compatibilidad de código fuente, pero no hace nada.
No aplicable7El método de TCPDF no tiene efecto en la salida PDF; se excluye de forma intencionada.
Métodos de deriva de la API moderna añadidos17Métodos de Document de NextPDF v5.1+ expuestos en el adaptador para que el código de API mixta compile. Sin equivalente en TCPDF 6.x.

Estas cifras provienen de docs/TCPDF_COVERAGE.md §Summary. La matriz se verifica mediante tests/Unit/Compat/Tcpdf/TcpdfApiDriftTest.php y tests/Unit/Compat/Tcpdf/TcpdfStrictModeTest.php.

Nota sobre la redacción. Este paquete no afirma ser un «reemplazo directo (drop-in)» ni «100 % compatible con TCPDF». Cubre 94 de los ~120 métodos de TCPDF revisados mediante delegación directa; los métodos restantes presentan diferencias de comportamiento documentadas que se describen más abajo. La formulación precisa es alternativa compatible con TCPDF con una superficie de compatibilidad conocida y probada.

El adaptador se construye a partir de 25 traits de responsabilidad única (src/Compat/Tcpdf/Concerns/) que exponen 273 métodos públicos en total, además de un pequeño número de métodos de ciclo de vida y de escape en la propia clase TCPDF. Las categorías de cobertura anteriores cuentan métodos distintos de la superficie de la API de TCPDF 6.x (~120), no el recuento total de métodos públicos del adaptador. Los dos números miden cosas distintas: cobertura de la superficie de la API frente a tamaño de la implementación. Si en el README.md del paquete aparece un recuento menor de traits o de métodos, considerar docs/TCPDF_COVERAGE.md y esta página como fuentes autoritativas: el resumen del README es anterior al trait AdaptsDriftV51.

1. Métodos reflejados — delegación compatible

Sección titulada «1. Métodos reflejados — delegación compatible»

Noventa y cuatro métodos se asignan directamente a la instancia subyacente NextPDF\Core\Document. Los nombres PascalCase de TCPDF se asignan a nombres camelCase de NextPDF cuando el motor usa camelCase; el adaptador acepta ambas grafías por compatibilidad hacia adelante y hacia atrás.

Grupos representativos (tabla completa: docs/TCPDF_COVERAGE.md §1):

Área de TCPDFMétodos de ejemploTrait del adaptador
Ciclo de vidaOutput(), Close(), getPDFData()AdaptsLifecycle
PáginasAddPage(), getNumPages(), deletePage()AdaptsPageManagement
TextoCell(), MultiCell(), Write(), Text(), Ln()AdaptsTextOutput
FuentesSetFont(), SetFontSize(), AddFont()AdaptsFonts
ColoresSetTextColor(), SetDrawColor(), SetFillColor()AdaptsColors
DibujoLine(), Rect(), Circle(), Polygon(), Arrow()AdaptsDrawing
TransformacionesRotate(), Scale(), Translate(), Skew(), Mirror*()AdaptsTransforms
NavegaciónAddLink(), Annotation(), addTOC()AdaptsNavigation

Para estos métodos, el comportamiento observado es compatible con TCPDF 6.x para los parámetros documentados por NextPDF. El adaptador no garantiza una salida PDF idéntica byte a byte. El motor subyacente es una implementación independiente de PDF 2.0, por lo que los bytes generados difieren aunque el resultado visible sea equivalente. Si las pruebas validan los bytes exactos del PDF en lugar del contenido representado, es probable que esas aserciones necesiten una nueva línea base. Consultar /integrations/tcpdf-compat/migration/ para la estrategia de nueva línea base recomendada.

2. Métodos de ignorado-silencioso — diferencias de comportamiento documentadas

Sección titulada «2. Métodos de ignorado-silencioso — diferencias de comportamiento documentadas»

Estos 15 métodos se ejecutan y producen salida, pero al menos un parámetro de TCPDF se acepta por compatibilidad de código fuente y luego se ignora. Esta es la sección más importante antes de migrar, porque la llamada no falla: en silencio, hace menos que el original de TCPDF.

Método de TCPDFParámetros ignoradosAlternativa compatible
Image()type, link, align, resize, dpi, palign, ismask, imgmask, border, fitbox, hidden, fitonpage, alt, altimgsimage() de NextPDF recibe file, x, y, width, height. Para una imagen en la que se pueda hacer clic, dibujar la imagen y luego añadir Document::link() sobre el mismo rectángulo. El enmascaramiento de imágenes y las imágenes alternativas no son compatibles.
writeHTML()ln, fill, reseth, cell, alignwriteHtml() de NextPDF es solo de contenido. Envolver el HTML en un bloque posicionado mediante la API moderna para controlar el diseño.
writeHTMLCell()border (forma de cadena), ln, fill, reseth, autopaddingSe respetan el ancho, el alto, la posición y un borde booleano; el diseño de celdas más rico no tiene asignación.
ImageEps()link, useBoundingBox, align, palign, border, fitonpage, fixoutvalsSolo posición y tamaño.
ImageSVG()link, align, palign, border, fitonpageSolo posición y tamaño.
SetProtection()mode (distinto de cero), pubkeys (no vacío)NextPDF siempre usa AES-256 para el gestor estándar. Para el cifrado basado en certificados, usar el moderno setPublicKeyEncryption() expuesto en el adaptador (consultar /integrations/tcpdf-compat/security-and-operations/).
Bookmark()style, color, x, isNamedDestSe respetan el título, el nivel y la posición y.
setDestination()page, xSe respetan el nombre y la posición y.
Link()spacesSeguimiento interno de espacios en blanco de TCPDF; sin equivalente en el motor.
Annotation()claves de opción más allá de Subtype, spacesSe respetan el tipo, la posición y el texto.
SetLineStyle()detalle del patrón de guiones más allá del anchoSe asignan las propiedades de línea principales.
setAlpha()mapa parcial de modos de fusiónAlgunos nombres de modo de fusión no tienen equivalente en el motor.
Polycurve()lista completa de parámetrosSin operación en el modo por defecto; sin equivalente en el motor.
PieSectorXY()lista completa de parámetrosAsignación parcial (las líneas del centro al borde difieren).
RoundedRectXY()radio por esquinaSolo radio de esquina uniforme.

La forma en que el adaptador hace aflorar estas diferencias depende del modo estricto (consultar /integrations/tcpdf-compat/configuration/). Con el modo estricto desactivado (el valor por defecto retrocompatible), estas llamadas se degradan en silencio. Con el modo estricto activado, cada llamada que ignora un parámetro lanza TcpdfNotImplementedException con la lista exacta de parámetros ignorados y una sugerencia de migración. El modo estricto es una herramienta de auditoría, no un ajuste de producción.

El diseño del modo estricto sigue el principio de que quien hace la llamada debe poder observar cuándo no se ha respetado su intención. OWASP ASVS 5.0 §16.5.3 establece que una aplicación debe fallar de forma elegante y segura, y evitar las condiciones de fallo-abierto (fail-open). La pérdida silenciosa de parámetros es una trampa para la experiencia de desarrollo más que una vulnerabilidad, pero se aplica el mismo principio de fallar de forma explícita. El resumen de cláusulas fijado está en el front-matter de la página, en citations.

3. Métodos no implementados — cuerpos vacíos

Sección titulada «3. Métodos no implementados — cuerpos vacíos»

Cuatro métodos existen para que el código fuente heredado pueda compilar, pero sus cuerpos no hacen nada. Con el modo estricto activado, tres de ellos lanzan TcpdfNotImplementedException. El cuarto (Open()) es una operación nula segura y deliberada que nunca lanza, porque eliminarlo del código heredado siempre es seguro.

Método de TCPDFComportamientoReemplazo
setSignature()Operación nula (no almacena nada procesable). Lanza en modo estricto.La firma digital requiere una edición comercial de NextPDF. Usar la API de firma moderna con un objeto de valor CertificateInfo — consultar /integrations/tcpdf-compat/security-and-operations/.
addEmptySignatureAppearance()Operación nula. Lanza en modo estricto.La misma restricción de edición comercial que setSignature().
endPage()Operación nula. Lanza en modo estricto.NextPDF gestiona el ciclo de vida de las páginas automáticamente. Eliminar la llamada.
Open()Operación nula segura. Nunca lanza.NextPDF abre el documento automáticamente. Eliminar la llamada siempre es seguro.

La firma no está disponible en el motor central a través de este adaptador. El adaptador expone un punto de entrada de firma moderno que delega en el motor; la compatibilidad básica de firma está restringida a una edición comercial. Esta documentación no afirma nada sobre los perfiles de firma de validación a largo plazo o con marca de tiempo para ninguna edición — consultar /integrations/tcpdf-compat/security-and-operations/ para la formulación exacta y conservadora.

Siete métodos de TCPDF no tienen efecto en la salida PDF y se excluyen de forma intencionada. Llamarlos es inofensivo.

Método de TCPDFPor qué se excluye
setDocCreationTimestamp() / setDocModificationTimestamp()El estado se conserva en el adaptador pero no se conecta a los metadatos XMP del documento. No es visible en la salida.
setSRGBmode()La gestión de color de NextPDF es independiente de este indicador.
setPDFVersion()NextPDF selecciona la versión de PDF a partir de su perfil de conformance/output; no hay un setter directo. El adaptador emite un aviso y continúa.
setDocInfoUnicode()NextPDF siempre es Unicode; el indicador es una operación nula por diseño.
setDefaultMonospacedFont()Sin equivalente en el motor; en su lugar se aplica el estilo HTML/CSS.
setFontSubsetting()NextPDF siempre crea subconjuntos de las fuentes incrustadas; el indicador está, en la práctica, siempre activado.

La versión de PDF la fija el motor. La salida se escribe como PDF 2.0 (ISO 32000-2). ISO 32000-2 §7.5.2 especifica que un escritor conforme identifica la versión del documento — en la cabecera del archivo o en la entrada Version del catálogo — como 2.0. También especifica que la versión de un archivo no se rebaja a una versión anterior al guardar. Esto es coherente con el comportamiento del adaptador: llamadas como setPDFVersion('1.4') no pueden fijar como destino una versión de PDF anterior a través de este adaptador. El resumen de cláusulas fijado está en el front-matter de la página, en citations.

Diecisiete métodos del núcleo de NextPDF v5.1+ se exponen en el adaptador (trait AdaptsDriftV51) para que el código que mezcla la API de TCPDF con la API moderna siga compilando. Estos no tienen equivalente en TCPDF 6.x. Ejemplos: getWarnings(), hasWarnings(), embedFileFromString(), enableBiDi(), beginTag() / endTag(), enableLinearization(), useAesGcm(), useDocumentMac(), setConformanceMode(). Deben tratarse como API moderna, no como parte del contrato de compatibilidad con TCPDF.

6. Orientación sobre obsolescencia y reemplazo

Sección titulada «6. Orientación sobre obsolescencia y reemplazo»
Si el código llama a…EstadoAlternativa recomendada
Error()Comportamiento cambiado (reforzado)El die() de TCPDF se reemplaza por una RuntimeException lanzada. Envolver las llamadas arriesgadas en try/catch; no confiar en la terminación del proceso.
setPDFVersion()No aplicableEliminarlo. La salida siempre es PDF 2.0.
setUserRights()Obsoleto en PDF 2.0Eliminarlo. La llamada emite un aviso E_USER_DEPRECATED y se ignora.
setSignature()No implementado en el núcleoMigrar a la API de firma moderna en una edición comercial.
Image(...) con parámetros adicionalesIgnorado-silenciosoReducirlo a file, x, y, w, h; añadir Document::link() para imágenes en las que se pueda hacer clic.
endPage() / Open()No implementado / operación nulaEliminarlo.
  1. Instalar el paquete y ejecutar el conjunto de pruebas existente contra el adaptador sin cambios de código — consultar /integrations/tcpdf-compat/install/ y /integrations/tcpdf-compat/quickstart/.
  2. Activar el modo estricto en una ejecución de auditoría dedicada (no en producción): $pdf->setStrictMode(true);. Recopilar cada TcpdfNotImplementedException. Cada una nombra los parámetros ignorados exactos y una sugerencia de migración.
  3. Para cada sitio de llamada, elegir: descartar el parámetro ignorado, o migrar esa llamada a la API moderna mediante $pdf->getDocument().
  4. Restablecer la línea base de cualquier prueba que valide los bytes exactos del PDF; validar en su lugar el contenido representado o propiedades estructurales.
  5. Desactivar el modo estricto y desplegar la ruta de código auditada. Mantener un trabajo periódico de CI en modo estricto para detectar regresiones a medida que se refactoriza.

Procedimiento completo con código: /integrations/tcpdf-compat/migration/.

  • docs/TCPDF_COVERAGE.md — matriz de cobertura autoritativa y verificada por pruebas (en el repositorio)
  • /integrations/tcpdf-compat/migration/ — estrategia integral de migración de TCPDF a NextPDF
  • /integrations/tcpdf-compat/configuration/ — modo estricto y configuración del adaptador
  • /integrations/tcpdf-compat/security-and-operations/ — postura de cifrado y firma
  • /integrations/tcpdf-compat/integration/ — integración del adaptador en una aplicación
  • /integrations/tcpdf-compat/boot-and-discovery/ — registro de alias de clase y exposición de la fachada