Question

Je souhaite convertir le fichier HTML généré par ma page CFM en un fichier PDF et demander à l'utilisateur de spécifier le standard & "Enregistrer sous &"; invite lors de la navigation sur ma page.

Était-ce utile?

La solution

Vous devez utiliser la balise cfdocument (avec format = " PDF ") pour générer le fichier PDF en le plaçant autour de la page que vous générez. Vous voudrez spécifier un attribut de nom de fichier, sinon le document sera diffusé directement dans votre navigateur.

Après avoir enregistré le contenu au format PDF, utilisez conjointement cfheader et cfcontent pour générer le fichier PDF en tant que pièce jointe (& "Enregistrer sous &";) et ajouter le fichier au flux de réponse. J'ai également ajouté deletefile = & Quot; Yes & Quot; sur la balise cfcontent pour maintenir le système de fichiers propre des fichiers.

<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">

En passant: j'utilise simplement fichier.pdf pour le nom de fichier dans l'exemple ci-dessous, mais vous souhaiterez peut-être utiliser une chaîne aléatoire ou générée par une session pour le nom de fichier afin d'éviter les problèmes résultant de conditions de concurrence critique.

Autres conseils

Si vous voulez éviter de stocker le fichier PDF, utiliser cfdocument sans nom de fichier enverra le pdf (du flashpaper) directement au navigateur, sans utiliser cfheader et cfcontent.

Mise en garde: comme avec cfheader / cfcontent, vous devez le faire avant que le cache ne soit vidé dans le navigateur, car il fait la même chose sans stocker le fichier.

Pour obtenir le contenu, j’utiliserais probablement cfsavecontent autour des mêmes appels / includes / etc. qui génèrent la page, à deux exceptions majeures. cfdocument semble avoir des problèmes avec les feuilles de style externes, il est donc probablement judicieux d'utiliser une inclusion pour insérer les styles directement dans le document. Vous pouvez plutôt utiliser un @import - cela fonctionne pour certaines personnes. De plus, je ferais attention aux liens relatifs aux images, car ils peuvent parfois casser.

L’approche <cfdocument> est le moyen approprié de le faire. Toutefois, elle n’offre pas tout ce qui est possible pour manipuler des documents PDF existants. J'avais un projet pour lequel je devais générer des coupons à l'aide d'un modèle PDF prédéfini de résolution d'impression. <cfx_pdf> m'aurait permis de faire une approximation de la sortie, mais uniquement avec des images bitmap incorporées au format HTML. Certes, je pouvais simuler une résolution d’impression en créant une grande image et en la redimensionnant au format HTML, mais l’original était un fichier image vectoriel propre et agréable que je souhaitais utiliser à la place.

J'ai fini par utiliser une copie de <=> pour faire le travail. ( site du développeur , Magasin de balises CF ) Il s'agit d'un encapsuleur CF autour d'une bibliothèque Java PDF qui vous permet de manipuler des documents PDF existants, notamment de remplir des formulaires PDF, de définir des autorisations, de fusionner des fichiers, de dessiner des graphiques vectoriels, etc. Les tableaux et le texte utilisent des polices personnalisées, etc. Si vous voulez travailler avec, vous pouvez obtenir des résultats assez spectaculaires.

Le seul inconvénient est qu’il apparaît que le développeur a laissé ce produit au pâturage pendant longtemps. Le site du développeur est toujours sous copyright 2003 et ne mentionne rien au-delà de ColdFusion MX 6.1. J'ai fini par devoir casser certains des modèles chiffrés afin de corriger quelques bugs et de les faire fonctionner à ma guise. Néanmoins, c’est un outil puissant.

Je ne connais pas très bien ColdFusion, mais vous devez définir le type de contenu de la page lorsque l'utilisateur le demande comme application / octet-stream. Cela leur demandera un téléchargement à chaque fois.

J'espère que ça aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top