2016-09-05 45 views
1

私はC#とPDFSharpライブラリを使ってプログラムを開発しています。 私は現在、PDF文書内の特定のAcroFieldのXとY座標を取得するには、次のコードを使用しています:PDF文書に存在する同じ名前を持つ唯一の1フィールドがある場合"/ Rect"のないPdfSharpでAcroFieldの位置を取得する方法はありますか?

PdfTextField imageField = (PdfTextField)inForm.Fields[elementName]; 
PdfRectangle rect = imageField.Elements.GetRectangle(PdfAnnotation.Keys.Rect); 

これが正常に動作します。しかし、 "FirstName"という名前の2つのフィールドがある場合、それらが別々のページにあっても "/ Rect"と "/ P"フラグは削除されているようですので、これらを使用して関連するページや位置を見つけることはできませんその分野に

PDF内のフィールドの位置を取得する方法はありますか、「/ Rect」と「/ P」フラグをアクティブにする方法はありますか?

おかげで、RBrNx

答えて

2

MihaiがPdfSharpを使用してPDFをリバースエンジニアリングして得たものに合ったものを投稿しました。同じドキュメントに複数のフィールドがある場合、それらは親コンテナの下にネストされ、AcroForm.Fieldsアクセサを使用するときにPdfSharpが与えるこの親コンテナへの参照です。各フィールドのPageとRectangle要素を取得するには、そのコンテナの子を参照する必要があります。

あなたが探している値を取得するには、このような何かをしたいと思う:

PdfTextField imageField = (PdfTextField)inForm.Fields[elementName]; 
    var fieldRectangles = new List<PdfRectangle>(); 

    if(imageField.HasKids) 
    { 
     PdfArray kids = (PdfArray) Elements[Keys.Kids]; 
     foreach(var kid in kids) 
     { 
     var kidValues = ((PdfReference) kid).Value as PdfDictionary; 
     var rectangle = kidValues.Elements.GetRectangle(PdfAnnotation.Keys.Rect); 
     fieldRectangles.Add(rectangle);   
     } 
    } 

ページ参照要素を(「/ P」タグ)も、これらの「キッド」の要素から提供されています。

+0

これは私が使い終わったコードとほぼ同じです! 1.50.4000 Beta3 Build of PdfSharpを除いて、私は少し短くしました。 'if(imageField.HasKids) { for(int i = 0; i

1

私はPDFSharpのAPIに精通していないんだけど、これはそれがPDFでどのように動作するかです:
- フォームフィールドには、ドキュメントのスコープではなくページスコープを持っています。
- 同じ名前の2つ以上のフィールドは、実際には2つ以上のウィジェット(ウィジェットアノテーション、フィールドの視覚的表現)を持つ単一のフィールドです。/Rectおよび/ Pエントリは、ウィジェットレベルで格納されます。フィールドに1つのウィジェットがある場合、ウィジェットはフィールドとマージされるので、/ Rectおよび/ Pエントリはフィールドの一部であるように見えます。

シナリオでは、配列である/ Kidsキーを検索する必要があります。/Kidsが存在しなくなった最後のレベルまで/ Kids配列(子供は自分の子供などを持つことができます)をドリルダウンします。このレベルに/ Rectと/ Pキーがあります。
各ウィジェットは、異なる位置の異なるページに表示されるため、独自の/ Rectおよび/ Pキーを持つことができます。

関連する問題