Generación de PDF

Descargar tipos de TypeScript

SDK

typescript
	import { PGSClient } from '@ircg/pgs'
	
	const apiKey = process.env.IRCG_PGS_API_KEY
	if (!apiKey) throw new Error('IRCG_PGS_API_KEY is required')
	
	const pgs = new PGSClient({ apiKey })

El método generate devuelve { response, billing } o { error }. Usa generateUnsafe si prefieres recibir la respuesta directamente y controlar las excepciones.

Dry run

Configura dryRun: true para recibir un PDF sintético válido y facturación en cero, sin cargar la URL, realizar solicitudes HTTP ni consumir créditos. El nombre respeta el formato público de fileName y la respuesta incluye Cache-Control: no-store.

typescript
	const pgs = new PGSClient({ apiKey: 'unused', dryRun: true })
	const result = await pgs.generate({ fileName: 'invoice.pdf', url: 'https://example.com/invoice' })
	if (result.error) throw new Error(result.error.message)
	const pdf = await result.response.arrayBuffer()
	console.log(result.billing, pdf.byteLength)

API REST

  • La ruta usa Authorization: Bearer con una API key de PGS.
  • El cuerpo requiere Content-Type: application/json.
  • PGS no habilita CORS. Llama la API desde tu servidor y nunca publiques una API key.
MétodoRutaDescripción
POST/api/v1/pdfsGenerar y descargar un PDF.

Generar PDF POST

POST /api/v1/pdfs

typescript
	import { writeFile } from 'node:fs/promises'
	
	const input = {
	  url: 'https://example.com/invoices/123',
	  fileName: 'invoice-123.pdf',
	  timeoutSeconds: 10,
	  pdfOptions: { format: 'a4', printBackground: true }
	}
	
	// SDK
	const result = await pgs.generate(input)
	if (result.error) throw new Error(result.error.message)
	await writeFile('invoice-123.pdf', Buffer.from(await result.response.arrayBuffer()))
	console.log(result.billing)
	
	// REST
	const response = await fetch('https://ircg.dev/api/v1/pdfs', {
	  method: 'POST',
	  headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
	  body: JSON.stringify(input)
	})
	if (!response.ok) throw new Error(`PGS failed: ${response.status}`)
	await writeFile('invoice-123.pdf', Buffer.from(await response.arrayBuffer()))
	console.log({
	  billableSeconds: Number(response.headers.get('X-IRCG-Billable-Seconds')),
	  creditsConsumed: Number(response.headers.get('X-IRCG-Credits-Consumed')),
	  requestId: response.headers.get('X-IRCG-Request-ID')
	})

Encabezados

NombreTipoRequeridoDescripción
AuthorizationBearer sk_pg_…API key de PGS.
Content-Typeapplication/jsonTipo del cuerpo de la solicitud.

Cuerpo

