Ir al contenido

Referencia de la API de Gotenberg

El paquete de Gotenberg expone un puente de servicio, GotenbergBridge, que convierte documentos de Office (docx, xlsx, pptx, odt, ods, odp) a PDF mediante una solicitud POST a un servicio Gotenberg externo. Ese puente se apoya en los value objects que se leen o se pasan: GotenbergConfig (el descriptor de servicio inmutable y sus límites), OfficeFormat (el enum de formatos admitidos), GotenbergConvertPayload (el cuerpo de la solicitud multipart) y GotenbergConvertResult (la respuesta PDF ya analizada). Un segundo nivel — GotenbergSecurityPolicy, GotenbergResponseParser y PinnedCurlTransport — contiene la maquinaria de validación, análisis y transporte con pinning que el puente gobierna internamente. Solo se usa al escribir código de transporte personalizado o pruebas.

Empieza aquí: crear un GotenbergConfig con la URL HTTPS del servicio y conectarlo a un GotenbergBridge con el cliente PSR-18 y las factories PSR-17. Después, llamar a convertFile() o convertString() y leer pdfData en el GotenbergConvertResult devuelto.

Estas son las tareas prácticas más frecuentes con este paquete, cada una con un fragmento ejecutable y verificado.

Indicar al puente una ruta; el formato se detecta a partir de la extensión.

<?php
declare(strict_types=1);
use NextPDF\Gotenberg\GotenbergBridge;
use NextPDF\Gotenberg\GotenbergConfig;
$config = new GotenbergConfig(
apiUrl: 'https://gotenberg.example.com',
timeout: 60,
apiKey: $apiKey,
);
$bridge = new GotenbergBridge(
config: $config,
httpClient: $psrHttpClient,
requestFactory: $psrRequestFactory,
streamFactory: $psrStreamFactory,
responseFactory: $psrResponseFactory,
);
$result = $bridge->convertFile('/path/to/report.docx');
\file_put_contents('/path/to/report.pdf', $result->pdfData);

Qué hace: valida la URL, la ruta, el tamaño y el nombre de archivo, envía una única solicitud multipart y escribe en disco los bytes del PDF devuelto.

Usar convertString() cuando ya se tienen los bytes; el nombre de archivo determina la detección del formato.

<?php
declare(strict_types=1);
use NextPDF\Gotenberg\GotenbergBridge;
/** @var GotenbergBridge $bridge */
$result = $bridge->convertString($xlsxBytes, 'spreadsheet.xlsx');
if (! $result->isValid()) {
throw new \RuntimeException('Conversion did not return a valid PDF.');
}

Qué hace: detecta xlsx a partir del nombre de archivo, convierte los bytes y confirma que el resultado empieza con la firma %PDF antes de usarlo.

Comprobar que el servicio está listo antes de convertir

Sección titulada «Comprobar que el servicio está listo antes de convertir»

Condicionar el trabajo a isAvailable(), que valida la URL sin generar tráfico y después envía un HEAD a /health.

<?php
declare(strict_types=1);
use NextPDF\Gotenberg\GotenbergBridge;
/** @var GotenbergBridge $bridge */
if (! $bridge->isAvailable()) {
throw new \RuntimeException('Gotenberg is not reachable.');
}

Qué hace: devuelve false (nunca lanza una excepción) ante una URL vacía, que no sea HTTPS o que apunte a una dirección privada, y ante cualquier error de red, de modo que permite fallar pronto antes de despachar una conversión.

Esta tabla describe la superficie del puente: sirve como referencia al construir GotenbergBridge o al llamar a sus métodos de conversión y comprobación de disponibilidad.

