2013-02-04 161 views
11

我使用PDFBox的機智HTHE下面的代碼:PDFBOX文本換行

doc = new PDDocument(); 
page = new PDPage(); 

doc.addPage(page); 
PDFont font = PDType1Font.COURIER; 

pdftitle = new PDPageContentStream(doc, page); 
pdftitle.beginText(); 
pdftitle.setFont(font, 12); 
pdftitle.moveTextPositionByAmount(40, 740); 
pdftitle.drawString("Here I insert a lot of text"); 
pdftitle.endText(); 
pdftitle.close(); 

有誰知道我怎麼可以自動換行,這樣它會自動轉到另一條線?非常感謝!

回答

0

我發現斷行問題的解決方案PDFBOX

在一般情況下,你需要三個步驟來包裝你的文字:

1)必須被包裹字符串分割每個單詞並把它們放入一個字符串數組中,例如字符串[]部分

2)創建一個帶有(textlength /(字符數在一行中)的字符串緩衝區數組) 280/70 = 5 >>我們需要5個linebreaks!

3)把零件到StringBuffer的[I]中,直到行中的字符的數量上限是允許的,

4)循環,直到stringbuffer.length <換行符

方法splitString是這樣做的方法。 方法WRITETEXT剛剛繪製行文本的PDF

下面是一個例子

import java.io.IOException; 
import java.util.ArrayList; 

import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 

public class pdfTest{ 
private ArrayList<String> arrayList; 
private PDDocument document; 
private PDFont font = PDType1Font.HELVETICA; 

pdfTest(PDDocument document, ArrayList arrayList, PDFont font) throws COSVisitorException, IOException { 
    this.document = document; 
    this.arrayList = arrayList; 
    this.font = font; 
    writeText(document, arrayList, 30, 750, font); //method for easily drawing a text into a pdf 
} //constructor 


public void writeText(PDDocument document, ArrayList arrayList, int positionX, int positionY, PDFont font) throws IOException, COSVisitorException { 
    PDPage page = new PDPage(); 
    document.addPage(page); 

    // Start a new content stream 
    PDPageContentStream contentStream = new PDPageContentStream(document, page); 

    // Define a text content stream using the selected font, moving the cursor and drawing the text in arrayList 
    for(int i=0;i<arrayList.size();i++) { 
     String text=(String) arrayList.get(i); 
     String [] tmpText = splitString(text); 
     for(int k=0;k<tmpText.length;k++) { 
      contentStream.beginText(); 
      contentStream.setFont(font, 12); 
      contentStream.moveTextPositionByAmount(positionX, positionY); 
      contentStream.drawString(tmpText[k]);   
      contentStream.endText(); 
      positionY=positionY-20; 
     }   
     contentStream.setLineWidth((float) 0.25); 
    } 

    // Make sure that the content stream is closed: 
    contentStream.close();  
    document.save("Test.pdf"); 
    document.close(); 
} //main 

public static void main(String[] args) throws COSVisitorException, IOException { 
    ArrayList arrayList = new ArrayList<String>(); 

    PDDocument document = new PDDocument(); 
    PDFont font = PDType1Font.HELVETICA; 
    PDPage page = new PDPage(); 

    arrayList.add(  "12345 56789 0 aaa bbbew wel kwäer kweork merkweporkm roer wer wer e er" 
         + "df sdmfkl slkdfm sdkfdof sopdkfp osdkfo sädölf söldm,f sdkfpoekr re, ä" 
         + " sdfk msdlkfmsdlk fsdlkfnsdlk fnlkdn flksdnfkl sdnlkfn kln df sdmfn sn END"); 
    arrayList.add("this is an example"); 
    arrayList.add("java pdfbox stackoverflow");   

    new pdfTest(document,arrayList,font); 
    System.out.println("pdf created!"); 
} 

public String [] splitString(String text) { 
    /* pdfBox doesnt support linebreaks. Therefore, following steps are requierd to automatically put linebreaks in the pdf 
     * 1) split each word in string that has to be linefeded and put them into an array of string, e.g. String [] parts 
     * 2) create an array of stringbuffer with (textlength/(number of characters in a line)), e.g. 280/70=5 >> we need 5 linebreaks! 
     * 3) put the parts into the stringbuffer[i], until the limit of maximum number of characters in a line is allowed, 
     * 4) loop until stringbuffer.length < linebreaks 
     * 
     */ 
    int linebreaks=text.length()/80; //how many linebreaks do I need? 
    String [] newText = new String[linebreaks+1];  
    String tmpText = text; 
    String [] parts = tmpText.split(" "); //save each word into an array-element 

    //split each word in String into a an array of String text. 
    StringBuffer [] stringBuffer = new StringBuffer[linebreaks+1]; //StringBuffer is necessary because of manipulating text 
    int i=0; //initialize counter 
    int totalTextLength=0; 
    for(int k=0; k<linebreaks+1;k++) { 
     stringBuffer[k] = new StringBuffer(); 
     while(true) {    
      if (i>=parts.length) break; //avoid NullPointerException 
      totalTextLength=totalTextLength+parts[i].length(); //count each word in String    
      if (totalTextLength>80) break; //put each word in a stringbuffer until string length is >80 
      stringBuffer[k].append(parts[i]); 
      stringBuffer[k].append(" "); 
      i++; 
     } 
     //reset counter, save linebreaked text into the array, finally convert it to a string 
     totalTextLength=0; 
     newText[k] = stringBuffer[k].toString(); 
    } 
    return newText; 
} 

} 
+5

