将SQL Server表行绑定到可编辑的PDF表单C#

时间:2018-04-10 16:40:33

标签: c# .net pdf itext

我有一个可编辑的pdf表格。我创建了一个包含与PDF相同列的表。我的要求是将这些列数据(单行)绑定到现有PDF的文本框。

在我的代码片段中,我能够获取PDF表单字段的id,并且我将这些字段与数据绑定。

{
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与哪个文本/复选框一起使用?

如下图所示,第一个 AADHAR NUMBER ID来自pdf的第10页。而且,你可以看到一些不规则的名称,如checkbox1,2,我无法弄清楚它是哪个文本框ID ..

enter image description here

1 个答案:

答案 0 :(得分:1)

您永远不应该依赖表单中字段的顺序。这是不好的做法,因为任何人都可以随时更改模板中字段的顺序,然后由于此更改的顺序,您将不得不更改代码。那是在寻找问题。

您应该为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#开发人员,我只是用Google搜索,直到找到答案。我没有测试答案,但我希望你能得到这个想法。

我很难阅读和理解你的代码,因为你的代码太复杂了。我猜这就是为什么没有人回答你的问题。有一种说法"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."我建议你将来这样做; - )

你还说你看到一些不规则的名字,比如checkbox1,2,我无法弄清楚它是哪个文本框。如果你不知道我们无法帮你解决这个问题不要共享PDF,但是给出名称​​ checkbox1 checkbox2 ,...我会假设那些不是文本框,但是它们是复选框。请不要将文本框(可以包含任何字符串值)与复选框混淆(可以有两个可能的值中的一个,其中一个是off)。