2017-02-16 8 views
0

私はpdfに動的テキストを入れる必要があります。テキストを置くために使用することが許可されている境界ボックスをテキストがオーバーフローしないことを確認する必要があります。iTextテキストのオーバーフローやコピーフィットを検出

  • これが起こっているかどうかを検出する手段はありますか?
  • 起こったときにそれを処理するために使用できるコピーフィットルールはありますか?

おかげ

+0

あなたはiText5やiText7を使用していますか?タグitextは通常、前者を指します。また、javaまたは.Net?どちらのバージョンでもコンテンツの配置をシミュレートする方法はありますが、その答えはバージョンによって異なります:) –

+0

* "動的テキストをpdfに配置する必要があります" * - どうすればよいでしょうか? ** AcroForm **のテキストフィールドを入力しますか?または、** FreeText **(** FreeTextTypeWriter **)注釈を追加しますか?または、**コンテンツ**ストリームにページを追加しますか? – mkl

+0

"動的テキスト"を定義します。あなたのプログラムを実行する前の長さを知らないテキストですか?それともmklの投稿ですか? –

答えて

2

iText5が保守モードにあり、私はあなたがiText7を使用してプロジェクトを開始することをお勧めします。 iText7は現在、コピーフィッティングのためのメカニズムをすぐに提供していませんが、レイアウトエンジンはiText7で非常に柔軟であるため、手作業ではほとんど手作業で行うことができません。技術的にはiText5で行うこともできますが、iText7 for Javaの回答を提供し、C#への変換は問題ではありません。

基本的な考え方は、Renderersのコンセプトを利用して、異なるフォントサイズで指定された領域の段落をレイアウトしてみてください。バイナリ検索のアプローチは完全にここに収まります。

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); 
Document doc = new Document(pdfDoc); 

String text = "..."; 
Rectangle area = new Rectangle(100, 100, 200, 200); 
// Just draw a black box around to verify the result visually 
new PdfCanvas(pdfDoc.addNewPage()).rectangle(area).setStrokeColor(Color.BLACK).stroke(); 

Paragraph p = new Paragraph(text); 
IRenderer renderer = p.createRendererSubTree().setParent(doc.getRenderer()); 
LayoutArea layoutArea = new LayoutArea(1, area); 

// lFontSize means the font size which will be definitely small enough to fit all the text into the box. 
// rFontSize is the maximum bound for the font size you want to use. The only constraint is that it should be greater than lFontSize 
// Set rFontSize to smaller value if you don't want the font size to scale upwards 
float lFontSize = 0.0001f, rFontSize = 10000; 

// Binary search. Can be replaced with while (Math.abs(lFontSize - rFontSize) < eps). It is a matter of implementation/taste 
for (int i = 0; i < 100; i++) { 
    float mFontSize = (lFontSize + rFontSize)/2; 
    p.setFontSize(mFontSize); 
    LayoutResult result = renderer.layout(new LayoutContext(layoutArea)); 
    if (result.getStatus() == LayoutResult.FULL) { 
     lFontSize = mFontSize; 
    } else { 
     rFontSize = mFontSize; 
    } 
} 

// lFontSize is guaranteed to be small enough to fit all the text. Using it. 
float finalFontSize = lFontSize; 
System.out.println("Final font size: " + finalFontSize); 
p.setFontSize(finalFontSize); 
// We need to layout the final time with the final font size set. 
renderer.layout(new LayoutContext(layoutArea)); 
renderer.draw(new DrawContext(pdfDoc, new PdfCanvas(pdfDoc.getPage(1)))); 

doc.close(); 

出力:

Final font size: 5.7393746 

ビジュアル結果:

The output PDF looks like this

関連する問題