的細胞的未填充空間/寬度上的字符數使用限制每行似乎不適合大多數字體。相反,您可能想要限制在pdf中繪製的線的實際長度。 [這個答案](http://stackoverflow.com/questions/19635275/how-to-generate-multiple-lines-in-pdf-using-apache-pdfbox/19683618#19683618)可能會幫助你在這方面 – mkl

4

這爲我工作。 WordUtils的組合和分割

String[] wrT = null; 
String s = null; 
text = "Job Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque hendrerit lectus nec ipsum gravida placerat. Fusce eu erat orci. Nunc eget augue neque. Fusce arcu risus, pulvinar eu blandit ac, congue non tellus. Sed eu neque vitae dui placerat ultricies vel vitae mi. Vivamus vulputate nullam."; 
    wrT = WordUtils.wrap(text, 100).split("\\r?\\n"); 
     for (int i=0; i< wrT.length; i++) { 
       contents.beginText(); 
       contents.setFont(PDType1Font.HELVETICA, 10); 
       contents.newLineAtOffset(50,600-i*15); 
       s = wrT[i]; 
       contents.showText(s); 
       contents.endText(); 
      } 
+0

在哪裏做過WordUtils從哪裏來? – jrahhali

+0

@jrahhali看起來像org.apache.commons.text.WordUtils – Wodin

0

PDFBOX和Boxable都自動環繞文字比電池寬度更長的部分,所以這意味着如果 單元寬度= 80 句寬度= 100 所述的剩餘部分(注意:我已經提到寬度(由句子消耗的實際空間)而不是長度(字符數))

如果句子寬度= 60, 寬度爲20的文本將需要填充單元格的寬度,之後的任何文本將會轉到下一行 解決方案:填補這個寬20以空格

細胞的未填充空間= cellWidth - sentenceWidth, numberOfSpaces =單個空間

private String autoWrappedHeaderText(String text, float cellWidth) { 
    List<String> splitStrings = Arrays.asList(text.split("\n")); 
    String wholeString = ""; 
    for (String sentence : splitStrings) { 
     float sentenceWidth = FontUtils.getStringWidth(headerCellTemplate.getFont(), " " + sentence + " ", 
       headerCellTemplate.getFontSize()); 
     if (sentenceWidth < cellWidth) { 
      float spaceWidth = FontUtils.getStringWidth(headerCellTemplate.getFont(), " ", 
        headerCellTemplate.getFontSize()); 
      int numberOfSpacesReq = (int) ((cellWidth - sentenceWidth)/spaceWidth); 
      wholeString += sentence; 
      for (int counter = 0; counter < numberOfSpacesReq; counter++) { 
       wholeString += " "; 
      } 
     } 
    } 

    return wholeString; 
} 
cell = headerRow.createCell(cellWidth * 100/table.getWidth(), headerText, HorizontalAlignment.LEFT, VerticalAlignment.TOP);