2013-03-26 85 views
5

我使用iTextSharp填寫PDF模板。我正在使用的數據保存在數據庫中,格式爲HTML。我的問題是,當我加載AcroField與這個文本我得到它做的換行符,但沒有大膽也不斜體。我已經嘗試使用HtmlWorker,但所有在線示例都顯示它用於將HTML轉換爲PDF,但我試圖在PDF模板中設置AcroField。任何幫助,將不勝感激。使用iTextSharp填充HTML格式文本的PDF模板acofield

+0

看到這個職位有關使用富文本字段http://stackoverflow.com/a/4412527/231316 – 2013-03-26 19:49:00

回答

9

花了幾天時間瀏覽論壇和iTextsharp源代碼後,我找到了一個解決方案。我沒有用HTML格式的文本填充Acofield,而是使用了ColumnText。我解析html文本並將IElement加載到段落中。然後將該段落添加到ColumnText。然後,我使用字段的座標將ColumnText覆蓋在Acofield的頂部。

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; 
     } 
    } 

這是一個調用這個函數的例子。

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 

我這樣做時遇到的一件事是,我的Acofield確實有預定義的字體大小。由於該函數將ColumnText設置在字段頂部,因此任何字體更改都必須在函數中完成。以下是更改字體大小的示例:

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; 
     } 
    } 

我希望這可以爲將來節省一些時間和精力。

+0

你一定幫...這有點令人費解的方式工作。感謝您發佈您的發現! 「fields.SetFieldRichValue」不起作用是一種遺憾。我現在正在使用iTextSharp 5.4.2。 – 2013-07-06 00:07:48

0

所以,在過去的幾個月裏,我不得不調整一下這段代碼,並且我找到了一個更好/更少的方法來做到這一點。

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(); 

    } 
相關問題