2011-09-29 2 views
6

テーブルを使用してPDFを作成する必要があります。これまではうまくいきましたが、今ではラッピング機能を追加したいと考えています。だから私はラインフィードを挿入する必要があります。PDFBoxでラインフィードを挿入する方法drawString

contentStream.beginText(); 
contentStream.moveTextPositionByAmount(x, y); 
contentStream.drawString("Some text to insert into a table."); 
contentStream.endText(); 

「挿入」の前に「\n」を追加します。私は "\u000A"を試してみましたが、これは改行の16進値ですが、Eclipseではエラーが表示されます。

改行をdrawStringで追加することはできますか?

答えて

8

pdf形式では改行が分かりません。 moveTextPositionByAmountを使用して文字列を分割し、テキスト位置を次の行に移動する必要があります。

これは特別な「pdfbox-feature」ではなく、pdf形式の定義によるものです。 drawStringのための方法はなく、ラインフィードをサポートする他のメソッドも呼び出されません。

+1

@Erik:しかし、 'T *'と '' --operatorは何ですか? pdf-specはT *に言う:「次の行の先頭に移動する」そして、 ': "次の行に移動し、テキスト文字列を表示します"。しかし、私はpdfBoxでT *や 'を使う方法を見つけることができませんでした。 (そして私は仕様を正しく理解しているかどうかわからない。) – Lukas

0

PDFモデルはしばしば当面の作業のための最良のモデルではないため、ケースに「欠落」があるもののサポートを追加するためのラッパーを作成することがよくあります。これは、読み書きの両方に当てはまります。

12

PDF形式では改行が可能ですが、PDFBoxでは改行機能が組み込まれていません。

PDFで改行を使用するには、TLオペレータで使用する先頭を定義する必要があります。 - オペレータが改行します。 ' -operatorは、指定されたテキストを次の行に書き込みます。 (詳細については、PDF-specの章「Text」の章を参照してください)。

2つのコードスニペットがあります。どちらも同じですが、最初のスニペットは'を使用し、2番目のスニペットはT*を使用します。改行のための

private void printMultipleLines(
    PDPageContentStream contentStream, 
    List<String> lines, 
    float x, 
    float y) throws IOException { 
    if (lines.size() == 0) { 
    return; 
    } 
    final int numberOfLines = lines.size(); 
    final float fontHeight = getFontHeight(); 

    contentStream.beginText(); 
    contentStream.appendRawCommands(fontHeight + " TL\n"); 
    contentStream.moveTextPositionByAmount(x, y); 
    contentStream.drawString(lines.get(0)); 
    for (int i = 1; i < numberOfLines; i++) { 
    contentStream.appendRawCommands(escapeString(lines.get(i))); 
    contentStream.appendRawCommands(" \'\n"); 
    } 
    contentStream.endText(); 
} 

private String escapeString(String text) throws IOException { 
    try { 
    COSString string = new COSString(text); 
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
    string.writePDF(buffer); 
    return new String(buffer.toByteArray(), "ISO-8859-1"); 
    } catch (UnsupportedEncodingException e) { 
    // every JVM must know ISO-8859-1 
    throw new RuntimeException(e); 
    } 
} 

使用T*

private void printMultipleLines(
    PDPageContentStream contentStream, 
    List<String> lines, 
    float x, 
    float y) throws IOException { 
    if (lines.size() == 0) { 
    return; 
    } 
    final int numberOfLines = lines.size(); 
    final float fontHeight = getFontHeight(); 

    contentStream.beginText(); 
    contentStream.appendRawCommands(fontHeight + " TL\n"); 
    contentStream.moveTextPositionByAmount(x, y); 
    for (int i = 0; i < numberOfLines; i++) { 
    contentStream.drawString(lines.get(i)); 
    if (i < numberOfLines - 1) { 
     contentStream.appendRawCommands("T*\n"); 
    } 
    } 
    contentStream.endText(); 
} 

このコマンドを使用することができ、フォントの高さを取得するには:あなたはそれを乗算する場合があります

fontHeight = font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize; 

をいくつかのラインピッチを聖霊降臨祭因子。

関連する問題