Paul Baumgarten

Computer Scientist, teacher, freelance programmer and self confessed geek

Java: PDF creation

I've used the FPDF library before quite easily, so I suggest looking for something based on it. A quick search reveals the following:

https://github.com/nkiraly/Java-FPDF

Old code

This is some code from 2015 I used to create PDFs of my classlists at a previous school. It used the FPDF library (a previous version that was hosted on sourceforge). It likely needs a new coat of paint but it should hopefully give some indications as to how to get started.

net/paulbaumgarten/schoolutils/PhotoClassLists.java

package net.paulbaumgarten.schoolutils;
// PDF
import net.sourceforge.javafpdf.*;
import java.io.File;
import net.paulbaumgarten.helpers.FreePDF;
import java.io.FileNotFoundException;
// JSON
import java.util.Scanner;
import java.io.File;
import org.json.*;
// MYSQL
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
// ReadInput
import net.paulbaumgarten.helpers.IO;

/*
PDF library methods:
* Set colours and coordinates etc
    pdf.setDrawColor(0,0,0);
    pdf.setFillColor(0,0,0);
    pdf.setTextColor(0,0,0);
    pdf.setFont("arial", null,10);
    pdf.setFontSize(10);
    pdf.setXY(10,10);       // units are millimetres?
    pdf.getX(); pdf.getY();
* Line break
    pdf.Ln();
* New page
    pdf.addPage();
* Insert an image file
    // type = PNG, JPEG (not quoted)
    pdf.Image( String file, x, y, width, height, type, 0 );
    pdf.Image("c:\\test.png", coordinate, 50, 50, ImageType.PNG, 0);
* Insert a text cell
    pdf.Cell( width, height, text, 0, 0, align ); // left = L
    pdf.MultiCell( width, height, spacing, text, border, align );
* Draw a line (two methods)
    pdf.Line( x1, y1, x2, y2 );
    pdf.Line(new Coordinate(x1, y1), new Coordinate(x2, y2));
* Draw a rectangle
    // F = fill
    pdf.Rect( x1, y1, addX, addY, 'F');
*/

public class PhotoClassLists {

  String dbType;
  String dbAddress;
  String dbUser;
  String dbPassword;
  String dbName;
  String photosFolder;
  String saveFolder;
  String connectionString;

  public PhotoClassLists(String settingsFilename) {
    photosFolder = new String("");
    saveFolder = new String("");
    connectionString = new String("");
    try {
      String jsonTxt = new Scanner(new File(settingsFilename)).useDelimiter("\\Z").next();
      JSONObject json = new JSONObject(jsonTxt);  

      String dbType = json.getJSONObject("database").getString("type");
      String dbAddress = json.getJSONObject("database").getString("address");
      String dbUser = json.getJSONObject("database").getString("user");
      String dbPassword = json.getJSONObject("database").getString("password");
      String dbName = json.getJSONObject("database").getString("name");
      connectionString = "jdbc:"+dbType+"://"+dbAddress+"/"+dbName+"?user="+dbUser+"&password="+dbPassword;

      photosFolder = json.getString("photos");
      saveFolder = json.getString("savefolder");
    } catch (Exception e) {
      System.out.println(e);
    }  
  }

  public void createPhotoClassLists(String teacherid, String pdfFileName) {
    boolean debug = true;

    try {
      Statement stmt = null;
      ResultSet rs = null;
      Connection conn = null;

      // Read database records
      conn = DriverManager.getConnection("jdbc:mysql://localhost/school?user=root&password=");
      String sql = "select classes.classid, enrolments.studentid, students.surname, students.firstname "
        + "from (( classes " 
        + "left join enrolments on classes.classid=enrolments.classid ) "
        + "left join students on enrolments.studentid=students.studentid ) "
        + "where classes.teacherid='"+teacherid.toUpperCase()+"' "
        + "order by classes.classid, enrolments.studentid;";
      stmt = conn.createStatement();
      rs = stmt.executeQuery(sql);

      // Create PDF
      FreePDF pdf = new FreePDF();
      pdf.open();
      pdf.setTopMargin(5);
      pdf.setCreator("Copyright (C) 2015 Paul Baumgarten");
      pdf.setDrawColor(0,0,0);
      pdf.setFillColor(0,0,0);
      pdf.setTextColor(0,0,0);
      pdf.setFont("arial", null,10);
      pdf.setFontSize(10);
      pdf.setXY(10,10);

      // Debugging grid
      if (debug) {
        pdf.setDrawColor(50,50,50);
        for (int i=0; i<30; i++) {
          pdf.Line(new Coordinate(0, i*10), new Coordinate(210, i*10)); 
        }
        for (int i=0; i<21; i++) {
          pdf.Line(new Coordinate(i*10, 0), new Coordinate(i*10, 295)); 
        }
        pdf.setDrawColor(0,0,0);
      }

      // Page Header
      String pageIdentifier = "";
      int col=0, x=0, y=0;

      // Process data rows      
      while (rs.next()) {
        if (! pageIdentifier.equals(rs.getString("classid"))) {
          System.out.println("Processing class: "+rs.getString("classid"));
          pdf.addPage();
          pdf.setXY(10,3);
          pdf.setFontSize(16);
          pdf.Cell(0,16,"Class " + rs.getString("classid"));
          pdf.setY( pdf.getY() + (int)(16*25.4/72.0));
          pdf.setY( pdf.getY() + 7 );
          col = 0;
          pdf.setFontSize(8);
          pageIdentifier = rs.getString("classid");
        }

        pdf.setX( 10+30*col );
        String imgFileName = photosFolder + "/" + rs.getString("studentid") + ".jpg.png";
        try {
          pdf.Image(imgFileName, new Coordinate(pdf.getX(), pdf.getY()), (int)(35*96/143), 35, ImageType.PNG, 0);
        } catch (FileNotFoundException e) {
          System.out.println(imgFileName);
          System.out.println("Error: "+e);
        }
        pdf.setY( pdf.getY() + 33 );
        pdf.setX( 10+30*col );
        pdf.Cell(0,10,rs.getString("surname")+", "+rs.getString("firstname"));
        pdf.setY( pdf.getY() - 33 );

        if (col < 5) {
          col++;
        } else if (col == 5) {
          col = 0;
          pdf.setY( pdf.getY()+43 );
        }
      }

      // Save PDF
      File pdfFile = new File(pdfFileName);
      pdf.output(pdfFile);

      // Close database
      rs.close();
      stmt.close();      
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    System.out.println("PhotoClassLists - By Paul Baumgarten 2015");
    System.out.println("Will generate photo class lists as PDF for a given teacher.");
    PhotoClassLists classListGenerator = new PhotoClassLists("photoclasslists.json");
    // Ask for teacherid
    String teacherid = IO.readInput("Enter teacherid: ").toUpperCase();
    String pdfFileName = classListGenerator.saveFolder + "/" + teacherid + ".pdf";
    System.out.println("Creating "+pdfFileName);
    classListGenerator.createPhotoClassLists(teacherid, pdfFileName);
  }

}

net/paulbaumgarten/helpers/FreePDF.java

package net.paulbaumgarten.helpers;

// PDF
import net.sourceforge.javafpdf.*;
import java.io.File;
import java.io.FileNotFoundException;

public class FreePDF extends FPDF {
    public void Header() {
    }

    public void Footer() {
    }
}