我在 pdfBOX 中找到了换行问题的解决方案
通常,您需要三个步骤来换行文本:
1)将每个单词拆分为必须包装的字符串并将它们放入字符串数组中,例如 String [] 部分
2) 使用 (textlength/(一行中的字符数)) 创建一个字符串缓冲区数组,例如 280/70=5 >> 我们需要 5 个换行符!
3) 将部分放入stringbuffer[i],直到允许一行中的最大字符数限制,
4) 循环直到 stringbuffer.length < linebreaks
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;
}
}