org.activityinfo.server.report.renderer.itext.RtfReportRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.activityinfo.server.report.renderer.itext.RtfReportRenderer.java

Source

package org.activityinfo.server.report.renderer.itext;

/*
 * #%L
 * ActivityInfo Server
 * %%
 * Copyright (C) 2009 - 2013 UNICEF
 * %%
 * 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 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 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/gpl-3.0.html>.
 * #L%
 */

import com.google.code.appengine.awt.Dimension;
import com.google.code.appengine.awt.Graphics2D;
import com.google.code.appengine.awt.image.BufferedImage;
import com.google.code.appengine.imageio.ImageIO;
import com.google.inject.Inject;
import com.lowagie.text.*;
import com.lowagie.text.rtf.RtfWriter2;
import org.activityinfo.server.geo.AdminGeometryProvider;
import org.activityinfo.server.report.generator.MapIconPath;
import org.activityinfo.server.report.renderer.image.ImageCreator;
import org.activityinfo.server.report.renderer.image.ItextGraphic;
import org.freehep.graphicsio.emf.EMFGraphics2D;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;

/**
 * iText ReportRenderer targeting Rich Text Format (RTF) output
 */
public class RtfReportRenderer extends ItextReportRenderer {

    @Inject
    public RtfReportRenderer(AdminGeometryProvider geometryProvider, @MapIconPath String mapIconPath) {
        super(geometryProvider, mapIconPath);
    }

    @Override
    protected DocWriter createWriter(Document document, OutputStream os) {
        return RtfWriter2.getInstance(document, os);
    }

    @Override
    public String getMimeType() {
        return "application/rtf";
    }

    @Override
    public String getFileSuffix() {
        return ".rtf";
    }

    @Override
    protected void renderFooter(Document document) {
        HeaderFooter footer = new HeaderFooter(new Phrase("Page", ThemeHelper.footerFont()), true);
        document.setFooter(footer);
    }

    @Override
    protected ImageCreator getImageCreator() {
        return new RtfImageCreator();
    }

    private static class RtfImageCreator implements ImageCreator {

        @Override
        public EmfImage create(int width, int height) {
            return new EmfImage(width, height);
        }

        @Override
        public PngImage createMap(int width, int height) {
            return new PngImage(width, height);
        }
    }

    private static class PngImage implements ItextGraphic {

        private final BufferedImage image;
        private final Graphics2D g2d;

        public PngImage(int width, int height) {
            image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            g2d = image.createGraphics();
        }

        @Override
        public Graphics2D getGraphics() {
            return g2d;
        }

        @Override
        public Image toItextImage() throws BadElementException {
            try {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ImageIO.write(image, "png", baos);
                Image itextImage = Image.getInstance(baos.toByteArray());
                itextImage.scalePercent(72f / 92f * 100f);

                // itextImage.setDpi(dpiX, dpiY)
                return itextImage;
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public void addImage(String imageUrl, int x, int y, int width, int height) {
            BufferedImage image;
            try {
                image = ImageIO.read(new URL(imageUrl));
                g2d.drawImage(image, x, y, null);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

    private static class EmfImage implements ItextGraphic {
        private int width;
        private int height;
        private final EMFGraphics2D g2d;
        private ByteArrayOutputStream baos;

        public EmfImage(int width, int height) {
            this.width = width;
            this.height = height;

            baos = new ByteArrayOutputStream();
            g2d = new EMFGraphics2D(baos, new Dimension(width, height));
            g2d.startExport();
        }

        @Override
        public Graphics2D getGraphics() {
            return g2d;
        }

        @Override
        public Image toItextImage() throws BadElementException {
            g2d.endExport();
            try {
                return new ImgEMF(baos.toByteArray(), width, height);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public void addImage(String imageUrl, int x, int y, int width, int height) {
            throw new UnsupportedOperationException();
        }
    }
}