2011-09-29 17 views
6

के साथ एक लाइनफीड डालने के लिए मुझे एक टेबल के साथ पीडीएफ बनाना है। अब तक यह ठीक काम करता है, लेकिन अब मैं एक रैपिंग सुविधा जोड़ना चाहता हूं। तो मुझे एक लाइनफीड डालने की जरूरत है।पीडीएफबॉक्स ड्रॉस्ट्रिंग

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

मैं "डालने" से पहले "\n" जोड़ना चाहता हूं। मैंने कोशिश की "\u000A" जो लाइनफीड के लिए हेक्स मान है, लेकिन ग्रहण मुझे एक त्रुटि दिखाता है।

क्या ड्रॉस्ट्रिंग के साथ लाइनफीड जोड़ना संभव है?

उत्तर

8

पीडीएफ प्रारूप लाइन ब्रेक नहीं जानता है। MoveTextPositionByAmount का उपयोग करके, आपको स्ट्रिंग को विभाजित करना होगा और टेक्स्ट स्थिति को अगली पंक्ति में ले जाना होगा।

यह एक विशेष "पीडीएफबॉक्स-फीचर" नहीं है, यह पीडीएफ प्रारूप परिभाषा के कारण है; इसलिए ड्रॉस्ट्रिंग के लिए कोई रास्ता नहीं है और समर्थन लाइनफीड्स कहने के लिए कोई और तरीका भी नहीं है।

+1

@Erik: लेकिन 'टी *' - और '' 'ऑपरेटर के साथ क्या है? पीडीएफ-स्पेक टी * से कहता है: "अगली पंक्ति की शुरुआत में ले जाएं"। और ':' अगली पंक्ति में ले जाएं और एक टेक्स्ट स्ट्रिंग दिखाएं "। लेकिन मुझे टी * या 'पीडीएफबॉक्स में उपयोग करने का कोई तरीका नहीं मिला। (और मुझे यकीन नहीं है कि मैं कल्पना को सही समझता हूं या नहीं।) – Lukas

0

क्योंकि पीडीएफ मॉडल अक्सर काम के लिए सबसे अच्छा मॉडल नहीं है, इसलिए अक्सर इसके लिए एक रैपर लिखना समझ में आता है जो आपके मामले में जो भी "लापता" के लिए समर्थन जोड़ता है। यह पढ़ने और लिखने दोनों के लिए सच है।

12

पीडीएफ प्रारूप लाइन ब्रेक की अनुमति देता है, लेकिन पीडीएफबॉक्स में लाइन ब्रेक के लिए सुविधा में कोई निर्माण नहीं है।

पीडीएफ में लाइन ब्रेक का उपयोग करने के लिए आपको उस अग्रणी को परिभाषित करना होगा जिसे आप TL -operator के साथ उपयोग करना चाहते हैं। T* -ऑपरेटर लाइन ब्रेक बनाता है। ' -ऑपरेटर अगले पंक्ति में दिए गए पाठ को लिखता है। (अधिक जानकारी के लिए पीडीएफ-स्पेक देखें, अध्याय "पाठ"। यह इतना नहीं है।)

यहां दो कोड स्निपेट हैं। दोनों एक ही करते हैं, लेकिन पहला स्निपेट ' का उपयोग करता है और दूसरा स्निपेट 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; 

आप इसे गुणा करने के लिए चाहते हो सकता है कुछ लाइन पिच कण कारक।

संबंधित मुद्दे