2008-09-16 13 views

Respuesta

17

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

Después de guardar el contenido como PDF, use cfheader y cfcontent en combinación para generar el PDF como un archivo adjunto ("Guardar como") y agregue el archivo a la secuencia de respuesta. También agregué deletefile = "Sí" en la etiqueta cfcontent para mantener el sistema de archivos limpio de los 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"> 

Dicho sea de paso: estoy usando file.pdf para el nombre de archivo en el ejemplo de abajo, pero es posible que desee utilizar alguna secuencia generada al azar o una sesión para el nombre del archivo para evitar los problemas derivados de las condiciones de carrera.

1

No estoy tan familiarizado con ColdFusion, pero lo que debe hacer es configurar el tipo de contenido de la página cuando el usuario lo solicite como application/octet-stream. Esto les pedirá una descarga cada vez.

Espero que esto ayude!

3

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

Advertencia: Al igual que con el uso de cfheader/cfcontent, tienes que hacer esto antes de que el caché se vacía al navegador, ya que está haciendo básicamente lo mismo sin tener que guardar el archivo.

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

3

El enfoque <cfdocument> es la forma aprobada para 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 basados ​​en una plantilla PDF de resolución de impresión prediseñada. <cfdocument> me habría permitido aproximar el resultado, pero solo con imágenes de mapa de bits incrustadas en HTML. Es cierto, podía falsificar la resolución de impresión al hacer una imagen grande y escalarla en HTML, pero el original era un archivo limpio, agradable, de imagen vectorial y quería usar eso en su lugar.

Terminé usando una copia de <cfx_pdf> para hacer el trabajo. (Developer's Site, CF Tag Store) Es un contenedor CF alrededor de una biblioteca Java PDF que le permite manipular documentos PDF existentes, incluyendo rellenar formularios PDF, configurar permisos, fusionar archivos, dibujar gráficos vectoriales, tablas y texto, usar fuentes personalizadas, etc. Si está dispuesto a trabajar con eso, puede obtener resultados bastante espectaculares.

El único inconveniente es que parece que el desarrollador ha dejado este producto en pastoreo durante mucho tiempo. El sitio del desarrollador sigue siendo copyright 2003 y no menciona nada más allá de ColdFusion MX 6.1. Terminé teniendo que romper algunas de las plantillas encriptadas para arreglar un par de errores y hacer que funcionara como lo necesitaba. Sin embargo, es una herramienta poderosa.

Cuestiones relacionadas