PDFs in Java erstellen – Open Source

Zur Erstellung von PDFs mit Java gibt es nur wenige wirkliche Open Source Lösungen. Leider wurde eine gute Lösung mittlerweile kostenpflichtig und für kommerzielle Nutzung wirklich teuer wenn man ein paar Nutzer anbinden will. Somit haben wir uns für pdfBox entschieden. Es ist zwar um einiges einfacher und rudimentärer gestaltet als iTextPdf aber dafür noch open source und vor allem Lizenzfrei.

Wir haben vor kurzem eine andere Möglichkeit gefunden. Leider ist es nicht so schön gelöst wie bei iTextPdf. Jede Zeile/Pixel und Polygon wie auch immer man es bezeichnen mag wird per Koordinatensystem bestimmt. Wobei der absolute Nullpunkt immer links unten ist.

Auch unterstützt pdfBox leider keine Tabellen, Hintergründe oder sonstige Features. Wobei ich demnächst eine neue Subklasse euch anbieten möchte in der man ein paar dieser simplen Features nutzen kann. Vorallem mit Background hinterlegter Text oder auch eine Tabelle.

 
Anbei noch ein kleiner UseCase wie pdfBox zu verwenden ist.
 

private int column1 = 30, column2 = 350, column3 = 475;
private int startTop  = 700;
private int spacer = 21;
private float pageWidth = 0;

public void generatePDF() {
            PDDocument document;
	    PDPage page;
	    PDFont font;
	    PDPageContentStream contentStream;
	    PDJpeg logo;
	    InputStream inputLogo;
	    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
	    final ClassLoader cls = Thread.currentThread().getContextClassLoader();
	    
	    // Creating Document
	    document = new PDDocument();

	    page = new PDPage(PDPage.PAGE_SIZE_A4);
	    pageWidth = PDPage.PAGE_SIZE_A4.getWidth();
	    LOG.info("HEIGHT: " + PDPage.PAGE_SIZE_A4.getHeight() + " WIDTH: " + PDPage.PAGE_SIZE_A4.getWidth());
	    
	    // Adding page to document
	    document.addPage(page); 

	    // Adding FONT to document
	    font = PDType1Font.HELVETICA;           

	    // Retrieve Image to be added to the PDF
	    inputLogo = new FileInputStream(new File(cls.getResource("image-default-logo.png").toURI().getPath()));

	    BufferedImage buffLogo = ImageIO.read(inputLogo);
	    logo = new PDJpeg(document, buffLogo);
	    logo.setHeight(32);
	    logo.setWidth(246);

            contentStream = new PDPageContentStream(document, page); 
	    contentStream.drawImage(logo, 339, 770);
	    
	    addBackgroundRectangle(contentStream, Color.GRAY, column1, l-8, 31);
	    addText(contentStream, font, reportuebersicht, 18, column1, newLine());
}

private void addText(PDPageContentStream contentStream,
	    				PDFont font,String text,int size,
	    				int posx,int posy) throws IOException {
	contentStream.beginText();
	contentStream.setFont(font, size);
	contentStream.moveTextPositionByAmount(posx, posy);
	contentStream.drawString(StringEscapeUtils.unescapeHtml4(text));
	contentStream.endText();
}

private void addBackgroundRectangle(PDPageContentStream contentStream, Color color, int posx, int posy, int height) throws IOException {
	 contentStream.setNonStrokingColor(color);
	 contentStream.fillRect(posx-3, posy-3, pageWidth-60, height);
	 contentStream.setNonStrokingColor(Color.BLACK);
}