2009-12-30 6 views
5

In Bezug auf einen früheren Beitrag (PDF Report generation)Convert HTML to PDF

Ich habe beschlossen, eine Lösung zu verwenden, ähnlich wie http://www.alistapart.com/articles/boom

Für diejenigen unter Ihnen, die nicht wollen entweder Referenz lesen - ich Ich erstelle einen Bericht und brauche ihn als PDF. Ich habe mich entschieden, die HTML -> PDF-Route mit .NET zu gehen.

Also sagen wir, ich bekomme die HTML-Datei genau wie ich es will. Was ist der beste Weg, diese Seite in PDF zu konvertieren? Im Wesentlichen möchte ich, dass der Benutzer eine "Vorschau" in HTML sieht und diese dann in PDF konvertieren kann. Die Bibliothek, mit der ich gerade experimentiere, ist ABCPdf.

Mein erster Gedanke war, die Seite in das Dateisystem zu speichern und verweisen Sie die URL in der Konvertierungsroutine während eines Eventhandlers auf der Seite selbst. Das hat seine Probleme, da ich die Seite jedes Mal, wenn sie gerendert wurde, speichern muss, um sie auszudrucken. Eigentlich scheint es nur nach hinten gerichtet zu sein.

Mein nächster Gedanke war, die Rendermethode der Seite zu verwenden, um die Seite als Bytestream zu erfassen und diese zu verwenden (da ABCPdf das Konvertieren eines HTML-Streams unterstützt.) Wenn dies meine Antwort ist, bin ich beim tatsächlichen Ziehen verloren es weg. Haben Sie eine Schaltfläche "Drucken", die Handler eine Me.Render() zu Bytestream und sendet das an die Konvertierungsroutine? Ist das überhaupt möglich?

Bottom line - Sobald eine Seite in nettem HTML gerendert wurde, wie initialisiert man eine Umwandlung in PDF dieser Seite? Workarounds und andere Lösungen sind willkommen.

Ich hoffe, ich etwas offensichtlich, wie diese bin fehlt hat bekam zu sein „der einfache Teil

+1

Außerdem spiele ich mit der Idee, die HTML-Vorlage der Seite in der DB zu speichern und die Daten programmatisch auszufüllen. Auf diese Weise habe ich den HTML-Code, mit dem ich alles machen kann, was ich will (rendern auf Bildschirm oder konvertieren). – IniTech

Antwort

3

Ok, habe es funktioniert - und es war ziemlich einfach. Ich gebe das einfach an den nächsten Mann weiter, der die Antwort brauchen könnte. Ich habe nur die URL-Eigenschaft der Seite verwendet und sie an die ABCPdf-Methode addImageUrl() gesendet. Musste auch verketten, da es mehr als eine Seite war. Danke für die Hilfe.

Dim oPdfDoc As New Doc() 
Dim iPageID As Int32 
Dim MyUrl = Request.Url 

iPageID = oPdfDoc.AddImageUrl(MyUrl.AbsoluteUri) 

While True 
    oPdfDoc.FrameRect() 
    If Not oPdfDoc.Chainable(iPageID) Then 
     Exit While 
    End If 
    oPdfDoc.Page = oPdfDoc.AddPage() 
    iPageID = oPdfDoc.AddImageToChain(iPageID) 
End While 

For i as Int32 = 1 To oPdfDoc.PageCount 
    oPdfDoc.PageNumber = i 
    oPdfDoc.Flatten() 
Next 

oPdfDoc.Save(Server.MapPath("test.pdf")) 
oPdfDoc.Clear() 
-2

Wie tun Sie es aus C#? Du machst das nicht (direkt).

Das Erstellen eines Worker PRINCE.EXE-Prozesses ist möglicherweise die einzige Option.

PRINCE.EXE liest/schreibt Daten aus HTML "Standardeingabe" und sendet PDF an "Standardausgabe". Verwenden Sie die Befehlszeile "% dir% \ PRINCE -" ohne Ausgabedateiname.

Möglicherweise benötigen Sie eine separate COM-Komponente, um PRINCE zu erstellen, da die System.Management-Klasse möglicherweise nicht für Sie funktioniert. Verwenden Sie Visual Basic oder C++, um Ihre COM-Komponente zu erstellen.

Das Einfügen von HTML in die Datenbank ist im Allgemeinen eine schlechte Idee, kann aber in Ihrem Fall in Ordnung sein, da es sich anhört, als wäre es im Wesentlichen statisch.

EDIT

Changed "Kind PRINCE.EXE" auf "Arbeiter PRINCE.EXE Prozess". Ich habe das komische Gefühl, dass PRINCE.EXE kein Kinderprozess sein muss.