2016-08-07 5 views
1

iTextSharpを使用すると、PDFフォームに存在するすべてのフォームフィールドを取得できます。PDFを編集するにはAdobe Acrobat Readerを使用しています。すべてのフィールドには位置属性がありますこれは、PDFフィールドがフォーム内に存在する場所を示します。PDFフォームのフィールド位置検索Itext

私の質問は、その値を読むことができますか?

例えば、PDFフォームにフォームフィールドの名前がある場合、左の0.5インチ、右の2.5インチ、上の2インチ、下の2インチのように、このフィールドの位置の値を取得できますか?

は今、私は以下のコードでフォームフィールドを取得しています:

string pdfTemplate = @"D:\abc.pdf"; 
PdfReader reader = new PdfReader(pdfTemplate); 

var fields = reader.AcroFields; 

int ffRadio = 1 << 15;  //Per spec, 16th bit is radio button 
int ffPushbutton = 1 << 16; //17th bit is push button 
int ff; 

//Loop through each field 
foreach (var f in fields.Fields) 
{ 
    String type = ""; 
    String name = f.Key.ToString(); 
    String value = fields.GetField(f.Key); 

    //Get the widgets for the field (note, this could return more than 1, this should be checked) 
    PdfDictionary w = f.Value.GetWidget(0); 

    //See if it is a button-like object (/Ft == /Btn) 
    if (!w.Contains(PdfName.FT) || !w.Get(PdfName.FT).Equals(PdfName.BTN)) 
    { 
     type = "T"; 
    } 
    else 
    { 
     //Get the optional field flags, if they don't exist then just use zero 
     ff = (w.Contains(PdfName.FF) ? w.GetAsNumber(PdfName.FF).IntValue : 0); 

     if ((ff & ffRadio) == ffRadio) 
     { 
      //Is Radio 
      type = "R"; 
     } 
     else if (((ff & ffRadio) != ffRadio) && ((ff & ffPushbutton) != ffPushbutton)) 
     { 
      //Is Checkbox 
      type = "C"; 
     } 
     else 
     { 
      //Regular button 
      type = "B"; 
     } 
    } 

    //MessageBox.Show(type + "=>" + name + "=>" + value); 
    FormFields fld = new FormFields(name, type, value, "inputfield" +form_fields.Count); 

    form_fields.Add(fld); 

    if (type.Equals("T")) 
     addContent(form_fields.Count); 
} 

答えて

2

私はFind field absolute position and dimension by acrokeyの重複としてこの質問を閉じることを約あったが、それは、Javaの答えだし、ほとんどの開発者には何の問題もないがJavaをC#に変換すると、一部の開発者はC#の回答を得るのに役立つかもしれません。

PDF内のフィールドは、ウィジェットアノテーションを使用して視覚化されます。 1つのフィールドは、それらの注釈の異なるものに対応することができる。たとえば、すべてのページで視覚化されたnameという名前のフィールドを持つことができます。この場合、このフィールドの値はすべてのページに表示されます。

ウィジェットの注釈ごとに1つずつ、複数の位置のリストを返すGetFieldPositions()メソッドがあります。

これは、一つのフィールドは、leftその後、1つのウィジェット注釈に対応righttop、およびbottomは右、あなたの左を与える場合、私は、質問iTextSharp GetFieldPositions to SetSimpleColumn

IList<AcroFields.FieldPosition> fieldPositions = fields.GetFieldPositions("fieldNameInThePDF"); 
if (fieldPositions == null || fieldPositions.Count <= 0) throw new ApplicationException("Error locating field"); 
AcroFields.FieldPosition fieldPosition = fieldPositions[0]; 
left = fieldPosition.position.Left; 
right = fieldPosition.position.Right; 
top = fieldPosition.position.Top; 
bottom = fieldPosition.position.Bottom; 

への回答からコピーされたいくつかのコードですフィールドの上下の座標。フィールドの幅は次のように計算できます。right - left;このような高さ:top - bottom。これらの値はユーザ単位で表されます。デフォルトでは、1インチに72のユーザーユニットがあります。

文書に複数のページが含まれている場合、fieldPosition.pageは、フィールドを見つけるページ番号を提供します。

http://developers.itextpdf.com/