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 JSON | En el SDK | Qué es |
|---|---|---|
documento | Content | El HTML con el código ya ejecutado. Con el metadato enurl a 1, la URL del fichero temporal. |
nombre | Name | El metadato titulo. FileName devuelve email_attachment_name si existe y, si no, Name. |
metadatos | Metadata | Todas las claves fijadas con F.MetaData_Set. |
estado | Status | 0 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ón | Cuándo aparece | Qué hace |
|---|---|---|
| Imprimir | Siempre que hay contenido | Abre el diálogo de impresión del navegador sobre el iframe. |
| Enviar por email | Sin email_sign | Abre la vista previa del correo. Con email_body adjunta el PDF; sin él, el documento es el cuerpo. |
| Enviar a firmar | Con email_sign | Genera el PDF y abre el diálogo de firma. Tras enviarlo cambia a Enviado a firmar. |
| Cerrar | Siempre | Cierra 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 + sandbox | blob: en el mismo origen | |
|---|---|---|
| El documento se muestra | Sí | Sí |
| Tu página puede medirlo o imprimirlo | No | Sí |
| El documento puede leer tu sesión | No | Sí |
| Cuándo | Datos que no controlas | Tu 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 ves | Causa |
|---|---|
Llaves {{ }} en vez de datos | El JavaScript no se ejecutó: innerHTML, sandbox sin allow-scripts o PDF capturado antes de tiempo. |
| Documento en blanco | La pregunta llegó vacía. Comprueba el cuerpo de la petición y que el registro existe. |
| Sin estilos | Bootstrap y las fuentes vienen de internet y tu red o tu CSP los bloquea. |
| Sin colores de fondo en el PDF | Falta printBackground: true en tu conversor. |
Siguiente: Envío de emails. Endpoint: API REST.