2

Itext Library を使用して PDF ドキュメントにデジタル署名するプログラムを実行しています。

問題は、目に見える署名に設定したときの署名の場所です

署名の場所を特定するにはどうすればよいですか?

署名の長方形を作成する方法は次のとおりです。

new Rectangle(float llx, float lly, float urx, float ury); 

これで遊んでみると、署名の場所ではなく、署名のサイズに関連していることがわかりました。?

何か助けはありますか?

前もって感謝します 。

4

2 に答える 2

10

元の質問へのコメントによると、知りたいのは

ページの上、左、右などに署名を入れるようにプログラムに指示する方法。

次のようなルーチンを使用すると仮定します。

public void sign(String src, String dest, 
    Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider, 
    CryptoStandard subfilter, String reason, String location) 
    throws GeneralSecurityException, IOException, DocumentException { 
    // Creating the reader and the stamper 
    PdfReader reader = new PdfReader(src); 
    FileOutputStream os = new FileOutputStream(dest); 
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
    // Creating the appearance 
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
    appearance.setReason(reason); 
    appearance.setLocation(location); 
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
    // Creating the signature 
    ExternalDigest digest = new BouncyCastleDigest(); 
    ExternalSignature signature = 
    new PrivateKeySignature(pk, digestAlgorithm, provider); 
    MakeSignature.signDetached(appearance, digest, signature, chain, 
    null, null, null, 0, subfilter); 
} 

( Bruno Lowagie (iText Software) によるPDF ドキュメントのデジタル署名に関するホワイト ペーパーのコード サンプル 2.1 )

Rectangle行内を調整したい

    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 

あなたの要件を満たすために。

この長方形の座標は、署名するページの座標系を基準にしています。PdfReaderメソッドを使用して、この座標系を定義するデータを取得できますgetCropBox(int index)( index: ページ番号。最初のページは 1 です)。

    Rectangle cropBox = reader.getCropBox(1);

さらに、署名の幅と高さを知る必要があります。例えば

    float width = 108;
    float height = 32;

Rectangle rectangleこれらのデータを使用して、たとえば次のように計算できます。

    // Top left
    rectangle = new Rectangle(cropBox.getLeft(), cropBox.getTop(height),
                              cropBox.getLeft(width), cropBox.getTop());

    // Top right
    rectangle = new Rectangle(cropBox.getRight(width), cropBox.getTop(height),
                              cropBox.getRight(), cropBox.getTop());

    // Bottom left
    rectangle = new Rectangle(cropBox.getLeft(), cropBox.getBottom(),
                              cropBox.getLeft(width), cropBox.getBottom(height));

    // Bottom right
    rectangle = new Rectangle(cropBox.getRight(width), cropBox.getBottom(),
                              cropBox.getRight(), cropBox.getBottom(height));

それを使用して、目に見える署名の位置とサイズを定義します。

    appearance.setVisibleSignature(rectangle, 1, "sig");
于 2013-11-11T09:43:45.483 に答える
0

あなたの要件はそれほど明確ではありませんが、次のコードがうまくいくと思います....

public static void main(String[] args) throws IOException {
    String pdfFile = args[0];
    PdfReader reader = new PdfReader(pdfFile);

    AcroFields fields = reader.getAcroFields();

    for(String signame : fields.getBlankSignatureNames()) {
      List<AcroFields.FieldPosition> positions = fields.getFieldPositions(signame);
      Rectangle rect = positions.get(0).position; // In points:
      float left   = rect.getLeft();
      float bTop   = rect.getTop();
      float width  = rect.getWidth();
      float height = rect.getHeight();

      int page = positions.get(0).page;
      Rectangle pageSize = reader.getPageSize(page);
      float pageHeight = pageSize.getTop();
      float top = pageHeight - bTop;

      System.out.print(signame + "::" + page + "::" + left + "::" + top + "::" + width + "::" + height + "\n");
    }
  }
于 2013-11-11T08:24:11.117 に答える