Package it.eng.spagobi.engines.exporters

Source Code of it.eng.spagobi.engines.exporters.ChartExporter

package it.eng.spagobi.engines.exporters;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;

import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.PdfWriter;

/**
*
* @author giachino (antonella.giachino@eng.it)
*
* This class is intended to take the result of a Chart Execution and giveBack an export in other formats
*
*
*/

public class ChartExporter
{

  private static transient Logger logger = Logger.getLogger("ChartExporter");
  private static int MAX_NUM_IMG = 5;
  private static String HORIZONTAL_ORIENTATION = "horizontal";

  public static final int MAX_WIDTH = 550;
  public static final int MAX_HEIGHT = 800;

  public File getChartPDF(String uuid, boolean multichart, String orientation)
  throws Exception
  {
    logger.debug("IN");

    File tmpFile;

    try{
      tmpFile = null;
      String dir = System.getProperty("java.io.tmpdir");
      String path = (new StringBuilder(String.valueOf(dir))).append("/").append(uuid).append(".png").toString();
      File dirF = new File(dir);
      tmpFile = File.createTempFile("tempPDFExport", ".pdf", dirF);
      Document pdfDocument = new Document();
      PdfWriter docWriter = PdfWriter.getInstance(pdfDocument, new FileOutputStream(tmpFile));
      //pdfDocument.open();
      if(multichart)
      {
        pdfDocument.open();

        List images = new ArrayList();
        for(int i = 0; i < MAX_NUM_IMG; i++)
        {
          String imgName = (new StringBuilder(String.valueOf(path.substring(0, path.indexOf(".png"))))).append(i).append(".png").toString();
          Image png = Image.getInstance(imgName);
          if(png == null)
          {
            break;
          }
          images.add(png);
        }

        Table table = new Table(images.size());
        for(int i = 0; i < images.size(); i++)
        {
          Image png = (Image)images.get(i);
          if(HORIZONTAL_ORIENTATION.equalsIgnoreCase(orientation))
          {
            Cell pngCell = new Cell(png);
            pngCell.setBorder(0);
            table.setBorder(0);
            table.addCell(pngCell);
          } else
          {
            png.setAlignment(5);
            pdfDocument.add(png);
          }
        }

        pdfDocument.add(table);
      } else
      {
        Image jpg = Image.getInstance(path);
        float height = jpg.getHeight();
        float width = jpg.getWidth();

        // if in need to change layout
        if(width > MAX_WIDTH || height > MAX_HEIGHT){
          changeLayout(pdfDocument, jpg, width, height);
        }

        pdfDocument.open();
        pdfDocument.add(jpg);
      }
      pdfDocument.close();
      docWriter.close();

      logger.debug("OUT");

      return tmpFile;

    } catch(Throwable e) {
      logger.error("An exception has occured", e);
      throw new Exception(e);
    } finally {

      //tmpFile.delete();

    }
  }

  /** check if the image has to be turned or resize
   *
   * @param document
   * @param jpg
   * @return if the image has been turned
   */

  public void changeLayout(Document pdfDocument, Image jpg, float width, float height){
    logger.debug("IN");
    // if width is more than 600 and height is not more it suffices to turn the image of the chart
    if(width > MAX_WIDTH && ! (height > MAX_WIDTH) && !(width > MAX_HEIGHT)){
      pdfDocument.setPageSize(PageSize.LETTER.rotate());
      logger.debug("pdf rotation");
    }
    else{
      // otherwise the chart needs to be scaled (if width > height also turn!)
      // SCALED WITH turning
      if(width > height){
        pdfDocument.setPageSize(PageSize.LETTER.rotate());
        // calculate wich size is to reduce most:
        float percentageToReduceHeight = 0;
        float percentageToReduceWidth = 0;
        if(height > MAX_WIDTH) {
          percentageToReduceHeight = (height * 100 ) / MAX_WIDTH;
        }
        if(width > MAX_HEIGHT) {
          percentageToReduceWidth = (width * 100 ) / MAX_HEIGHT;
        }
        float percToReduce = percentageToReduceHeight > percentageToReduceWidth ? percentageToReduceHeight : percentageToReduceWidth;
        float percToScale = percToReduce - 100;
        //            float newHeight = height - ((height/100)*percToReduce);
//        float newWidth = width - ((width/100)*percToReduce);
        logger.debug("pdf scale of percentage "+percToScale);
        jpg.scalePercent(percToScale);

        logger.debug("pdf rotation and scaling");
      }
      else{
        // SCALED WITHOUT turning
        // calculate wich size is to reduce most:
        float percentageToReduceHeight = 0;
        float percentageToReduceWidth = 0;
        if(height > MAX_HEIGHT) {
          percentageToReduceHeight = (height * 100 ) / MAX_HEIGHT;
        }
        if(width > MAX_WIDTH) {
          percentageToReduceWidth = (width * 100 ) / MAX_WIDTH;
        }
        float percToReduce = percentageToReduceHeight > percentageToReduceWidth ? percentageToReduceHeight : percentageToReduceWidth;
        float percToScale = percToReduce - 100;
        //            float newHeight = height - ((height/100)*percToReduce);
//        float newWidth = width - ((width/100)*percToReduce);
        logger.debug("pdf scale of percentage "+percToScale);
        jpg.scalePercent(percToScale);
        logger.debug("pdf scaling");
      }
    }
    logger.debug("OUT");
  }



}
TOP

Related Classes of it.eng.spagobi.engines.exporters.ChartExporter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.