org.qnot.passtab.PDFOutput.java Source code

Java tutorial

Introduction

Here is the source code for org.qnot.passtab.PDFOutput.java

Source

/*
 * Copyright (C) 2011  Andrew E. Bruno <aeb@qnot.org>
 *
 * This file is part of passtab.
 *
 * passtab is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * passtab 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with passtab.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.qnot.passtab;

import java.io.IOException;
import java.io.OutputStream;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class PDFOutput implements OutputFormat {
    private static String FONT_MONOSPACE = "org/qnot/passtab/fonts/DejaVuSansMono.ttf";
    private static String FONT_MONOSPACE_BOLD = "org/qnot/passtab/fonts/DejaVuSansMono-Bold.ttf";
    private static int CELL_WIDTH = 15;
    private static float DEFAULT_FONT_SIZE = 12f;

    private boolean withColor;
    private Font font;
    private Font fontBold;

    public PDFOutput() {
        this(true);
    }

    public PDFOutput(boolean withColor) {
        this.withColor = withColor;

        try {
            font = new Font(BaseFont.createFont(PDFOutput.FONT_MONOSPACE, BaseFont.IDENTITY_H, BaseFont.EMBEDDED));
            fontBold = new Font(
                    BaseFont.createFont(PDFOutput.FONT_MONOSPACE_BOLD, BaseFont.IDENTITY_H, BaseFont.EMBEDDED));
        } catch (Exception e) {
            try {
                font = new Font(BaseFont.createFont());
                fontBold = new Font(BaseFont.createFont());
            } catch (Exception ignored) {
            }
        }

        font.setSize(DEFAULT_FONT_SIZE);
        fontBold.setSize(DEFAULT_FONT_SIZE);
    }

    public void output(OutputStream out, TabulaRecta tabulaRecta) throws IOException {
        try {
            createPDF(out, tabulaRecta.asStringArray());
        } catch (DocumentException e) {
            throw new IOException("failed to create pdf file: " + e.getMessage(), e);
        }
    }

    private void createPDF(OutputStream out, String[][] array) throws IOException, DocumentException {
        Document document = new Document(PageSize.LETTER.rotate());
        PdfWriter.getInstance(document, out);
        document.open();

        PdfPTable table = new PdfPTable(array[0].length);
        table.setTotalWidth((float) array.length * PDFOutput.CELL_WIDTH);
        table.setLockedWidth(true);
        table.setHorizontalAlignment(Element.ALIGN_CENTER);

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                addCell(table, array[i][j], (j % 2) != 0, (i % 2) != 0, j == 0, i == 0);
            }
        }

        document.add(table);
        document.close();
    }

    private void addCell(PdfPTable table, String str, boolean bold, boolean fill, boolean rightBorder,
            boolean bottomBorder) {
        Phrase phrase = withColor ? new Phrase(str, bold ? fontBold : font) : new Phrase(str, font);

        PdfPCell cell = new PdfPCell(phrase);

        cell.setBorder(Rectangle.NO_BORDER);
        cell.setPadding(0f);
        cell.setPaddingTop(2f);

        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);

        if (rightBorder) {
            cell.setBorderWidthRight(1f);
            cell.setPaddingRight(3f);
            cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        }
        if (bottomBorder) {
            cell.setBorderWidthBottom(1f);
            cell.setPaddingBottom(3f);
        }

        if (fill && this.withColor) {
            cell.setGrayFill(0.80f);
        }

        table.addCell(cell);
    }
}