2

BIRTレポート ライブラリを使用して pdf ファイルを作成しています。後で、これらのファイルにデジタル署名する必要があります。iTextを使用してドキュメントにデジタル署名しています。

私が直面している問題は、さまざまなレポートのさまざまな場所に署名を配置する必要があることです。文書にデジタル署名するためのコードは既にありますが、今では常にすべてのレポートの最後のページの下部に署名を配置しています。

最終的には、各レポートに、署名を配置する必要がある場所を示す必要があります。次に、iText を使用して場所を読み取り、その場所に署名を配置する必要があります。

BIRTとiTextを使用してこれを達成することは可能ですか

ありがとう

4

2 に答える 2

3

少しごまかしたい場合は、リンクを使用できます... BIRT は、私が今彼らのドキュメントに少し飛び込んでいるとサポートしています。

リンクは注釈です。残念ながら、iText は高レベルでの注釈の検査をサポートしておらず、生成のみをサポートしているため、低レベルのオブジェクト呼び出しを使用する必要があります。

それを抽出するコードは次のようになります。

// getPageN is looking for a page number, not a page index
PdfDictionary lastPageDict = myReader.getPageN(myReader.getNumberOfPages());

PdfArray annotations = lastPageDict.getAsArray( PdfName.ANNOTS );
PdfArray linkRect = null;
if (annotations != null) {
  int numAnnots = annotations.size();
  for (int i = 0; i < numAnnots; ++i) {
    PdfDictionary annotDict = annotations.getAsDict( i );
    if (annotDict == null) 
      continue; // it'll never happen, unless you're dealing with a Really Messed Up PDF.

    if (PdfName.LINK.equals( annotDict.getAsName( PdfName.SUBTYPE ) )) {
      // if this isn't the only link on the last page, you'll have to check the URL, which
      // is a tad more work.
      linkRect = annotDict.getAsArray( PdfName.RECT );

      // a little sanity check here wouldn't hurt, but I have yet to come across a PDF
      // that was THAT screwed up, and I've seen some Really Messed Up PDFs over the years.

      // and kill the link, it's just there for a placeholder anyway.
      // iText doesn't maintain any extra info on links, so no need for other calls.
      annotations.remove( i ); 
      break;
    }
  }
}

if (linkRect != null) {
  // linkRect is an array, thusly: [ llx, lly, urx, ury ].
  // you could use floats instead, but I wouldn't go with integers.  
  double llx = linkRect.getAsNumber( 0 ).getDoubleValue(); 
  double lly = linkRect.getAsNumber( 1 ).getDoubleValue();
  double urx = linkRect.getAsNumber( 2 ).getDoubleValue();
  double ury = linkRect.getAsNumber( 3 ).getDoubleValue();

  // make your signature
  magic();
}

BIRT がその視覚的表現のためにリンクの下のページ コンテンツに何らかのテキストを生成する場合、それは小さな問題にすぎません。あなたの署名はそれを完全にカバーする必要があります。

そもそもBIRTから直接署名を生成できれば間違いなく良いのですが、彼らのドキュメントを少し調べただけでは、iText自体の上に座っていたにもかかわらず、彼らのPDFカスタマイズ機能に自信が持てませんでした. . たまたま PDF を作成できるレポート ジェネレーターですが、期待しすぎてはいけません。`

編集: 特定の URL を探す必要がある場合は、PDF リファレンスのセクション「12.5.6.5 リンク注釈」を参照して ください。 dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

于 2010-10-19T23:31:29.697 に答える
1

BIRT については何も知らず、iText についても少ししか知りません。しかし、これはうまくいくかもしれません...

BIRT は、指定されたフィールド名を持つ通常のフォーム フィールドとして署名ボックスのアウトラインを生成できますか? もしそうなら、あなたはできるはずです:

  1. getField; を使用して、iText の AcroFields ハッシュマップでそのフィールドを名前で検索します。
  2. pdf スタンパーを使用して新しい署名を作成し、古いフィールド オブジェクトの値に基づいてそのジオメトリを設定します。と
  3. removeField を使用して古いフィールドを削除します。
于 2010-04-15T10:10:01.180 に答える