mobac.program.atlascreators.PaperAtlasPdf.java Source code

Java tutorial

Introduction

Here is the source code for mobac.program.atlascreators.PaperAtlasPdf.java

Source

/*******************************************************************************
 * Copyright (c) MOBAC developers
 * 
 * This program 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 2 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package mobac.program.atlascreators;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import mobac.exceptions.MapCreationException;
import mobac.program.ProgramInfo;
import mobac.program.annotations.AtlasCreatorName;
import mobac.program.model.UnitSystem;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;

@AtlasCreatorName(value = "Paper Atlas (PDF)")
public class PaperAtlasPdf extends PaperAtlas {

    private Document document;

    public PaperAtlasPdf() {
        super(false);
    }

    private Document createDocument(Rectangle r) throws MapCreationException {
        File pdfFile = new File(getLayerFolder(), map.getName() + ".pdf");
        float left = (float) s.marginLeft;
        float right = (float) s.marginRight;
        float top = (float) s.marginTop;
        float bottom = (float) s.marginBottom;
        Document document = new Document(r, left, right, top, bottom);
        PdfWriter pdfWriter;
        try {
            pdfFile.createNewFile();
            pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
        } catch (IOException e) {
            throw new MapCreationException(map, e);
        } catch (DocumentException e) {
            throw new MapCreationException(map, e);
        }
        pdfWriter.setCompressionLevel(s.compression);
        document.open();
        document.addAuthor(ProgramInfo.PROG_NAME);
        document.addCreationDate();
        document.addCreator(ProgramInfo.PROG_NAME);
        document.addProducer();
        return document;
    }

    @Override
    public void createMap() throws MapCreationException, InterruptedException {

        if (s.paperSize != null) {
            document = createDocument(s.paperSize.createRectangle());
        }

        try {
            super.createMap();
        } finally {
            try {
                document.close();
            } catch (Exception e) {
                new MapCreationException(map, e);
            }
            document = null;
        }
    }

    @Override
    protected void processPage(BufferedImage image, int pageNumber) throws MapCreationException {
        int imageWidth = image.getWidth();
        int imageHeight = image.getHeight();

        if (document == null) {
            double width = UnitSystem.pixelsToPoints(imageWidth, s.dpi);
            double height = UnitSystem.pixelsToPoints(imageHeight, s.dpi);
            width += s.marginLeft + s.marginRight;
            height += s.marginTop + s.marginBottom;
            Rectangle r = new Rectangle((float) width, (float) height);
            document = createDocument(r);
        }

        Image iTextImage;
        try {
            iTextImage = Image.getInstance(image, Color.WHITE);
        } catch (BadElementException e) {
            throw new MapCreationException(map, e);
        } catch (IOException e) {
            throw new MapCreationException(map, e);
        }
        iTextImage.setCompressionLevel(s.compression);
        iTextImage.setDpi(s.dpi, s.dpi);

        float width = (float) UnitSystem.pixelsToPoints(imageWidth, s.dpi);
        float height = (float) UnitSystem.pixelsToPoints(imageHeight, s.dpi);
        iTextImage.scaleAbsolute(width, height);

        try {
            document.add(iTextImage);
        } catch (DocumentException e) {
            throw new MapCreationException(map, e);
        }
        document.newPage();
    }

}