2017-07-12 21 views
1

iTextを使用して、PDF内の署名プレースホルダ内にテキストを配置しています。私たちは、AppearenceiText - PDFアプリケーション問題

PdfStamper stp = PdfStamper.createSignature(inputReader, os, '\0', tempFile2, true); 
sap = stp.getSignatureAppearance(); 
sap.setVisibleSignature(placeholder);   
sap.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION); 
sap.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED); 

Calendar cal = Calendar.getInstance(); 
sap.setSignDate(cal); 
sap.setLayer2Text(text+"\n"+cal.getTime().toString()); 
sap.setReason(text+"\n"+cal.getTime().toString());  ` 

すべてが正常に動作します署名を定義するには、このようなコードスニペットを使用しますが、私たちが期待するよう署名テキストは、すべての署名のプレースホルダエリアを満たしていないが、塗りつぶされた領域は、高さを持っているようですそれは利用可能なスペースのおよそ70%です。

結果として、特に署名テキストの長さが非常に長い場合、署名テキストがプレースホルダに収まらず、テキストが縞模様になります。充填された署名の

例:

Example of filled Signature

IはPdfSignatureAppearenceクラスに見て、私は、この現象の原因であると呼び出されgetApperance()メソッドでこのコードスニペットを見つけたとき

sap.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION); 

が呼び出されている

 else { 
      dataRect = new Rectangle(
        MARGIN, 
        MARGIN, 
        rect.getWidth() - MARGIN, 
        rect.getHeight() * (1 - TOP_SECTION) - MARGIN); 
     } 

私は、テキストが適切な余白を付けて使用可能なプレースホルダーの高さをすべて使用できると考えているので、その理由がありません。

この動作を回避する方法はありますか?

私はiText 5.4.2を使用していますが、新しいバージョンにも同じコードスニペットが含まれているため、動作は同じになると思います。

+0

いつでも自分の外観を完全に構築できます。 – mkl

+0

完全に構成された外観の例を教えてください。私はいくつかのテストを行いましたが、問題はLayer2Text属性を設定することで、私が投稿したコードスニペットが実行されており、その結果、常に上端に余白があることです。私は、署名にテキストだけを置くことでこのスペースを避けることができると信じていますが、PDFSignatureAppearence.javaのTOP_SECTION属性は最終的なものであり、変更することができないので、私たちが望むようにそれをカスタマイズすることは不可能です。 –

+0

これはバグだと思います。 TOP_SECTIONはacro6layersレンダリングと接続されており、コードはacro6layerフラグの値を考慮しません。 –

答えて

0

@JJ。既にコメント、

TOP_SECTIONは[純粋DESCRIPTIONモードでdatarectを決定] acro6layersレンダリングおよびコードが接続されているアカウントにacro6layerフラグの値をとりません。

これをiText 5コード自体で修正したいのでない限り、自分の説明で全体の署名スペースを使用する最も簡単な方法は、レイヤー2の外観を構築することです。

PdfSignatureAppearance.setVisibleSignatureを呼び出した後は、PdfSignatureAppearance.getLayer(2)からPdfTemplateを取得し、必要に応じて入力するだけで済みます。 PdfSignatureAppearanceは、すでにレイヤー2を取得しており、それ以上レイヤー2を変更していないことを記憶しています。

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

PdfTemplate layer2 = appearance.getLayer(2); 
String text = "We're using iText to put a text inside a signature placeholder in a PDF. " 
     + "We use a code snippet similar to this to define the Signature Appearence.\n" 
     + "Everything works fine, but the signature text does not fill all the signature " 
     + "placeholder area as expected by us, but the area filled seems to have an height " 
     + "that is approximately the 70% of the available space.\n" 
     + "As a result, sometimes especially if the length of the signature text is quite " 
     + "big, the signature text does not fit in the placeholder and the text is striped " 
     + "away."; 
Font font = new Font(); 
float size = font.getSize(); 
final float MARGIN = 2; 
Rectangle dataRect = new Rectangle(
     MARGIN, 
     MARGIN, 
     appearance.getRect().getWidth() - MARGIN, 
     appearance.getRect().getHeight() - MARGIN); 
if (size <= 0) { 
    Rectangle sr = new Rectangle(dataRect.getWidth(), dataRect.getHeight()); 
    size = ColumnText.fitText(font, text, sr, 12, appearance.getRunDirection()); 
} 
ColumnText ct = new ColumnText(layer2); 
ct.setRunDirection(appearance.getRunDirection()); 
ct.setSimpleColumn(new Phrase(text, font), dataRect.getLeft(), dataRect.getBottom(), dataRect.getRight(), dataRect.getTop(), size, Element.ALIGN_LEFT); 
ct.go(); 

CreateSignature.java試験signWithCustomLayer2

は場合について手で我々は、本質的に単にdatarectを決定訂正符号、純粋DESCRIPTIONモードで層2を生成するためPdfSignatureAppearance.getAppearanceコードをコピー(説明テキストとして、私は質問の本文からいくつかの段落を使用した。)

結果:

Screenshot

上記のコードでMARGIN値を適合させることにより、一方が一層使用されていることができます。テキストが境界線に触れる結果になる可能性があるので、それは本当に美しくないかもしれません。余談として


:署名テキストの長さが非常に大きい場合

は、署名テキストがプレースホルダに収まらないとテキストが離れてストライピングされます。あなたは非正の値と上記size変数を初期化した場合

if (size <= 0)ブロック内のコードは、テキストのすべてが署名長方形に収まることを可能にするフォントサイズを計算します。上記のコードでは、new Font()は、UNDEFINEDというサイズのフォントを返します。このフォントは定数-1です。

+0

助けてくれてありがとう、私たちは署名コードにこの提案を実装するつもりです。 –