2013-03-26 14 views
5

Używam szablonu iTextSharp do wypełnienia szablonu PDF. Dane, których używam, są przechowywane w bazie danych i są sformatowane w formacie HTML. Mój problem polega na tym, że po załadowaniu AcroField z tym tekstem uzyskuję go, aby zrobić podziały wierszy, ale nie pogrubiono ani nie pochylono. Próbowałem już użyć HtmlWorker, ale wszystkie przykłady online pokazują, że jest używany do konwersji HTML na PDF, ale próbuję ustawić AcroField w szablonie PDF. Każda pomoc będzie doceniona.Wypełnienie szablonu formularza PDF za pomocą tekstu w formacie iTekstSharp

+0

Zobacz ten post na temat korzystania Rich Text Fields http://stackoverflow.com/a/4412527/231316 –

Odpowiedz

9

Po spędzeniu kilku dni na przeglądaniu forów i kodu źródłowego iTextsharp znalazłem rozwiązanie. Zamiast wypełniać Acrofield tekstem w formacie HTML, użyłem kolumny ColumnText. Analizuję tekst HTML i ładuję IElements do akapitu. Następnie dodaj akapit do ColumnText. Następnie nałożyłem kolumnę ColumnText na szczyt miejsca, w którym powinien być Acrofield, używając współrzędnych pola.

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

Oto przykład połączenia z tą funkcją.

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 

Jedną z rzeczy, które napotkaliśmy podczas wykonywania tego jest fakt, że mój Acrofield miał predefiniowany rozmiar czcionki. Ponieważ funkcja ta ustawia kolumnę ColumnText na górze pola, wszelkie zmiany czcionki będą musiały zostać wykonane w funkcji. Oto przykład zmiany rozmiaru czcionki:

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

Mam nadzieję, że zaoszczędzimy komuś trochę czasu i energii w przyszłości.

+0

... Na pewno pomogło to nieco zawiłe podejście pracował. Dziękujemy za przesłanie wyników! Szkoda, że ​​'fields.SetFieldRichValue' nie działa. Używam iTextSharp 5.4.2 już teraz. –

0

Tak, musiałem poprawić ten kod trochę w ciągu ostatnich kilku miesięcy, a ja znalazłem lepsze/mniej okrągłe o tym, jak to zrobić.

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

    } 
Powiązane problemy