SímboloParámetrosComportamiento predeterminadoDevuelveLanza o falla conNotas
new GotenbergBridge(GotenbergConfig $config, ClientInterface $httpClient, RequestFactoryInterface $requestFactory, StreamFactoryInterface $streamFactory, ?LoggerInterface $logger = null, ?HtmlSecurityPolicyInterface $htmlSecurityPolicy = null, ?ResponseFactoryInterface $responseFactory = null)Config, cliente PSR-18, factories PSR-17, logger opcional, política HTML opcional, response factory opcional.Usa DefaultHtmlSecurityPolicy cuando no se proporciona ninguna política.GotenbergBridgeErrores de wiring del contenedor.La response factory permite usar el transporte cURL con pinning cuando se necesita pinning.
GotenbergBridge::convertFile(string $filePath)Ruta del sistema de archivos a un documento de Office.Usa la extensión del archivo para detectar el formato.GotenbergConvertResultGotenbergConvertException, RuntimeException, ValueError para un formato no admitido.Resuelve la ruta real y comprueba la legibilidad, el tamaño y el nombre de archivo.
GotenbergBridge::convertString(string $content, string $fileName)Bytes en bruto y nombre de archivo original.Usa la extensión del nombre de archivo para detectar el formato.GotenbergConvertResultIgual que convertFile.Usarlo cuando la aplicación ya tiene los bytes del archivo.
GotenbergBridge::isAvailable()ninguno.Solicitud HEAD a /health cuando la config es válida.boolDevuelve false ante errores.Solo es una señal de disponibilidad.
GotenbergBridge::getHtmlSecurityPolicy()ninguno.Devuelve la política configurada de la capa de análisis.HtmlSecurityPolicyInterfaceninguno esperado.Complementa la política de seguridad a nivel de transporte.

Esta tabla cubre los value objects que se construyen a mano: el descriptor de servicio GotenbergConfig y los portadores de solicitud y respuesta GotenbergConvertPayload/GotenbergConvertResult, cuando se necesita un control más fino que el que ofrecen los dos puntos de entrada de conversión.

SímboloParámetrosComportamiento predeterminadoDevuelveLanza o falla conNotas
new GotenbergConfig(string $apiUrl = '', int $timeout = 30, int $maxFileSize = 52428800, string $apiKey = '', array $pinnedPublicKeys = [], array $backupPublicKeys = [])URL de la API, tiempo de espera, tamaño máximo de archivo, bearer token, conjuntos de pins.La URL vacía no es válida; el tamaño máximo predeterminado es 50 MiB.GotenbergConfigninguno esperado.Mantener en secreto la clave de API.
GotenbergConfig::fromArray(array $config)api_url, timeout, max_file_size, api_key, arrays de pins.Los valores opcionales omitidos usan los valores predeterminados del constructor.GotenbergConfigninguno esperado.Las listas de cadenas ignoran los valores que no son cadenas.
GotenbergConfig::isValid()ninguno.Es válida cuando la URL de la API no está vacía.boolninguno esperado.La seguridad de la URL se valida antes de la E/S de red.
GotenbergConfig::allPublicKeyPins()ninguno.Combina los pins primarios y los de respaldo.list<string>ninguno esperado.Una lista vacía desactiva el pinning.
new GotenbergConvertPayload(string $fileName, string $fileContent, OfficeFormat $format, bool $landscape = false, string $nativePageRanges = '')Nombre de archivo, bytes, formato, indicador de orientación, rangos de páginas.Vertical; todas las páginas.GotenbergConvertPayloadninguno esperado.El payload se convierte en datos de formulario multipart.
GotenbergConvertPayload::toMultipartBody(string $boundary)Boundary multipart.Incluye el campo de rango de páginas solo cuando no está vacío.stringninguno esperado.El boundary lo genera el puente.
GotenbergConvertPayload::contentType(string $boundary)Boundary multipart.Usa multipart/form-data.stringninguno esperado.Adjuntarlo como el Content-Type de la solicitud.
new GotenbergConvertResult(string $pdfData, OfficeFormat $sourceFormat, float $renderTimeMs = 0.0)Bytes del PDF convertido, formato de origen, duración de renderizado opcional.La duración de renderizado es 0.0 cuando no se mide.GotenbergConvertResultninguno esperado.Lo devuelve GotenbergResponseParser::parse().
GotenbergConvertResult::isValid()ninguno.Es válido cuando los bytes del PDF convertido no están vacíos y parecen datos PDF.boolninguno esperado.Comprobarlo antes de persistir o transmitir el resultado.
GotenbergConvertResult::size()ninguno.Cuenta los bytes del PDF convertido.intninguno esperado.Usarlo para cuotas, telemetría y límites de respuesta.

