2012-07-06 23 views
0

我正在嘗試使用iTextSharp閱讀PDF模板,然後自動填寫表單。該模板是使用LiveCycle Developer創建的。我不知道下面的代碼有什麼問題,但它不會更改表單值。如何從模板中讀取表格,然後用iTextSharp填充它們?

有人能告訴我我做錯了什麼嗎?很難爲iText的C#版本找到很好的文檔。

private void button_fill_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog ofd = new OpenFileDialog(); 
    if (ofd.ShowDialog() == DialogResult.OK) 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      PdfReader pdfReader = new PdfReader(ofd.FileName); 
      PdfStamper pdfStamp = new PdfStamper(pdfReader, ms); 
      AcroFields fields = pdfStamp.AcroFields; 
      foreach (KeyValuePair<string, AcroFields.Item> f in fields.Fields) 
      { 
       // this message is never displayed 
       MessageBox.Show("key: " + f.Key); 
      } 

      //textfields 
      // this one is working, and showing the value saved in the template 
      MessageBox.Show("FakeDatabase_Table1_Company: " + fields.GetField("FakeDatabase_Table1_Company")); 
      // this part returns a false value, and not changing the field 
      MessageBox.Show("Set: " + fields.SetField("FakeDatabase_Table1_Company", "Testing")); 

      try 
      { 
       fields.SetField("FakeDatabase_Table1_Company", "Coca-Cola"); 
      } 
      catch (Exception e2) { MessageBox.Show(e2.Message); } 

      pdfReader.Close(); 
      pdfStamp.FormFlattening = true; 
      pdfStamp.FreeTextFlattening = true; 
      pdfStamp.Writer.CloseStream = false; 
      pdfStamp.Close(); 
      Process.Start(ofd.FileName); 
     } 
    } 
} 

的try/catch語句從不輸出任何東西..也沒有將它設置任何

回答

0

原來的代碼是罰款。問題是pdf是動態的。我的代碼現在幾乎可以工作,因爲我將pdf改爲靜態的。我現在可以閱讀AcroFields,這是給我的問題。它實際上並沒有用填充的值來保存表格,但這是迄今爲止我所擁有的。

public void loadPDF(String path) 
     { 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       PdfReader pdfReader = new PdfReader(path); 
       PdfStamper pdfStamp = new PdfStamper(pdfReader, ms); 
       AcroFields fields = pdfStamp.AcroFields; 
       List<String> Keys = new List<string>(); 
       Boolean empty = true; 
       foreach (var field in fields.Fields) 
       { 
        empty = false; 
        Keys.Add(field.Key); 
       } 
       if (empty) MessageBox.Show("The template does not have any form fields in it."); 
       foreach (String k in Keys) 
       { 
        fields.SetField(k, "Testing"); 
       } 

       pdfReader.Close(); 
       pdfStamp.FormFlattening = true; 
       pdfStamp.FreeTextFlattening = true; 
       pdfStamp.Writer.CloseStream = false; 
       pdfStamp.Close(); 
       Process.Start(path); 
      } 
     } 
+0

你應該能夠將其標記爲答案。你介意包括相關的代碼行嗎? – Adam 2012-07-07 20:16:03

+0

沒有相關的代碼行,這是使用LiveCycle保存PDF時的一個選項。自從您提出要求之後,我將修改後的代碼包括在內,但它也會與舊版本一起使用。 – Mike 2012-07-09 14:56:21

相關問題