2017-08-17 11 views
0

PDFフィールドの絶対位置を取得しようとしていますが、私のコードは次のとおりです。PDFフォームのフィールドの絶対位置の計算

.....

float[] _advisor = reader.getAcroFields().getFieldPositions("_advisor"); 
float[] _test = reader.getAcroFields().getFieldPositions("_test"); 
float[] _owner = reader.getAcroFields().getFieldPositions("_owner"); 

すべてのフィールドが縦に同じ_left位置を揃えています。問題は、最初の2つのフィールドがPDFの同じページにあり、xLeftの値は同じですが、最後のフィールド_ownerは2ページ目にあり、xLeftの値は大きく外れています。別のページのページのオフセットや何かを差し引く必要がありますか?

+0

* IText、さらに あなたが使用している古いバージョンは、そのままpdfの値を返します。おそらく、あなたの予想される座標系は間違っています。 – mkl

答えて

0

考慮すべきいくつかの点:

  • デフォルトはiTextので使用される座標は、ページの左下隅にその起源を持っています。
  • iTextでは座標をピクセルではなくポイントで返します。
  • Adob​​e Readerを使用してルーラーとグリッドオーバーレイを表示することができます。これにより、各コンポーネントの位置を簡単に測定できます。これらの測定値が、iTextが提供する値と同じであるかどうかを確認してください。

iTextがあなたに間違った値を与えていると思われる場合は、私たちにあなたのpdfへのアクセスを提供してください。

0

メディボックスの位置が0,0と異なる可能性があります。私はそれを必要としましたので、私はこのような値を「正規化」しました:

PdfDictionary pageDict = reader.getPageN(pageNumber); 
PdfArray mediaBox = (PdfArray)PdfReader.getPdfObject(pageDict.get(PdfName.MEDIABOX)); 

//check whether the mediabox has a different positioning than 0,0 
if(((PdfNumber)mediaBox.getPdfObject(0)).floatValue()!=0){ 
    //normalize X coordinates 
    lowerLeftX = lowerLeftX-(PdfNumber)mediaBox.getPdfObject(0)).floatValue(); 
    upperRightX = upperRightX-((PdfNumber)mediaBox.getPdfObject(0)).floatValue(); 
} 
if(((PdfNumber)mediaBox.getPdfObject(1)).floatValue()!=0){ 
//normalize Y coordinates 
lowerLeftY = lowerLeftY-((PdfNumber)mediaBox.getPdfObject(1)).floatValue(); 
upperRightY = upperRightY-((PdfNumber)mediaBox.getPdfObject(1)).floatValue(); 
}