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();
}
}
}
}
}
}