C# 将SQL Server表行绑定到可编辑PDF表单C
我有一个可编辑的pdf表格。我创建了一个与PDF中列相同的表。我的要求是将这些列dataSingle行绑定到现有PDF的文本框 在这里,通过我的一段代码,我可以获得PDF表单字段的id,并将这些字段与数据绑定C# 将SQL Server表行绑定到可编辑PDF表单C,c#,.net,pdf,itext,C#,.net,Pdf,Itext,我有一个可编辑的pdf表格。我创建了一个与PDF中列相同的表。我的要求是将这些列dataSingle行绑定到现有PDF的文本框 在这里,通过我的一段代码,我可以获得PDF表单字段的id,并将这些字段与数据绑定 { MemoryStream ms = new MemoryStream(); PdfReader reader = new PdfReader(Request.MapPath("~/test.pdf")); PdfStamper formFiller = new PdfStamper(r
{
MemoryStream ms = new MemoryStream();
PdfReader reader = new PdfReader(Request.MapPath("~/test.pdf"));
PdfStamper formFiller = new PdfStamper(reader, ms);
AcroFields formFields = formFiller.AcroFields;
ArrayList aa = new ArrayList();
foreach (DictionaryEntry de in reader.AcroFields.Fields)
{
aa.Add(de.Key.ToString());
}
SqlCommand cmd = new SqlCommand("select Gname ,addr1 ,addr2,hno,gender ,postcode ,
Fname,color,driving ,country ,city,height from example where Gname='pramod'", conn);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
conn.Open();
int counter = 0;
int colcount = ds.Tables[0].Columns.Count;
if (!object.Equals(ds.Tables[0], null))
{
if (ds.Tables[0].Rows.Count > 0)
{
for (int j = 0; j < colcount; j++)
{
foreach (var item in aa)
{
if (item.ToString() == ds.Tables[0].Columns[j].ToString())
{
formFields.SetField(item.ToString(), ds.Tables[0].Rows[0][j].ToString());
var it = item.ToString();
counter++;
if (counter > 0)
{
aa.Remove(it);
break;
}
}
}
}
}
formFiller.Close();
reader.Close();
Response.ContentType = "application/pdf";
Response.WriteFile("Default4.aspx");
Response.BinaryWrite(ms.ToArray());
但问题是,我随机获取这些ID,即pdf中的顺序不同。所以我不能继续使用基于索引的循环绑定,因为ID不是按顺序出现的。而且我也不知道哪个Id与哪个文本/复选框对应
对于下图中的ex,第一个AADHAR编号id来自pdf的第10页。而且,你可以看到一些不规则的名字,比如checkbox1,2,我无法确定它是哪个文本框id
永远不要依赖表单中字段的顺序。这是一种糟糕的做法,因为任何人都可以随时更改模板中字段的顺序,然后您将不得不更改代码,因为更改了顺序。这是在问问题 根据您编写的内容,您应该为PDF中的字段指定与数据库表中字段相同的名称,我假设您已经这样做了。如果名称相同,则可以执行以下操作:
ds.Tables[0].Rows[0][item.ToString()].ToString()
请注意,您的循环很笨拙。你在浪费CPU!你为什么不这样做呢:
if (ds.Tables[0].Rows.Count > 0)
{
foreach (var item in aa)
{
var it = item.ToString();
formFields.SetField(it, ds.Tables[0].Rows[0][it].ToString());
}
}
免责声明:我不是C开发人员,我只是在谷歌上搜索,直到找到答案。我没有测试答案,但我希望你能理解
我很难阅读和理解你的代码,因为你把它弄得太复杂了。我想这就是为什么没有人回答你的问题。有一种说法,我建议你在将来这样做-
你还说你看到了一些不规则的名字,比如checkbox1,2,我不知道它是哪个文本框id。如果您不共享PDF,我们无法在这个问题上帮助您,但鉴于名称checkbox1,checkbox2,。。。我假设这些不是文本框,而是复选框。请不要混淆文本框可以有任何字符串值,复选框可以有两个可能值中的一个,其中一个是关闭的。您不应该依赖表单中字段的顺序。这是一种糟糕的做法,因为任何人都可以随时更改模板中字段的顺序,然后您将不得不更改代码,因为更改了顺序。这是在问问题 根据您编写的内容,您应该为PDF中的字段指定与数据库表中字段相同的名称,我假设您已经这样做了。如果名称相同,则可以执行以下操作:
ds.Tables[0].Rows[0][item.ToString()].ToString()
请注意,您的循环很笨拙。你在浪费CPU!你为什么不这样做呢:
if (ds.Tables[0].Rows.Count > 0)
{
foreach (var item in aa)
{
var it = item.ToString();
formFields.SetField(it, ds.Tables[0].Rows[0][it].ToString());
}
}
免责声明:我不是C开发人员,我只是在谷歌上搜索,直到找到答案。我没有测试答案,但我希望你能理解
我很难阅读和理解你的代码,因为你把它弄得太复杂了。我想这就是为什么没有人回答你的问题。有一种说法,我建议你在将来这样做-
你还说你看到了一些不规则的名字,比如checkbox1,2,我不知道它是哪个文本框id。如果您不共享PDF,我们无法在这个问题上帮助您,但鉴于名称checkbox1,checkbox2,。。。我假设这些不是文本框,而是复选框。请不要混淆文本框可以有任何字符串值,复选框可以有两个可能值中的一个,其中一个是关闭的