1

iTextSharp を使用して設定する前に、フォーム フィールドから文字制限を削除しようとしています。Adobe Acrobat を使用して手動でこれを行うことはできますが、iTextSharp を使用してフォーム フィールドに動的にスタンプする多数の PDF ドキュメントを扱っています。これらの PDF ドキュメントは作成していません。データを入力するテンプレートとして使用しているだけです。すべてのフィールドの文字制限を手動でチェックする必要がないように、API を使用してフォーム フィールドの文字制限を削除する方法があるかどうか疑問に思っています。

これは SetFieldProperty メソッドで実行できると思いますが、正確な方法はわかりません。

前もって感謝します

4

2 に答える 2

3

PDF形式の内部を知っていれば簡単!以下のコードは、別の種類の PDF 注釈用に書いたコードとほぼ同じです。そのページでは、もう少し詳しく説明し、いくつかの参考資料を提供します。しかし、基本的には、各ページをループし、次に各ページの注釈をループし (特にフォーム フィールドがこのカテゴリに分類されます)、最大長が設定されているテキスト フィールドを探し、その制限を取り除くだけです。この作業はすべて読み取り専用PdfReaderオブジェクトで行われるため、完了したら、もう一度ループしてPdfWriter、なんらかの を使用して書き戻す必要があります。

以下は、iTextSharp 5.2.1 を対象とする完全に機能する C# 2010 WinForms アプリで、このすべてを示しています。詳細については、コード内のコメントを参照してください。

using System;
using System.IO;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            var inputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");
            var outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "output.pdf");

            //Setup some variables to be used later
            PdfDictionary PageDictionary = default(PdfDictionary);
            PdfArray Annots = default(PdfArray);

            //Bind a reader to our input PDF
            PdfReader R = new PdfReader(inputFile);
            //Store the number of pages
            int PageCount = R.NumberOfPages;
            //Loop through each page remember that page numbers start at 1
            for (int i = 1; i <= PageCount; i++) {
                //Get the current page
                PageDictionary = R.GetPageN(i);

                //Get all of the annotations for the current page
                Annots = PageDictionary.GetAsArray(PdfName.ANNOTS);

                //Make sure we have something
                if ((Annots == null) || (Annots.Length == 0)) { continue; }

                //Loop through each annotation
                foreach (PdfObject A in Annots.ArrayList) {
                    //Convert the itext-specific object as a generic PDF object
                    PdfDictionary AnnotationDictionary = (PdfDictionary)PdfReader.GetPdfObject(A);

                    //See if this annotation has a WIDGET which would be the UI implementation of a form field
                    if (!AnnotationDictionary.Get(PdfName.SUBTYPE).Equals(PdfName.WIDGET)) { continue; }

                    //See if this annotation is a text field (TX)
                    if (!AnnotationDictionary.Get(PdfName.FT).Equals(PdfName.TX)) { continue; }

                    //See if it has a maximum length specified (MAXLEN)
                    if (AnnotationDictionary.Contains(PdfName.MAXLEN)) {
                        //If so, remove it
                        AnnotationDictionary.Remove(PdfName.MAXLEN);
                    }
                }
            }
            //Next we create a new document add import each page from the reader above
            using (FileStream FS = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
                using (Document Doc = new Document()) {
                    using (PdfCopy writer = new PdfCopy(Doc, FS)) {
                        Doc.Open();
                        for (int i = 1; i <= R.NumberOfPages; i++) {
                            writer.AddPage(writer.GetImportedPage(R, i));
                        }
                        Doc.Close();
                    }
                }
            }
        }
    }
}
于 2012-04-19T05:29:54.780 に答える
0

クリスから提供された情報を使用して、これを理解することができました。値を設定する前に、フィールドの最大長制限を削除しようとしていました。

            //TargetObject is an AcroFields object
            AcroFields.Item item = TargetObject.GetFieldItem({FieldName});
            if (item != null)
            {
                foreach (var i in item.merged)
                {
                    if (i.GetType() == typeof(PdfDictionary))
                    {
                        PdfDictionary dictionary = (PdfDictionary)i;
                        if (dictionary.Contains(PdfName.MAXLEN))
                        {
                            dictionary.Remove(PdfName.MAXLEN);
                        }
                        break; //no need to continue once we find the dictionary and remove max length
                    }
                }
            }
于 2012-04-19T13:40:34.540 に答える