2011-09-29 29 views
6

我必須使用表格製作PDF。到目前爲止,它工作正常,但現在我想添加一個包裝功能。所以我需要插入一個換行符。如何使用PDFBox插入換行drawString

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

我想在「插入」之前添加「\n」。我嘗試了「\u000A」這是換行的十六進制值,但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操作員一起使用的前導符。 T* -operator進行換行。 ' -operator將給定的文本寫入下一行。 (有關更多詳細信息,請參閱PDF-spec,「文本」一章。沒有那麼多)。

以下是兩個代碼片段。兩者都是一樣的,但第一個代碼段使用',第二個代碼段使用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; 

您可能要乘以白衣一些行間距因子。