【发布时间】:2011-03-22 23:54:57
【问题描述】:
我正在尝试找出是否可以使用 iTextSharp 读取 PDF 表单数据(使用表单填写并保存的表单)。我该怎么做?
【问题讨论】:
我正在尝试找出是否可以使用 iTextSharp 读取 PDF 表单数据(使用表单填写并保存的表单)。我该怎么做?
【问题讨论】:
您必须找出 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;
也许 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 对象。
【讨论】:
这对我有用! 定义压模时注意参数! '\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()
【讨论】:
如果您使用的是 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")
【讨论】:
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
这很简单..它就像一个魅力.. :)
【讨论】: