2013-03-26 15 views
5

Sto utilizzando iTextSharp per compilare un modello PDF. I dati che sto usando sono conservati in un database ed è formattato HTML. Il mio problema è che quando carico il AcroField con questo testo ottengo che esegua le interruzioni di riga, ma non lo in grassettoin corsivo. Ho già tentato di utilizzare , ma tutti gli esempi online mostrano che viene utilizzato per convertire HTML in un PDF ma sto cercando di impostare un AcroField in un modello PDF. Qualsiasi aiuto sarebbe apprezzato.Fill acrofield del modello PDF con testo formattato HTML utilizzando iTextSharp

+0

vedere questo post su come utilizzare Text Rich Fields http://stackoverflow.com/a/4412527/231316 –

risposta

9

Dopo aver trascorso giorni guardando attraverso il forum e il codice sorgente iTextsharp ho trovato una soluzione. Invece di riempire l'Acrofield con il testo formattato in HTML, ho usato un ColumnText. Analizzo il testo html e carica gli IElement in un paragrafo. Quindi aggiungi il paragrafo a ColumnText. Quindi ho sovrapposto il ColumnText sopra a dove dovrebbe essere l'Acrofield, usando le coordinate del campo.

public void AddHTMLToContent(String htmlText,PdfContentByte contentBtye,IList<AcroFields.FieldPosition> pos) 
    { 
     Paragraph par = new Paragraph(); 
     ColumnText c1 = new ColumnText(contentBtye); 
     try 
     { 
      List<IElement> elements = HTMLWorker.ParseToList(new StringReader(htmlText),null); 
      foreach (IElement element in elements) 
      { 
       par.Add(element); 
      } 

      c1.AddElement(par); 
      c1.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top); 
      c1.Go(); //very important!!! 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 

Questo è un esempio di chiamata a questa funzione.

string htmlText ="<b>Hello</b><br /><i>World</i>"; 
IList<AcroFields.FieldPosition> pos = form.GetFieldPositions("Field1"); 
//Field1 is the name of the field in the PDF Template you are trying to fill/overlay 
AddHTMLToContent(htmlText, stamp.GetOverContent(pos[0].page), pos); 
//stamp is the PdfStamper in this example 

Una cosa che ho incontrato mentre facevo questo è il fatto che il mio Acrofield aveva una dimensione di carattere predefinita. Poiché queste funzioni impostano ColumnText sulla parte superiore del campo, qualsiasi modifica del carattere dovrà essere eseguita nella funzione. Ecco un esempio di modifica della dimensione del carattere:

public void AddHTMLToContent(String htmlText,PdfContentByte contentBtye,IList<AcroFields.FieldPosition> pos) 
    { 
     Paragraph par = new Paragraph(); 
     ColumnText c1 = new ColumnText(contentBtye); 
     try 
     { 
      List<IElement> elements = HTMLWorker.ParseToList(new StringReader(htmlText),null); 
      foreach (IElement element in elements) 
      { 
       foreach (Chunk chunk in element.Chunks) 
       { 
        chunk.Font.Size = 14; 
       } 
      } 
      par.Add(elements[0]); 
      c1.AddElement(par); 
      c1.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top); 
      c1.Go();//very important!!! 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 

Spero che questo risparmi tempo e energia in futuro.

+0

Sei sicuro aiutato ... questo approccio un po 'contorto funzionato. Grazie per aver pubblicato i tuoi risultati! È un peccato che "fields.SetFieldRichValue" non funzioni. Sto usando iTextSharp 5.4.2 in questo momento. –

0

Quindi, ho dovuto modificare questo codice un po 'negli ultimi mesi, e ho trovato un modo migliore/meno rotondo per farlo.

public void Final(string text,string fieldName,string filename) 
    { 
     iTextSharp.text.pdf.PdfReader reader = null; 
     iTextSharp.text.pdf.PdfStamper stamp = null; 

     reader = new PdfReader(file path to template); 
     stamp = new PdfStamper(reader, new FileStream(path to new file, FileMode.CreateNew)); 

     AcroFields form = stamp.AcroFields; 

     //get the position of the field 
     IList<AcroFields.FieldPosition> pos = form.GetFieldPositions(fieldName); 
     //tell itextSharp to overlay this content 
     PdfContentByte contentBtye = stamp.GetOverContent(pos[0].page); 

     //create a new paragraph 
     Paragraph par = new Paragraph(); 
     //parse html 
     List<IElement> elements = HTMLWorker.ParseToList(new StringReader(text), null); 
     for (int k = 0; k < elements.Count; k++) 
     { 
      par.Add((IElement)elements[k]); 
     } 
     //create a ColumnText to hold the paragraph and set position to the position of     the field 
     ColumnText ct = new ColumnText(contentBtye); 
     ct.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top); 
     ct.AddElement(par); 
     ct.Go(); 
     stamp.Close(); 
     reader.Close(); 

    } 
Problemi correlati