read pages leer existing con java text wrap pdfbox

java - pages - texto de envoltura pdfbox



pdfbox read pdf (4)

Estoy usando PDFBox con el siguiente código:

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();

¿Alguien sabe cómo puedo ajustar el texto para que vaya automáticamente a otra línea? ¡Muchas gracias!


Encontré una solución para el problema de salto de línea en pdfBOX

En general, necesita tres pasos para ajustar su texto:

1) divide cada palabra en una cadena que tiene que ser envuelta y ponerlos en una matriz de cadena, por ejemplo, las partes de la cadena []

2) crear una matriz de stringbuffer con (longitud de texto / (número de caracteres en una línea)), por ejemplo, 280/70 = 5 >> ¡necesitamos 5 saltos de línea!

3) coloque las partes en el buffer de cadena [i], hasta que se permita el límite del número máximo de caracteres en una línea,

4) loop hasta stringbuffer.length <linebreaks

el método splitString es el método que lo hace. El método writeText simplemente dibuja el texto envuelto al pdf

Aquí hay un ejemplo

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 "); 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; } }


Esto funcionó para mí. Una combinación de WordUtils y split

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 y Boxable ambos ajustan automáticamente la parte del texto más larga que el ancho de la celda, lo que significa que si ancho de celda = 80 ancho de oración = 100 la porción restante del texto de ancho 20 comenzará desde la siguiente línea (NOTA: he mencionado el ancho (espacio real consumido por la oración) y no longitud (número de caracteres))

Si ancho de oración = 60, se requerirá un texto de ancho 20 para llenar el ancho de la celda, y cualquier texto posterior irá a la siguiente línea Solución: llene este ancho 20 con espacios

espacio sin llenar de la celda = cellWidth - sentenceWidth, numberOfSpaces = Espacio / ancho sin llenar de la celda de un solo espacio

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);