web-dev-qa-db-ja.com

iTextSharpを使用してPDFフォームデータを読み取る方法は?

ITextSharpを使用してPDFフォームデータ(フォームに入力され、フォームとともに保存されたフォーム)を読み取ることができるかどうかを調べようとしています。どうすればよいですか?

17
Bhuvan

PDFフォームでフィールド名を確認する必要があります。フィールドを取得して、その値を読み取ります。

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

明らかに上記のコードでは、フィールド名はPDFフォームフィールドの名前であり、GetFieldメソッドはその値の文字列表現を返します。 ここ は例を含む記事ですおそらく使用できるコード。iTextSharpを使用してフォームフィールドの読み取りと書き込みの両方を行う方法を示しています。

20
cecilphillip

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を返すため、非常に微妙な違いがあります。

11
Adam Jones

これは私のために働いた!スタンパーを定義するときは、パラメーターに注意してください。 '\ 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()
3
Serg

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

これはとても簡単です..そしてそれは魅力のように機能します.. :)

2
EIV