0

iTextSharp を使用して PDF テンプレートを読み込んでから、フォームへの入力を自動化しようとしています。テンプレートは LiveCycle Developer で作成されました。次のコードの何が問題なのかわかりませんが、フォームの値は変更されていません。

誰かが私が間違っていることを教えてもらえますか? 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 は何も出力しません。また、何も設定しません。

4

1 に答える 1

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);
            }
        }
于 2012-07-07T20:09:01.227 に答える