org.openlmis.web.view.pdf.PdfPageEventHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.openlmis.web.view.pdf.PdfPageEventHandler.java

Source

/*
 * This program is part of the OpenLMIS logistics management information system platform software.
 * Copyright  2013 VillageReach
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
 * You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses. For additional information contact info@OpenLMIS.org.
 */

package org.openlmis.web.view.pdf;

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.*;
import org.openlmis.core.service.MessageService;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * This class implements event handler for Pdf page.
 */

public class PdfPageEventHandler extends PdfPageEventHelper {

    public static final int PAGE_TEXT_WIDTH = 100;
    public static final int PAGE_TEXT_HEIGHT = 100;
    public static final float FOOTER_TEXT_SIZE = 10f;
    private final MessageService messageService;

    protected BaseFont baseFont;
    private PdfTemplate pageNumberTemplate;
    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
    private float textAdjustment;

    public PdfPageEventHandler(MessageService messageService) {
        super();
        this.messageService = messageService;
        try {
            baseFont = BaseFont.createFont();
            textAdjustment = baseFont.getWidthPoint("0", FOOTER_TEXT_SIZE);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        addPageFooterInfo(writer, document);
    }

    @Override
    public void onOpenDocument(PdfWriter writer, Document document) {
        pageNumberTemplate = writer.getDirectContent().createTemplate(PAGE_TEXT_WIDTH, PAGE_TEXT_HEIGHT);
    }

    @Override
    public void onCloseDocument(PdfWriter writer, Document document) {
        pageNumberTemplate.beginText();
        pageNumberTemplate.setFontAndSize(baseFont, FOOTER_TEXT_SIZE);
        pageNumberTemplate.setTextMatrix(0, 0);
        pageNumberTemplate.showText(String.valueOf(writer.getPageNumber() - 1));
        pageNumberTemplate.endText();
    }

    private void addPageFooterInfo(PdfWriter writer, Document document) {
        PdfContentByte contentByte = writer.getDirectContent();
        contentByte.saveState();

        contentByte.setFontAndSize(baseFont, FOOTER_TEXT_SIZE);

        contentByte.beginText();
        writeCurrentDate(document, contentByte);
        writePageNumber(writer, document, contentByte);
        contentByte.endText();

        contentByte.restoreState();
    }

    private void writeCurrentDate(Document document, PdfContentByte contentByte) {
        contentByte.setTextMatrix(document.left() + textAdjustment, document.bottom());
        String dateText = DATE_FORMAT.format(new Date());
        contentByte.showText(dateText);
    }

    private void writePageNumber(PdfWriter writer, Document document, PdfContentByte contentByte) {
        String pageNumberText = messageService.message("label.page.of", writer.getPageNumber()) + " ";
        float pageNumberTextSize = baseFont.getWidthPoint(pageNumberText, FOOTER_TEXT_SIZE);
        contentByte.setTextMatrix(document.right() - pageNumberTextSize - textAdjustment, document.bottom());
        contentByte.showText(pageNumberText);
        contentByte.addTemplate(pageNumberTemplate, document.right() - textAdjustment, document.bottom());
    }
}