C# 如何从模板中读入表单,然后用iTextSharp填写?
我正在尝试使用iTextSharp阅读PDF模板,然后自动填写表单。该模板是使用LiveCycle Developer创建的。我不知道下面的代码有什么问题,但它并没有改变表单值 有人能告诉我我做错了什么吗?很难找到适合iText C#版本的好文档C# 如何从模板中读入表单,然后用iTextSharp填写?,c#,pdf-generation,itextsharp,livecycle,acrofields,C#,Pdf Generation,Itextsharp,Livecycle,Acrofields,我正在尝试使用iTextSharp阅读PDF模板,然后自动填写表单。该模板是使用LiveCycle Developer创建的。我不知道下面的代码有什么问题,但它并没有改变表单值 有人能告诉我我做错了什么吗?很难找到适合iText C#版本的好文档 private void button_fill_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.Show
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);
}
}
}
private void按钮\u fill\u单击(对象发送者,事件参数e)
{
OpenFileDialog ofd=新建OpenFileDialog();
if(ofd.ShowDialog()==DialogResult.OK)
{
使用(MemoryStream ms=new MemoryStream())
{
PdfReader PdfReader=新的PdfReader(ofd.FileName);
PdfStamper pdfStamp=新PdfStamper(pdfReader,毫秒);
AcroFields=pdfStamp.AcroFields;
foreach(fields.fields中的KeyValuePair f)
{
//此消息永远不会显示
MessageBox.Show(“key:+f.key”);
}
//文本字段
//这一个正在工作,并显示保存在模板中的值
MessageBox.Show(“FakeDatabase\u Table1\u Company:+fields.GetField”(“FakeDatabase\u Table1\u Company”);
//此部分返回一个假值,并且不更改字段
MessageBox.Show(“Set:”+fields.SetField(“FakeDatabase\u Table1\u Company”,“Testing”));
尝试
{
fields.SetField(“FakeDatabase_Table1_Company”、“可口可乐”);
}
catch(异常e2){MessageBox.Show(e2.Message);}
pdfReader.Close();
pdfStamp.formflatting=真;
pdfStamp.freetextflatting=true;
pdfStamp.Writer.CloseStream=false;
pdfStamp.Close();
Process.Start(ofd.FileName);
}
}
}
try/catch从不输出任何内容。。它也没有设置任何内容结果是代码很好。问题是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);
}
}
public void loadPDF(字符串路径)
{
使用(MemoryStream ms=new MemoryStream())
{
PdfReader PdfReader=新PdfReader(路径);
PdfStamper pdfStamp=新PdfStamper(pdfReader,毫秒);
AcroFields=pdfStamp.AcroFields;
列表键=新列表();
布尔空=真;
foreach(fields.fields中的变量字段)
{
空=假;
Key.Add(field.Key);
}
if(空)MessageBox.Show(“模板中没有任何表单字段”);
foreach(键中的字符串k)
{
字段。设置字段(k,“测试”);
}
pdfReader.Close();
pdfStamp.formflatting=真;
pdfStamp.freetextflatting=true;
pdfStamp.Writer.CloseStream=false;
pdfStamp.Close();
进程启动(路径);
}
}
您应该能够将此标记为答案。您介意包括相关的代码行吗?没有相关的代码行,这是使用LiveCycle保存PDF时的一个选项。自从你问起,我就加入了修改过的代码,但它也可以和旧版本一起使用。