0

I was trying to create a PDF using iText. My objective is to make a question paper. I was able to only add the questions and answers to the PDF. Then i tried modifying it by adding page numbers, watermarks etc. by adding Header/Footer. Now it gives me NullPointerException i cannot figure out what went wrong.

Error I'm getting

Caused by: java.lang.NullPointerException at edu.ijse.gdse41.ams.other.HeaderFooter.onEndPage(HeaderFooter.java:57) at com.itextpdf.text.pdf.PdfDocument.newPage(PdfDocument.java:902) at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:837) at com.itextpdf.text.Document.close(Document.java:416) at edu.ijse.gdse41.ams.view.CreateAssignmentController.createPDF(CreateAssignmentController.java:644) at edu.ijse.gdse41.ams.view.CreateAssignmentController.proceedBtnClicked(CreateAssignmentController.java:292) ... 58 more

createPDF() method in CreateAssignment.java class

private void createPDF(ArrayList<Assignment_QuesDTO> questionPaper) throws DocumentException, BadElementException, IOException {
    try {
        OutputStream outputStream = null;
        Document doc = new Document();
        outputStream = new FileOutputStream(new File("C:\\Users\\Dell\\Documents\\NetBeansProjects\\AssignmentManagementSystem\\src\\PDF\\mypdf.pdf"));
        PdfWriter writer = PdfWriter.getInstance(doc, outputStream);   

        PdfPageEventHelper eventHelper = new HeaderFooter(doc);
        writer.setPageEvent(eventHelper);

        doc.open(); 

        Font fontTitle = new Font(Font.getFamily("TIMES_ROMAN"), 15);

        Paragraph title = new Paragraph("ABC", fontTitle);
        title.setAlignment(Paragraph.ALIGN_CENTER);
        doc.add(title);

        for (int i = 0; i < 3; i++) {
            doc.add(Chunk.NEWLINE);
        }

        Paragraph subTitle = new Paragraph(questionPaper.get(1).getAssignment().getAssignName());
        subTitle.setAlignment(Paragraph.ALIGN_CENTER);
        Paragraph subTitle2 = new Paragraph(questionPaper.get(1).getAssignment().getDate());
        subTitle2.setAlignment(Paragraph.ALIGN_CENTER);

        doc.add(subTitle);
        doc.add(subTitle2);

        List orderedList = new List(List.ORDERED);

        for (Assignment_QuesDTO questionPaper1 : questionPaper) {
            Paragraph question = new Paragraph(questionPaper1.getQuestion().getQues());
            question.setAlignment(Paragraph.ALIGN_JUSTIFIED);
            orderedList.add(question);
            List desc = new List(List.UNORDERED);
            desc.setIndentationLeft(36);
            desc.setListSymbol(new Chunk(" "));
            desc.add(new Phrase("\t\t" + questionPaper1.getQuestion().getQuesDesc()));
            orderedList.add(desc);
            orderedList.add(Chunk.NEWLINE);

            List answers = new List(List.ORDERED,List.ALPHABETICAL);
            answers.setIndentationLeft(72);
            for (AnswerDTO answer : questionPaper1.getQuestion().getAnswers()) {
                answers.add("  " + answer.getAnswer());
            }
            orderedList.add(answers);
            orderedList.add(Chunk.NEWLINE);
        }

        doc.add(orderedList);
        doc.close();

    } catch (FileNotFoundException ex) {
        Logger.getLogger(CreateAssignmentController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

HeaderFooter.java class

public class HeaderFooter extends PdfPageEventHelper {

    Phrase[] header = new Phrase[2];
    int pageNum;

    Image watermark;

    public HeaderFooter(Document doc) throws BadElementException, IOException {
        this.watermark = Image.getInstance("C:\\Users\\Dell\\Documents\\NetBeansProjects\\AssignmentManagementSystem\\src\\edu\\ijse\\gdse41\\ams\\resources\\images\\watermark.png");
        watermark.rotate();
        watermark.scaleToFit(doc.getPageSize());
        watermark.setRotationDegrees(30);
    }

    @Override
    public void onChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title) {
        header[1] = new Phrase(title.getContent());
        pageNum = 1;
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        try {
            Rectangle rect = writer.getBoxSize("art");
            switch (writer.getPageNumber() % 2) {
                case 0:
                    ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_RIGHT, header[0], rect.getRight(), rect.getTop(), 0);
                    break;
                case 1:
                    ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, header[1], rect.getLeft(), rect.getTop(), 0);
                    break;
            }
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(String.format("Page %d", pageNum)), (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);

            PdfContentByte content = writer.getDirectContent();
            content.addImage(watermark);
        } catch (DocumentException ex) {
            Logger.getLogger(HeaderFooter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void onStartPage(PdfWriter writer, Document document) {
        pageNum++;
    }

    @Override
    public void onOpenDocument(PdfWriter writer, Document document) {
        header[0] = new Phrase("ABC");
    }

}
Andrii Abramov
  • 10,019
  • 9
  • 74
  • 96
Dilini Peiris
  • 446
  • 1
  • 6
  • 16

1 Answers1

1

In your page event, you assume that the PDF you are creating has an /ArtBox boundary:

Rectangle rect = writer.getBoxSize("art");

However, when I look at the code that creates your PDF, I don't see you creating such a page boundary anywhere. This means that rect is null, and that methods such as rect.getRight(), rect.getTop(),... throw a NullPointerException.

Bruno Lowagie
  • 75,994
  • 9
  • 109
  • 165