Mostrar e imprimir

Qué devuelve un documento dinámico, cómo lo muestra el visor de Play, cómo incrustarlo en tu web y cómo lo convierte Dinaup en PDF.

Un documento dinámico devuelve una página HTML completa. Play la muestra en su visor; si la recibes por la API, la muestras tú.

Lo que devuelve el servidor

Por la API REST, POST /api/dynamicdocuments responde 200 con el documento como texto (text/plain), no como JSON:

curl -X POST "https://<conkw>.dinaup.io/api/dynamicdocuments?id=<id-del-documento>" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ "factura": "<id-de-la-factura>" }'

Con el SDK .NET, DynamicDocuments_ExecuteAsync recibe además los metadatos y el estado:

Campo JSONEn el SDKQué es
documentoContentEl HTML con el código ya ejecutado. Con el metadato enurl a 1, la URL del fichero temporal.
nombreNameEl metadato titulo. FileName devuelve email_attachment_name si existe y, si no, Name.
metadatosMetadataTodas las claves fijadas con F.MetaData_Set.
estadoStatus0 con contenido, 3 faltan respuestas.

El visor de Play

Desde el menú de impresión de una ficha, Play abre el documento en un visor con el HTML dentro de un iframe de 240 mm de ancho. Los botones dependen de los metadatos:

BotónCuándo apareceQué hace
ImprimirSiempre que hay contenidoAbre el diálogo de impresión del navegador sobre el iframe.
Enviar por emailSin email_signAbre la vista previa del correo. Con email_body adjunta el PDF; sin él, el documento es el cuerpo.
Enviar a firmarCon email_signGenera el PDF y abre el diálogo de firma. Tras enviarlo cambia a Enviado a firmar.
CerrarSiempreCierra el visor.

Incrustado en un panel o en la pantalla de cobro, el visor no muestra botones. La vista de resultado de un informe lleva Imprimir / Guardar PDF.

Cómo convierte Dinaup a PDF

Los PDF que adjunta el correo y los que van a firma los genera PdfGenerator. Envía el HTML al servicio de conversión de Dinaup, que usa Cloudflare Browser Rendering, y guarda el PDF en una URL temporal.

Declara el papel y el margen en la plantilla con @page:

@page { size: A4; margin: 14mm 14mm 12mm; }

Incrustarlo en tu web

El HTML trae su propio <style> y sus <script>. Insertarlo con innerHTML no ejecuta los scripts, así que una plantilla con Vue muestra las llaves {{ }} sin datos. Muéstralo en su propio iframe.

srcdoc + sandboxblob: en el mismo origen
El documento se muestra
Tu página puede medirlo o imprimirloNo
El documento puede leer tu sesiónNo
CuándoDatos que no controlasTu propio Dinaup dentro de tu aplicación
<iframe id="doc" sandbox="allow-scripts" style="width:100%;height:100vh;border:0"></iframe>
<script>
  const respuesta = await fetch('/mi-backend/factura/123'); // tu backend llama a Dinaup
  document.getElementById('doc').srcdoc = await respuesta.text();
</script>

sandbox="" desactiva todos los permisos, JavaScript incluido. Con allow-scripts, Vue se ejecuta. Si añades allow-same-origin, el aislamiento desaparece: usa entonces la variante blob:.

const marco = document.getElementById('doc');
const url = URL.createObjectURL(new Blob([html], { type: 'text/html' }));
marco.onload = () => URL.revokeObjectURL(url);
marco.src = url;

marco.contentWindow.print();
marco.style.height = marco.contentDocument.body.scrollHeight + 'px';

Llama a la API desde tu backend. La clave API no viaja al navegador.

Convertirlo a PDF fuera de Dinaup

Vale cualquier navegador sin interfaz. Espera a que termine el JavaScript, imprime los fondos y usa papel A4:

const pagina = await navegador.newPage();
await pagina.setViewport({ width: 794, height: 1123 });
await pagina.setContent(html, { waitUntil: 'networkidle0' });
const pdf = await pagina.pdf({ format: 'A4', printBackground: true });

networkidle0 espera a que no queden descargas en curso. Bootstrap y Vue llegan de internet; hasta que se ejecutan, la factura no tiene datos.

Fallos frecuentes

Lo que vesCausa
Llaves {{ }} en vez de datosEl JavaScript no se ejecutó: innerHTML, sandbox sin allow-scripts o PDF capturado antes de tiempo.
Documento en blancoLa pregunta llegó vacía. Comprueba el cuerpo de la petición y que el registro existe.
Sin estilosBootstrap y las fuentes vienen de internet y tu red o tu CSP los bloquea.
Sin colores de fondo en el PDFFalta printBackground: true en tu conversor.

Siguiente: Envío de emails. Endpoint: API REST.

En esta página