2011-09-29 14 views
6

Tablo ile PDF yapmak zorundayım. Şimdiye kadar çalışıyor, ama şimdi bir sarma özelliği eklemek istiyorum. Bu yüzden bir Linefeed eklemem gerekiyor.PDF Kutusu ile Bir Besleme Nasıl Eklenir drawString

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

ben "insert" önce "\n" eklemek istiyorum. Satır besleme için onaltılık değer olan "\u000A" denedim, ancak Eclipse bana bir hata gösteriyor.

DrawString ile satır besleme eklemek mümkün mü?

cevap

8

Pdf biçimi satır sonlarını bilmemektedir. Dizeyi bölmeli ve moveTextPositionByAmount kullanarak metin konumunu bir sonraki satıra taşımalısınız.

Bu özel bir "pdfbox-özelliği" değil, pdf biçimi tanımından kaynaklanmaktadır; bu yüzden drawString için bir yol yoktur ve ayrıca linefeed'leri destekleyen başka bir yöntem de yoktur.

+1

@Erik: Ama T * 've - '-operator ile olan nedir? pdf-spec T *: "Bir sonraki satırın başlangıcına git" yazıyor. Ve ':' Bir sonraki satıra git ve bir metin dizesi göster ". Ama pdfBox'ta T * veya '' yi kullanmanın bir yolunu bulamadım. (Ve doğruyu anladığımdan emin değilim.) – Lukas

0

PDF modeli genellikle eldeki görev için en iyi model olmadığından, sizin durumunuzda "eksik" olanı için destek ekleyen bir sarmalayıcı yazmanız genellikle mantıklıdır. Bu hem okuma hem de yazma için geçerlidir.

12

PDF formatı satır sonlarına izin verir, ancak PDFBox'ın satır sonları için bir özellik özelliği yoktur.

Eğer TL -Operatör ile kullanmak istediğiniz lider tanımlamak zorunda PDF satır sonlarını kullanın. T* -ölçer, bir satır sonu oluşturur. ' -operator verilen metni bir sonraki satıra yazar. (Daha fazla bilgi için bkz. PDF-spec, "Metin" bölümü. Çok fazla değil.)

İki kod parçacığı burada. Her ikisi de aynı, ancak ilk snippet ' kullanır ve ikinci snippet T* kullanır. satır sonu için

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); 
    } 
} 

Kullanım 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(); 
} 

yazı yüksekliğini almak için bu komutu kullanabilirsiniz:

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

Sen çarpın isteyebilirsiniz bazı satır sahası katiyen faktörü.

İlgili konular