Ответ 1
Я не думаю, что это возможно, чтобы обернуть текст автоматически. Но вы можете обернуть свой текст самостоятельно. См. Как вставить перевод строки с PDFBox drawString и Как я могу создавать абзацы фиксированной ширины с PDFbox? ,
Я использую 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();
Кто-нибудь знает, как я могу обернуть текст, чтобы он автоматически перешел на другую строку?
Я не думаю, что это возможно, чтобы обернуть текст автоматически. Но вы можете обернуть свой текст самостоятельно. См. Как вставить перевод строки с PDFBox drawString и Как я могу создавать абзацы фиксированной ширины с PDFbox? ,
Это сработало для меня. Сочетание 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();
}
Я нашел решение для проблемы с разрывом в pdfBOX
В общем, вам нужно выполнить три шага, чтобы обернуть текст:
1) разделяет каждое слово в строке, которое должно быть обернуто и помещено в массив строки, например. Строка [] частей
2) создайте массив stringbuffer с (textlength/(количество символов в строке)), например. 280/70 = 5 → нам нужно 5 строк!
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;
}
}
PdfBox и Boxable оба автоматически обертывают часть текста дольше, чем ширина ячейки, поэтому это означает, что если ширина ячейки = 80 ширина предложения = 100 оставшаяся часть текста ширины 20 начнется со следующей строки (ПРИМЕЧАНИЕ: я упомянул ширину (фактическое пространство, потребляемое предложением), а не длину (количество символов))
Если ширина предложения = 60, для заполнения ширины ячейки потребуется текст ширины 20, и любой текст после этого перейдет к следующей строке Решение: заполните эту ширину 20 пробелами.
ячейка Unfilled Space = cellWidth - sentenceWidth, numberOfSpaces = ячейка Unfilled Пространство/ширина одного пробела
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);