CampoTipoRequeridoPor defectoDescripción
fileNamestringNodocument.pdfNombre de descarga de hasta 128 caracteres. PGS agrega .pdf cuando falta.
mediaTypePDFMediaTypeNoscreenUsa estilos CSS de pantalla o impresión.
pdfOptionsPDFOptionsNo{ format: 'a4', printBackground: true }Opciones cerradas de generación.
pdfOptions.displayHeaderFooterbooleanNofalseMuestra las plantillas de encabezado y pie.
pdfOptions.footerTemplatestringNo''Plantilla HTML de pie; máximo 16,000 caracteres.
pdfOptions.formatPDFFormatNoa4letter | legal | tabloid | ledger | a0 | a1 | a2 | a3 | a4 | a5 | a6
pdfOptions.headerTemplatestringNo''Plantilla HTML de encabezado; máximo 16,000 caracteres.
pdfOptions.heightnumber | `${number}px|in|cm|mm`No11.7in (A4)Alto personalizado. Debe enviarse junto con width.
pdfOptions.landscapebooleanNofalseUsa orientación horizontal.
pdfOptions.marginobjectNo{ top: 0, right: 0, bottom: 0, left: 0 }Márgenes superior, derecho, inferior e izquierdo.
pdfOptions.margin.topnumber | `${number}px|in|cm|mm`No0Margen top.
pdfOptions.margin.rightnumber | `${number}px|in|cm|mm`No0Margen right.
pdfOptions.margin.bottomnumber | `${number}px|in|cm|mm`No0Margen bottom.
pdfOptions.margin.leftnumber | `${number}px|in|cm|mm`No0Margen left.
pdfOptions.omitBackgroundbooleanNofalseHace transparente el fondo de la página.
pdfOptions.outlinebooleanNofalseIncluye el esquema del documento.
pdfOptions.pageRangesstringNo'' (todas las páginas)Rangos como 1-3,5; máximo 256 caracteres.
pdfOptions.preferCSSPageSizebooleanNofalsePrefiere el tamaño declarado por CSS.
pdfOptions.printBackgroundbooleanNotrueImprime gráficos de fondo.
pdfOptions.scalenumberNo1Escala entre 0.1 y 2.
pdfOptions.taggedbooleanNofalseGenera un PDF etiquetado para accesibilidad.
pdfOptions.widthnumber | `${number}px|in|cm|mm`No8.27in (A4)Ancho personalizado. Debe enviarse junto con height.
timeoutSecondsintegerNo10Tiempo máximo de carga, entre 5 y 60 segundos.
urlstringURL HTTPS, sin credenciales ni puerto, cuyo hostname exacto debe estar autorizado.
waitUntilPDFWaitUntilNonetworkidle2load | domcontentloaded | networkidle0 | networkidle2

format no puede combinarse con width o height. Si defines dimensiones personalizadas debes enviar ambas.

Encabezados de respuesta

NombreTipoDescripción
Content-Typeapplication/pdfTipo del cuerpo exitoso.
Content-DispositionstringNombre sugerido para la descarga.
Cache-Controlno-storeImpide almacenar la respuesta en caché.
X-IRCG-Request-IDUUIDIdentificador para diagnóstico.
X-IRCG-Billable-SecondsintegerSegundos facturables redondeados.
X-IRCG-Credits-ConsumedintegerCréditos consumidos.

Los tres encabezados X-IRCG-* también aparecen en errores que alcanzaron el navegador. Un rechazo anterior al navegador consume cero créditos.

PGS no conserva el PDF y todavía no ofrece una clave de idempotencia que permita repetir el binario. No reintentes automáticamente una generación: una nueva solicitud puede iniciar otro render y consumir créditos.

Respuestas

Límites y costos

  • Cada segundo iniciado de navegador cuesta 3 créditos. Por ejemplo, 1,250 ms se redondean a 2 segundos y consumen 6 créditos.
  • Los fallos, timeouts e intentos solo se cobran cuando se registra tiempo de navegador facturable. Las validaciones y rechazos previos no se cobran.
  • timeoutSeconds controla el tiempo máximo de cada solicitud: permite cortar una carga atascada y ajustar el límite a lo que normalmente tarda el recurso. También limita el costo máximo posible a timeoutSeconds × 3 créditos. Acepta enteros entre 5 y 60; su valor predeterminado es 10.
  • El límite de tiempo del render se comporta igual en suscripciones free y de paga. En free se reservan al inicio timeoutSeconds × 3 créditos y al terminar se devuelve la parte que no corresponda a segundos facturables registrados. En suscripciones de paga no hay reserva previa.
  • La URL debe usar HTTPS y su hostname debe añadirse previamente a la lista de hosts permitidos de PGS. No se admiten comodines, credenciales en la URL, puertos personalizados ni destinos locales o privados.
  • PGS transmite el PDF y no lo conserva. Para persistirlo, sube la respuesta a FSS como una operación y un cargo independientes.