Esta tabla corresponde al enum OfficeFormat. Sirve para mapear una extensión a un formato, leer su tipo MIME de subida o comprobar cuáles de los seis formatos están admitidos.

SímboloParámetrosComportamiento predeterminadoDevuelveLanza o falla conNotas
OfficeFormat::fromExtension(string $ext)Extensión de archivo con o sin el punto inicial.Coincidencia sin distinción entre mayúsculas y minúsculas.OfficeFormatValueError para una extensión no admitida.Valores admitidos: docx, xlsx, pptx, odt, ods, odp.
OfficeFormat::mimeType()ninguno.Mapea cada caso del enum al tipo MIME de subida.stringninguno esperado.Se usa en la parte de archivo multipart.
OfficeFormat::extension()ninguno.Devuelve el valor de respaldo del enum.stringninguno esperado.Útil para diagnósticos y nombres de archivo.

Esta tabla recoge la maquinaria interna que el puente gobierna. Debe usarse solo al escribir transporte personalizado, una llamada HTTP a medida que aun así necesite el análisis del paquete, o diagnósticos de bajo nivel de seguridad y pinning.

SímboloParámetrosComportamiento predeterminadoDevuelveLanza o falla conNotas
GotenbergSecurityPolicy::validateApiUrl(string $url)URL base de la API.Analiza y valida el destino antes de la E/S de red.arrayRuntimeException para URLs inseguras o no válidas.Mantiene fuera del código de conversión los errores de endpoint de tipo SSRF.
GotenbergSecurityPolicy::assertPinsStillValid(string $host, array $pinnedIps)Host y lista de IP con pin.Verifica que se cumplan las expectativas de pin de DNS.voidRuntimeException cuando los pins están obsoletos o no son válidos.Usarlo en despliegues con pinning y en diagnósticos operativos.
GotenbergSecurityPolicy::validateFileSize(int $size, int $maxSize)Tamaño real y máximo configurado.Acepta archivos iguales o inferiores al límite configurado.voidRuntimeException cuando el archivo es demasiado grande.Aplicarlo antes de construir la solicitud.
GotenbergSecurityPolicy::validateFileName(string $name)Nombre de archivo original.Rechaza nombres de archivo inseguros o no admitidos.voidRuntimeException para nombres no válidos.Evita nombres de archivo multipart malformados.
GotenbergResponseParser::parse(ResponseInterface $response, OfficeFormat $format)Respuesta PSR-7 y formato de Office esperado.Extrae los bytes del PDF convertido de una respuesta correcta.GotenbergConvertResultGotenbergConvertException para respuestas fallidas o salida PDF no válida.Parser central para la conversión tanto de archivo como de cadena.
new PinnedCurlTransport(ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory, array $pinnedIps = [], array $pinnedPublicKeys = [], int $timeoutSeconds = 30)Factories PSR-17, IP con pin, claves públicas con pin, tiempo de espera.Sin pins y tiempo de espera de 30 segundos.PinnedCurlTransportninguno esperado.Usarlo solo cuando se requiere pinning a nivel de cURL.
PinnedCurlTransport::sendRequest(RequestInterface $request)Solicitud PSR-7.Envía mediante cURL con el tiempo de espera configurado y los controles de pinning.ResponseInterfaceGotenbergConvertException ante un fallo de cURL o de transporte.Usarlo cuando el pinning no puede delegarse a otro cliente HTTP.
PinnedCurlTransport::buildCurlOptions(RequestInterface $request, string $host, int $port)Solicitud, host y puerto.Construye el array de opciones de cURL que usa sendRequest().arrayErrores de solicitud no válida o de configuración de pins.Diagnósticos de bajo nivel y hook de pruebas.
  • Tratar Gotenberg como un límite de servicio externo. Configurar de forma deliberada el tiempo de espera, el tamaño, la URL y la política de pins.
  • convertFile() lee el archivo completo en memoria antes de construir la solicitud.
  • Registrar metadatos como el nombre de archivo y la longitud del contenido, no el contenido del archivo.