【问题标题】:How to read PDF form data using iTextSharp?如何使用 iTextSharp 读取 PDF 表单数据?
【发布时间】:2011-03-22 23:54:57
【问题描述】:

我正在尝试找出是否可以使用 iTextSharp 读取 PDF 表单数据(使用表单填写并保存的表单)。我该怎么做?

【问题讨论】:

    标签: c# forms pdf itext


    【解决方案1】:

    您必须找出 PDF 表单中的字段名称。获取字段,然后读取它们的值。

    string pdfTemplate = "my.pdf";
    PdfReader pdfReader = new PdfReader(pdfTemplate);
    AcroFields fields = pdfReader.AcroFields.Fields;
    string val = fields.GetField("fieldname");
    

    显然,在上面的代码中,字段名称是 PDF 表单字段的名称,GetField 方法返回该值的字符串表示形式。 Here 是一篇包含您可能使用的示例代码的文章。它展示了如何使用 iTextSharp 读取和写入表单字段。

    【讨论】:

    • 这就像一个魅力......我想知道为什么我没有研究这个功能......当我尝试其他所有功能时:)。非常感谢……你拯救了我的周末。
    • 公共服务公告:以下代码无法得到您想要的:pdfReader.AcroFields.Fields["fieldName"].Value。我浪费了几个小时才找到这篇文章。
    • 嗨。我认为您的示例的第三行有错误。正确的形式是:AcroFields fields = pdfReader.AcroFields;
    【解决方案2】:

    也许 iTextSharp 库最近发生了变化,但我无法获得公认的工作答案。这是我的解决方案:

    var pdf_filename = "pdf2read.pdf";
    using (var reader = new PdfReader(pdf_filename))
    {
        var fields = reader.AcroFields.Fields;
    
        foreach (var key in fields.Keys)
        {
            var value = reader.AcroFields.GetField(key);
            Console.WriteLine(key + " : " + value);
        }
    }
    

    一个非常细微的区别,因为 reader.AcroFields.Fields 返回一个 IDictionary 而不是一个 AcroFields 对象。

    【讨论】:

    • 这行得通,但速度很慢,需要一分钟才能读取约 3000 个字段。有人知道枚举这些的更快方法吗?我尝试并行执行,但似乎没有帮助。
    【解决方案3】:

    这对我有用! 定义压模时注意参数! '\0', 真

                string TempFilename = Path.GetTempFileName();
    
                PdfReader pdfReader = new PdfReader(FileName);
                //PdfStamper stamper = new PdfStamper(pdfReader, new FileStream(TempFilename, FileMode.Create));
                PdfStamper stamper = new PdfStamper(pdfReader, new FileStream(TempFilename, FileMode.Create), '\0', true);
    
                AcroFields fields = stamper.AcroFields;
                AcroFields pdfFormFields = pdfReader.AcroFields;
    
                foreach (KeyValuePair<string, AcroFields.Item> kvp in fields.Fields)
                {
                    string FieldValue = GetXMLNode(XMLFile, kvp.Key);
                    if (FieldValue != "")
                    {
                        fields.SetField(kvp.Key, FieldValue);
                    }
                }
    
                stamper.FormFlattening = false;
                stamper.Close();
                pdfReader.Close()
    

    【讨论】:

    • OP 只想读取 PDF 表单数据(并得到了很好的答案)。您的代码显示了如何更改 PDF 表单数据。
    • 对不起,实际上将答案发布到错误的线程中...这意味着解释如何将值推送到字段中并在再次打开文件时保留表单编辑...
    【解决方案4】:

    如果您使用的是 Powershell,则字段的发现代码为:

        Add-Type -Path C:\Users\Micah\Desktop\PDF_Test\itextsharp.dll
        $MyPDF = "C:\Users\Micah\Desktop\PDF_Test\something_important.pdf"
        $PDFDoc = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $MyPDF
        $PDFDoc.AcroFields.Fields
    

    该代码将为您提供 PDF 文档中所有字段的名称,“something_important.pdf”。

    这是您在知道字段名称后访问每个字段的方式:

        $PDFDoc.AcroFields.GetField("Name of the field here")
    

    【讨论】:

      【解决方案5】:

      PDF 名称是“report.pdf”..

      要读入TextBox1的数据字段是PDF中的“TextField25”..

              Dim pdf As String = "report.pdf"
              Dim reader As New PdfReader(pdf)
              Dim fields As AcroFields = reader.AcroFields
              TextBox1.Text = fields.GetField("TextField25")
      

      重要提示仅当 PDF 在创建时未展平(意味着字段应该是可编辑的)时才可以使用使用 iTextSharp..

             pdfStamper.FormFlattening = False
      

      这很简单..它就像一个魅力.. :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        相关资源
        最近更新 更多