Publisher.CReport.java Source code

Java tutorial

Introduction

Here is the source code for Publisher.CReport.java

Source

package Publisher;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
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;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

/**
 *
 * @author Bryden
 */
public class CReport {

    public static String genReport(JSONArray pObjAry) throws IOException, COSVisitorException {

        List<List<String>> lstIncidentContents = new ArrayList<>();
        List<List<String>> lstHaze = new ArrayList<>();
        List<List<String>> lstDengue = new ArrayList<>();

        List<String> aryLst = new ArrayList<>();

        aryLst.add("Incident Type");
        aryLst.add("Percentage");

        lstIncidentContents.add(aryLst);

        List<String> aryHazeHeader = new ArrayList<>();

        aryHazeHeader.add("Region");
        aryHazeHeader.add("PSI");

        lstHaze.add(aryHazeHeader);

        List<String> aryDengueHeader = new ArrayList<>();

        aryDengueHeader.add("Zones");
        aryDengueHeader.add("Count");

        lstDengue.add(aryDengueHeader);

        for (Object obj : pObjAry) {
            JSONObject objJson = (JSONObject) obj;

            Iterator<?> keys = objJson.keySet().iterator();

            while (keys.hasNext()) {
                String key = (String) keys.next();

                if (key.equalsIgnoreCase("type")) {
                    continue;
                }

                String value = objJson.get(key) + "";

                List<String> aryValues = new ArrayList<>();

                switch (objJson.get("Type").toString().toUpperCase()) {
                case "STATS":
                    aryValues.add(key);
                    aryValues.add(value + "%");
                    lstIncidentContents.add(aryValues);
                    break;
                case "HAZE":
                    aryValues.add(key + " Area");
                    aryValues.add(value);
                    lstHaze.add(aryValues);
                    break;
                case "DENGUE":

                    switch (key.toUpperCase()) {
                    case "ALERT":
                        aryValues.add("Red Zone");
                        break;
                    default:
                        aryValues.add("Yellow Zone");
                        break;
                    }

                    aryValues.add(value);
                    lstDengue.add(aryValues);
                    break;
                }
            }

        }

        try (// Create a document and add a page to it
                PDDocument document = new PDDocument()) {
            PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
            document.addPage(page);

            // Create a new font object selecting one of the PDF base fonts
            PDFont font = PDType1Font.HELVETICA_BOLD;

            // Define a text content stream using the selected font, moving the cursor and drawing the text "Hello World"
            try (// Start a new content stream which will "hold" the to be created content
                    PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                // Define a text content stream using the selected font, moving the cursor and drawing the text "Hello World"
                contentStream.beginText();
                contentStream.setFont(font, 20);
                contentStream.moveTextPositionByAmount(70, 720);
                contentStream.drawString("Incident Summary (" + new Date() + ")");
                contentStream.endText();

                contentStream.beginText();
                contentStream.setFont(font, 18);
                contentStream.moveTextPositionByAmount(100, 670);
                contentStream.drawString("Incident Statistics");
                contentStream.endText();

                contentStream.beginText();
                contentStream.setFont(font, 18);
                contentStream.moveTextPositionByAmount(100, 500);
                contentStream.drawString("Haze Statistics");
                contentStream.endText();

                contentStream.beginText();
                contentStream.setFont(font, 18);
                contentStream.moveTextPositionByAmount(100, 300);
                contentStream.drawString("Dengue Statistics");
                contentStream.endText();

                drawTable(page, contentStream, 650, 100, lstIncidentContents);

                drawTable(page, contentStream, 480, 100, lstHaze);

                drawTable(page, contentStream, 280, 100, lstDengue);

                // Make sure that the content stream is closed:
            }

            String strFileName = new Date().getTime() + ".pdf";

            // Save the results and ensure that the document is properly closed:
            document.save(strFileName);

            return Paths.get(strFileName).toAbsolutePath().toString();

        }

    }

    public static void drawTable(PDPage page, PDPageContentStream contentStream, float y, float margin,
            List<List<String>> content) throws IOException {

        final int rows = content.size();
        final int cols = content.get(0).size();

        final float rowHeight = 20f;
        final float tableWidth = page.findMediaBox().getWidth() - (2 * margin);
        final float tableHeight = rowHeight * rows;
        final float colWidth = tableWidth / (float) cols;
        final float cellMargin = 5f;

        //draw the rows
        float nexty = y;
        for (int i = 0; i <= rows; i++) {
            contentStream.drawLine(margin, nexty, margin + tableWidth, nexty);
            nexty -= rowHeight;
        }

        //draw the columns
        float nextx = margin;
        for (int i = 0; i <= cols; i++) {
            contentStream.drawLine(nextx, y, nextx, y - tableHeight);
            nextx += colWidth;
        }

        //now add the text
        contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);

        float textx = margin + cellMargin;
        float texty = y - 15;
        for (List<String> content1 : content) {
            for (String text : content1) {
                contentStream.beginText();
                contentStream.moveTextPositionByAmount(textx, texty);
                contentStream.drawString(text);
                contentStream.endText();
                textx += colWidth;
            }
            texty -= rowHeight;
            textx = margin + cellMargin;
        }

    }

}