Ir al contenido

Guía de desarrollo para Gotenberg

El paquete de Gotenberg delega la conversión en un servicio externo. El código de la aplicación debe hacer explícito el límite del servicio: validar la entrada, construir un payload, enviar la solicitud, analizar el resultado y manejar los fallos del servicio.

Usar esta guía al crear flujos de trabajo de conversión de Office a PDF, endpoints de subida, comprobaciones de estado del servicio o políticas de transporte en torno a nextpdf/gotenberg.

CapaPropiedad deResponsabilidadNo incluir aquí
Subida u origen del documentoAplicaciónAutorizar a quien llama, validar el origen y elegir la política de conversión.Decisiones sobre la URL del servicio o la fijación del transporte.
Detección de formatonextpdf/gotenbergAsigna las extensiones seguras a OfficeFormat.Confianza en el MIME sin validación de la aplicación.
Puentenextpdf/gotenbergConstruye la solicitud multipart, llama a Gotenberg y analiza la respuesta PDF.Consultas de dominio o política de almacenamiento.
Servicio GotenbergDespliegueConvierte el documento de Office a PDF.Autorización de la aplicación PHP.
Motor principalnextpdf/nextpdfImportar o combinar, opcionalmente, los datos del PDF convertido.Conversión de Office.
EtapaComportamientoAcción del desarrollador
Creación de la configuraciónSe cargan la URL de la API, el tiempo de espera, el tamaño máximo, la clave de API y los pins.Mantener la URL del servicio y el token fuera del código fuente.
Validación de la entradaSe comprueban la ruta, el tamaño, el nombre y la extensión del archivo, además de la seguridad de la URL.Rechazar la entrada no admitida antes del envío.
Construcción del payloadGotenbergConvertPayload construye los datos del formulario multipart.Conservar el nombre de archivo original solo cuando sea seguro.
Solicitud al servicioEl puente envía la solicitud a /forms/libreoffice/convert.Configurar el tiempo de espera y la política de transporte.
Análisis del resultadoGotenbergResponseParser::parse() devuelve los bytes del PDF y los metadatos.Tratar las respuestas de error o que no sean PDF como fallos de conversión.
RutaPropósito
app/Pdf/Conversion/*Adaptador de aplicación en torno a GotenbergBridge.
app/Pdf/Uploads/*Validación de subidas, almacenamiento y política de nombres de archivo.
app/Pdf/ConversionPolicy/*Política de tamaño, formato y selección de servicio.
tests/Pdf/Conversion/*Pruebas de formato, archivo, servicio y transporte.

Mantener la validación de archivos separada de la conversión. Un servicio de conversión debe recibir una entrada ya autorizada y, aun así, apoyarse en la validación del paquete como defensa en profundidad.

<?php
use NextPDF\Gotenberg\GotenbergBridge;
final readonly class OfficeConversionService
{
public function __construct(
private GotenbergBridge $bridge,
) {}
public function convertUploadedFile(string $safePath): string
{
$result = $this->bridge->convertFile($safePath);
if (!$result->isValid()) {
throw new RuntimeException('The conversion service did not return a valid PDF.');
}
return $result->pdfData;
}
}
PatrónAPICuándo usarloRestricción
Convertir una ruta de archivoGotenbergBridge::convertFile()El documento ya está almacenado en disco.La ruta debe ser legible y estar aprobada por la política.
Convertir bytes en memoriaGotenbergBridge::convertString()La aplicación ya tiene bytes provenientes de una subida o de un almacén de objetos.El nombre de archivo sigue controlando la detección de formato.
Construir el payload directamenteGotenbergConvertPayloadLas pruebas o el código de transporte personalizado necesitan bytes multipart.Mantener la generación del límite fuera de la entrada del usuario.
Analizar la respuesta directamenteGotenbergResponseParser::parse()Una llamada HTTP personalizada que, aun así, necesita el análisis del paquete.Pasar el OfficeFormat esperado.

GotenbergBridge::isAvailable() es una señal de disponibilidad. No debe ser la única protección en tiempo de ejecución. Un servicio puede estar disponible durante la comprobación de disponibilidad y, aun así, fallar en la siguiente conversión.

ComprobaciónPropósitoNota operativa
Validez de la configuraciónDetecta la falta de la URL de la API.Ejecutarla durante el arranque de la aplicación o las comprobaciones de despliegue.
/health disponibleDetecta si el servicio es accesible.Usarla para los paneles de disponibilidad.
Conversión de un fixture pequeñoDetecta una instalación de LibreOffice averiada o una regresión del servicio.Ejecutarla en pruebas de humo programadas, no en cada solicitud.
Monitoreo del tiempo de esperaDetecta el comportamiento lento del servicio.Hacer seguimiento por formato y tamaño de archivo.
Punto de extensiónUsar paraRestricción
PSR-18 ClientInterfaceComportamiento personalizado del cliente HTTP.Debe seguir la semántica de response/exception de PSR-18.
Factorías de PSR-17Creación de solicitudes y streams.Necesaria para construir el puente.
HtmlSecurityPolicyInterfacePolítica de la capa de análisis para entradas HTML.Complementa la política de seguridad de Gotenberg.
ResponseFactoryInterfaceConstrucción de la respuesta del transporte cURL fijado.Necesaria solo cuando se usa la ruta de transporte del paquete.
GotenbergSecurityPolicyValidación de la URL, el tamaño del archivo, el nombre del archivo y los pins.Mantener la autorización de la aplicación fuera de esta capa.
  1. Empezar con convertString() en las pruebas para que los fixtures sean explícitos.
  2. Agregar convertFile() solo después de que las rutas del sistema de archivos estén controladas.
  3. Mantener el tamaño máximo de archivo por debajo de los límites del servicio y de la infraestructura.
  4. Usar isAvailable() para las señales de disponibilidad, no como sustituto del manejo de errores.
  5. Registrar el nombre de archivo, el formato, el tamaño, el estado y la duración. No registrar los bytes del documento.
  6. Agregar pruebas de tiempo de espera y de modos de fallo antes de exponer los endpoints de subida.
FalloDónde debe manejarseRespuesta recomendada
Extensión no admitidaDetección de formato.Rechazar antes del envío al servicio.
Nombre de archivo no seguroPolítica de seguridad.Rechazar y normalizar la política de nombres de las subidas.
Archivo demasiado grandePolítica de subidas y validación del paquete.Rechazar antes de leer o enviar payloads grandes.
Gotenberg no disponibleLímite del puente.Devolver un error de aplicación reintentable cuando corresponda.
Respuesta que no es PDFAnalizador de respuestas.Tratarla como un fallo de conversión y capturar el estado del servicio.
Fallo de validación del pin o de la URLPolítica de transporte.Fallar de forma cerrada y alertar a los operadores.
AspectoPredeterminadoCuándo cambiarlo
Tiempo de espera30 segundos.Aumentarlo solo después de medir la latencia real del servicio.
Tamaño máximo de archivo52,428,800 bytes.Reducirlo para endpoints públicos o multiinquilino.
Clave de APIVacía.Configurarla para despliegues privados de Gotenberg.
Formatos admitidosdocx, xlsx, pptx, odt, ods, odp.Agregar formatos solo cuando OfficeFormat y el analizador los admitan.
Conjuntos de pinsVacíos.Agregar pins con pins de respaldo y un procedimiento de rotación.
  • Las pruebas de formato deben cubrir las extensiones admitidas y no admitidas.
  • Las pruebas de archivos deben cubrir nombres de archivo faltantes, ilegibles, demasiado grandes y no seguros.
  • Las pruebas de servicio deben cubrir respuestas que no son 2xx, cuerpos de respuesta no válidos y excepciones de transporte.
  • Las pruebas de seguridad deben cubrir URLs de servicio privadas o no válidas cuando la política las prohíbe.
  • Las pruebas de tiempo de espera deben comprobar que el tiempo de espera configurado se pasa al transporte.
  • Las pruebas de fixtures deben mantener los documentos de muestra pequeños y no sensibles.