ITextSharpを使用してPDFフォームデータ(フォームに入力され、フォームとともに保存されたフォーム)を読み取ることができるかどうかを調べようとしています。どうすればよいですか?
PDFフォームでフィールド名を確認する必要があります。フィールドを取得して、その値を読み取ります。
string pdfTemplate = "my.pdf";
PdfReader pdfReader = new PdfReader(pdfTemplate);
AcroFields fields = pdfReader.AcroFields.Fields;
string val = fields.GetField("fieldname");
明らかに上記のコードでは、フィールド名はPDFフォームフィールドの名前であり、GetFieldメソッドはその値の文字列表現を返します。 ここ は例を含む記事ですおそらく使用できるコード。iTextSharpを使用してフォームフィールドの読み取りと書き込みの両方を行う方法を示しています。
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がAcroFieldsオブジェクトだけでなくIDictionaryを返すため、非常に微妙な違いがあります。
これは私のために働いた!スタンパーを定義するときは、パラメーターに注意してください。 '\ 0'、true
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 Document、 "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
これはとても簡単です..そしてそれは魅力のように機能します.. :)