Pregunta

Me gustaría convertir el HTML generado por mi página CFM en un PDF y que el usuario reciba el mensaje estándar "Guardar como" cuando navegue a mi página.

¿Fue útil?

Solución

Debes usar la etiqueta cfdocument (con formato="PDF") para generar el PDF colocándolo alrededor de la página que estás generando.Querrá especificar un atributo de nombre de archivo; de lo contrario, el documento simplemente se transmitirá directamente a su navegador.

Después de haber guardado el contenido como PDF, use cfheader y cfcontent en combinación para generar el PDF como un archivo adjunto ("Guardar como") y agregar el archivo al flujo de respuesta.También agregué deletefile="Yes" en la etiqueta cfcontent para mantener el sistema de archivos limpio de archivos.

<cfdocument format="PDF" filename="file.pdf" overwrite="Yes">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    Hello World
</body>
</html>
</cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=file.pdf">
<cfcontent type="application/octet-stream" file="#expandPath('.')#\file.pdf" deletefile="Yes">

Como un aparte:Solo estoy usando file.pdf para el nombre de archivo en el siguiente ejemplo, pero es posible que desees usar alguna cadena aleatoria o generada por sesión para el nombre de archivo para evitar problemas resultantes de las condiciones de carrera.

Otros consejos

Si desea evitar almacenar el PDF, usar cfdocument sin un nombre de archivo enviará el pdf (de flashpaper) directamente al navegador sin usar cfheader y cfcontent.

Advertencia:Al igual que con el uso de cfheader/cfcontent, debe hacer esto antes de que el caché se vacíe en el navegador, ya que básicamente hace lo mismo sin tener que almacenar el archivo.

Para obtener el contenido, probablemente usaría cfsavecontent envuelto en las mismas llamadas/incluye/etc.que generan la página, con dos grandes excepciones.cfdocument parece tener problemas con las hojas de estilo externas, por lo que probablemente sea una buena idea usar una inclusión para colocar los estilos directamente en el documento.Puedes intentar usar @import en su lugar; funciona para algunas personas.Además, tendría cuidado con los enlaces relativos a imágenes, ya que a veces pueden romperse.

El <cfdocument> Este enfoque es la forma autorizada de hacerlo, sin embargo, no ofrece todo lo posible en la forma de manipular documentos PDF existentes.Tenía un proyecto en el que necesitaba generar cupones utilizando una plantilla PDF prediseñadas y con resolución de impresión. <cfdocument> Me habría permitido aproximarme al resultado, pero sólo con imágenes de mapa de bits incrustadas en HTML.Es cierto que podía falsificar la resolución de impresión creando una imagen grande y escalándola en HTML, pero el original era un archivo de imagen vectorial bonito y limpio y quería usarlo en su lugar.

Terminé usando una copia de <cfx_pdf> para hacer el trabajo.(Sitio del desarrollador, Tienda de etiquetas CF) Es un contenedor CF de una biblioteca PDF de Java que le permite manipular documentos PDF existentes, incluido completar formularios PDF, configurar permisos, fusionar archivos, dibujar gráficos vectoriales, tablas y texto, usar fuentes personalizadas, etc., etc.Si está dispuesto a trabajar con él, puede obtener resultados bastante espectaculares.

El único inconveniente es que parece que el desarrollador ha dejado este producto abandonado durante mucho tiempo.El sitio del desarrollador todavía tiene derechos de autor de 2003 y no menciona nada más allá de ColdFusion MX 6.1.Terminé teniendo que romper algunas de las plantillas cifradas para corregir un par de errores y hacer que funcionara como lo necesitaba.No obstante, es una herramienta poderosa.

No estoy muy familiarizado con ColdFusion, pero lo que hay que hacer es configurar el tipo de contenido de la página cuando el usuario solicita que sea aplicación/flujo de octeto.Esto les solicitará una descarga cada vez.

¡Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top