2008-09-16 6 views

Antwort

17

Sie sollten das cfdocument-Tag (mit format = "PDF") verwenden, um die PDF-Datei zu generieren, indem Sie sie um die von Ihnen generierte Seite platzieren. Sie sollten ein Dateinamensattribut angeben, andernfalls wird das Dokument direkt in Ihren Browser übertragen.

Nachdem Sie den Inhalt als PDF gespeichert haben, verwenden Sie cfheader und cfcontent in Kombination, um die PDF-Datei als Anhang auszugeben ("Speichern unter") und die Datei dem Antwortstream hinzuzufügen. Ich fügte auch deletefile = "Yes" auf dem cfcontent-Tag hinzu, um das Dateisystem von den Dateien sauber zu halten.

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

Als Nebenwirkung: Ich verwende nur file.pdf für den Dateinamen im Beispiel unten, aber Sie könnten einige zufällige oder Sitzung generierte Zeichenfolge für den Dateinamen verwenden möchten, Probleme von Rennbedingungen resultieren zu vermeiden.

1

Ich bin nicht so vertraut mit ColdFusion, aber was Sie tun müssen, ist der Content-Type der Seite, wenn der Benutzer es anfordert, Anwendung/Octet-Stream. Dadurch werden sie jedes Mal zum Herunterladen aufgefordert.

Hoffe, das hilft!

3

Wenn Sie das Speichern der PDF-Datei überhaupt vermeiden möchten, senden Sie mit cfdocument ohne Dateinamen die PDF-Datei (von Flashpaper) direkt an den Browser, ohne cfheader und cfcontent zu verwenden.

Vorbehalt: Wie bei der Verwendung von cfheader/cfcontent müssen Sie dies tun, bevor der Cache in den Browser geleert wird, da es im Grunde dasselbe tut, ohne die Datei speichern zu müssen.

Um den Inhalt zu bekommen, würde ich wahrscheinlich cfsavecontent um die gleichen Anrufe/Includes/etc gewickelt verwenden. die die Seite generieren, mit zwei wichtigen Ausnahmen. cfdocument scheint Probleme mit externen Stylesheets zu haben, daher ist es wahrscheinlich eine gute Idee, ein Include zu verwenden, um die Styles direkt in das Dokument einzufügen. Sie können stattdessen versuchen, einen @import zu verwenden - es funktioniert für einige Leute. Außerdem würde ich auf relative Links zu Bildern achten, da diese manchmal brechen können.

3

Der Ansatz <cfdocument> ist der sanktionierte Weg, um es zu tun, aber es bietet nicht alles mögliche in der Art der Manipulation bestehender PDF-Dokumente. Ich hatte ein Projekt, bei dem ich Gutscheine erstellen musste, die auf einer vordefinierten PDF-Vorlage mit Druckauflösung basieren. <cfdocument> hätte mich die Ausgabe annähern lassen, aber nur mit in HTML eingebetteten Bitmap-Bildern. Es stimmt, ich könnte die Druckauflösung fälschen, indem ich ein großes Bild mache und es in HTML skaliere, aber das Original war eine schöne, saubere Vektorbilddatei und ich wollte das stattdessen verwenden.

Ich endete mit einer Kopie von <cfx_pdf>, um die Arbeit zu erledigen. (Developer's Site, CF Tag Store) Es ist ein CF-Wrapper um eine Java-PDF-Bibliothek, mit der Sie vorhandene PDF-Dokumente bearbeiten können, einschließlich PDF-Formulare ausfüllen, Berechtigungen festlegen, Dateien zusammenführen, Vektorgrafik, Tabellen und Text zeichnen, benutzerdefinierte Schriftarten usw. verwenden Wenn Sie bereit sind, damit zu arbeiten, können Sie einige ziemlich spektakuläre Ergebnisse erzielen.

Der einzige Nachteil ist, dass der Entwickler dieses Produkt für eine lange Zeit auf der Weide gelassen hat. Die Entwicklerwebsite ist weiterhin urheberrechtlich geschützt und erwähnt nichts, was ColdFusion MX 6.1 zuvor veröffentlicht hat. Am Ende musste ich einige der verschlüsselten Templates durchbrechen, um ein paar Bugs zu beheben und es so funktionieren zu lassen, wie ich es brauchte. Trotzdem ist es ein mächtiges Werkzeug.