2009-12-30 7 views
5

In riferimento ad un precedente post (PDF Report generation)convertire HTML in PDF

ho deciso di utilizzare una soluzione simile a http://www.alistapart.com/articles/boom

Per quelli di voi che non vogliono leggere o di riferimento - I Sto creando un rapporto e ne ho bisogno come PDF. Ho deciso di andare al percorso HTML -> PDF usando .NET.

Quindi, diciamo che ottengo il file HTML esattamente come lo voglio. Qual è il modo migliore per convertire la pagina in PDF? In sostanza, mi piacerebbe che l'utente vedesse una "anteprima" in HTML e quindi fosse in grado di convertire la pagina in PDF. La libreria che sto attualmente sperimentando è ABCPdf.

Il mio primo pensiero è stato quello di salvare la pagina nel filesystem e fare riferimento al suo URL nella routine di conversione durante un eventhandler sulla pagina stessa. Questo ha i suoi problemi perché dovrei salvare la pagina ogni volta che è stata renderizzata in preparazione per stamparla. In realtà, sembra solo backasswards.

Il mio prossimo pensiero è stato quello di utilizzare il metodo di rendering della pagina per acquisire la pagina come un puntatore e usarlo (poiché ABCPdf supporta la conversione di un flusso di HTML.) Se questa è la mia risposta, mi sono perso per come tirare fuori. Avere un pulsante "Stampa" che è il gestore esegue un Me.Render() su bytestream e inviarlo alla routine di conversione? È possibile?

Bottom line - Una volta che una pagina viene visualizzata in HTML, come si inizializza una conversione in PDF di quella pagina? Soluzioni alternative e altre soluzioni sono benvenute.

Sto sperando che mi manca qualcosa ovvio come questo ha avuto modo di essere "la parte più facile"

+1

Inoltre, mi sto prendendo gioco dell'idea di salvare il modello HTML della pagina nel DB e di inserire i dati in modo programmatico. In questo modo, ho l'HTML che posso fare tutto ciò che voglio con (renderizzare sullo schermo o convertire) – IniTech

risposta

3

Ok, ho funzionato - ed è stato abbastanza semplice. Basta passarlo al prossimo ragazzo che potrebbe aver bisogno della risposta. Ho appena usato la proprietà Url della pagina e l'ho inviata al metodo ABCPdf addImageUrl(). Doveva anche usare il concatenamento dato che era più di una pagina. Grazie per tutto l'aiuto.

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

Come si fa a farlo da C#? Non lo fai (direttamente).

Generare un processo PRINCE.EXE di lavoro potrebbe essere l'unica opzione.

PRINCE.EXE legge/scrive i dati da "input standard" HTML e invia PDF a "output standard". Utilizzare la riga di comando "% dir% \ PRINCE -" senza nome file di output.

È possibile che sia necessario un componente COM separato per generare PRINCE, poiché la classe System.Management potrebbe non funzionare. Utilizzare Visual Basic o C++ per creare il componente COM.

Inserire l'HTML nel database è una cattiva idea in generale, ma potrebbe essere ok nel tuo caso, poiché sembra che sia essenzialmente statico.

EDIT

Cambiato "bambino PRINCE.EXE" a "processo PRINCE.EXE lavoratore". Mi sembra strano che PRINCE.EXE non debba essere un processo secondario.