read pages leer existing con java pdfbox text-alignment

java - pages - pdfbox read pdf



Cómo centrar un texto usando PDFBox (2)

Mi pregunta es muy simple: ¿cómo puedo centrar un texto en un PDF, usando PDFBox ?

No sé la secuencia de antemano, no puedo encontrar el medio por prueba. La cadena no siempre tiene el mismo ancho.

Necesito cualquiera:

  • Un método que puede centrar el texto, algo así como addCenteredString(myString)
  • Un método que puede darme el ancho de la cadena en píxeles. Entonces puedo calcular el centro, porque sé las dimensiones del PDF.

Cualquier ayuda es bienvenida!


Esto agrega texto centrado a páginas en formato vertical y horizontal:

void addCenteredText(String text, PDFont font, int fontSize, PDPageContentStream content, PDPage page, Point2D.Float offset) throws IOException { content.setFont(font, fontSize); content.beginText(); // Rotate the text according to the page orientation boolean pageIsLandscape = isLandscape(page); Point2D.Float pageCenter = getCenter(page); // We use the text''s width to place it at the center of the page float stringWidth = getStringWidth(text, font, fontSize); if (pageIsLandscape) { float textX = pageCenter.x - stringWidth / 2F + offset.x; float textY = pageCenter.y - offset.y; // Swap X and Y due to the rotation content.setTextMatrix(Matrix.getRotateInstance(Math.PI / 2, textY, textX)); } else { float textX = pageCenter.x - stringWidth / 2F + offset.x; float textY = pageCenter.y + offset.y; content.setTextMatrix(Matrix.getTranslateInstance(textX, textY)); } content.showText(text); content.endText(); } boolean isLandscape(PDPage page) { int rotation = page.getRotation(); final boolean isLandscape; if (rotation == 90 || rotation == 270) { isLandscape = true; } else if (rotation == 0 || rotation == 360 || rotation == 180) { isLandscape = false; } else { LOG.warn("Can only handle pages that are rotated in 90 degree steps. This page is rotated {} degrees. Will treat the page as in portrait format", rotation); isLandscape = false; } return isLandscape; } Point2D.Float getCenter(PDPage page) { PDRectangle pageSize = page.getMediaBox(); boolean rotated = isRotated(page); float pageWidth = rotated ? pageSize.getHeight() : pageSize.getWidth(); float pageHeight = rotated ? pageSize.getWidth() : pageSize.getHeight(); return new Point2D.Float(pageWidth / 2F, pageHeight / 2F); } float getStringWidth(String text, PDFont font, int fontSize) throws IOException { return font.getStringWidth(text) * fontSize / 1000F; }

Así es como creas un PDF con texto centrado en una página girada:

PDDocument pdf = new PDDocument(); // A5 page in landscape format PDPage page = new PDPage(PDRectangle.A5); page.setRotation(90); pdf.addPage(page); try (PDPageContentStream content = new PDPageContentStream(pdf, page)) { int fontSize = 36; // Put the text at the page''s center, no offset Point2D.Float center = new Point2D.Float(0, 0); addCenteredText("PDFBox", PDType1Font.HELVETICA_BOLD, fontSize, content, page, center); // Put the text centered at the lower end of the page Point2D.Float lowerCenter = new Point2D.Float(0, -165); addCenteredText("Hi there!", PDType1Font.HELVETICA, fontSize, content, page, lowerCenter); } catch (IOException e) { LOG.warn("Exception while creating content", e); }

El PDF resultante:

Utilicé PDFBox 2.0.0-RC2 para crear este PDF.


Ok, encontré la respuesta yo mismo. Aquí es cómo centrar un texto en una página:

String title = "This is my wonderful title!"; // Or whatever title you want. int marginTop = 30; // Or whatever margin you want. PDDocument document = new PDDocument(); PDPage page = new PDPage() PDPageStreamContent stream = new PDPageContentStream(document, page); PDFont font = PDType1Font.HELVETICA_BOLD; // Or whatever font you want. int fontSize = 16; // Or whatever font size you want. float titleWidth = font.getStringWidth(title) / 1000 * fontSize; float titleHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize; stream.beginText(); stream.setFont(font, fontSize); stream.moveTextPositionByAmount((page.getMediaBox().getWidth() - titleWidth) / 2, page.getMediaBox().getHeight - marginTop - titleheight); stream.drawString(title); stream.endText(); stream.close();