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