Posts
163
Comments
179
Trackbacks
5
settembre 2008 Blog Posts
Compilare un template PDF in ASP.NET

Dopo mesi di assenza torno a postare nel mio blog e, complice un cambio di lavoro, spero di poterlo fare più assiduamente da qui in avanti.
Bando alle ciance: in una mia applicazione ASP.NET è nata una nuova esigenza e cioè quella di consentire agli utenti la stampa in PDF di vari moduli precompilati.
Come fare? I metodi sono tanti, le librerie PDF presenti sul mercato sono innumerevoli. La soluzione che propongo in questo post è quella di usare template PDF più la libreria gratuita iTextSharp. I template PDF possono essere realizzati con un qualsiasi strumento di editing e devono solo avere una serie di field nei punti in cui dovranno essere inseriti dinamicamente i dati dell'utente.

Una volta preparati i template PDF e aggiunto un riferimento alla libreria iTextSharp, il codice necessario alla compilazione dinamica è molto semplice:

   1: Imports System
   2: Imports System.IO
   3: Imports iTextSharp.text
   4: Imports iTextSharp.text.pdf
   5: ...
   6: ...
   7: ...
   8: Private Sub Stampa()
   9:    Dim memStream As New MemoryStream
  10:    Dim pdfTemplate As String = GlobalVars.TemplatesPath & "template.pdf"
  11:    Dim pdfReader As New PdfReader(pdfTemplate)
  12:    Dim pdfStamper As New PdfStamper(pdfReader, memStream)
  13:    pdfStamper.Writer.CloseStream = False
  14:    Dim pdfFormFields As AcroFields = pdfStamper.AcroFields
  15:    ' Setto i field che voglio valorizzare sul documento PDF
  16:    ' Checkbox
  17:    pdfFormFields.SetField("Check1", "1")
  18:    pdfFormFields.SetField("Check2", "0")
  19:    ' Campi testuali
  20:    pdfFormFields.SetField("Text1", "Nome")
  21:    pdfFormFields.SetField("Text2", "Cognome")
  22:    ' Rimuovo tutti i fields
  23:    pdfStamper.FormFlattening = True
  24:    pdfStamper.Close()
  25:  
  26:    ' Faccio direttamente la response del contenuto
  27:    Response.AppendHeader("content-disposition", "attachment; filename=modulo_utente.pdf")
  28:    Response.AppendHeader("Content-Length", memStream.Length.ToString)
  29:    Response.ContentType = "application/pdf"
  30:    Response.BinaryWrite(memStream.ToArray)
  31:    Response.Flush()
  32:    memStream.Close()
  33:  End Sub


Tutto qui. Da notare che il modulo generato non viene salvato da nessuna parte ma viene "sparato" direttamente nella response.

posted @ mercoledì 24 settembre 2008 12:30 | Feedback (6)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS