Package com.drighetto.fop.essai.servlet

Source Code of com.drighetto.fop.essai.servlet.PDFGeneratorWithJS

package com.drighetto.fop.essai.servlet;

import com.lowagie.text.Document;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.servlet.ServletContextURIResolver;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.sax.SAXResult;

/**
* Servlet generating a PDF stream with JS code included
*
* @author Dominique RIGHETTO<br>
*         18 sept. 07<br>
*/
public class PDFGeneratorWithJS extends HttpServlet implements Servlet {
  /**
   * Serial version ID
   */
  private static final long serialVersionUID = 1L;

  /** FOP Factory */
  private FopFactory fopFactory = FopFactory.newInstance();

  /** XML Transformer */
  private TransformerFactory tFactory = TransformerFactory.newInstance();

  /** URIResolver for use by this servlet */
  private URIResolver uriResolver = null;

  /**
   * @see javax.servlet.GenericServlet#init()
   *
   * {@inheritDoc}
   */
  @Override
  public void init() {
    // Get FOP URI resolver for web resource access
    this.uriResolver = new ServletContextURIResolver(getServletContext());
    // Set URI resolver for the FOP Factory and the XML transformer
    this.fopFactory.setURIResolver(this.uriResolver);
    this.tFactory.setURIResolver(this.uriResolver);
  }

  /**
   * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
   *      HttpServletResponse response)
   *
   * {@inheritDoc}
   */
  @SuppressWarnings("boxing")
  @Override
  protected void doGet(HttpServletRequest request,
      HttpServletResponse response) throws ServletException {
    ByteArrayOutputStream fopout = new ByteArrayOutputStream();
    long start = System.currentTimeMillis();

    try {
      // Generate a PDF stream to the ByteArrayOutputStream using FOP
      System.out.printf("-> PDFGeneratorWithJS:Request from [%s]\n",
          request.getRemoteAddr());
      response.setContentType("application/pdf");
      Fop fop = this.fopFactory.newFop(MimeConstants.MIME_PDF, fopout);
      Transformer transformer = this.tFactory.newTransformer();
      transformer.setURIResolver(this.uriResolver);
      Source src = this.uriResolver.resolve(
          "servlet-context:/xsl-fo/simple.fo", null);
      Result res = new SAXResult(fop.getDefaultHandler());
      transformer.transform(src, res);

      // Add Javascript code using iText to read/update PDF stream
      // --Create a reader and a writer to tranfer/update content
      PdfReader reader = new PdfReader(fopout.toByteArray());
      Document document = new Document(reader.getPageSizeWithRotation(1));
      PdfWriter writer = PdfWriter.getInstance(document, response
          .getOutputStream());
      // --Tranfer content
      int n = reader.getNumberOfPages();
      document.open();
      PdfContentByte cb = writer.getDirectContent();
      PdfImportedPage page;
      int rotation;
      int i = 0;
      while (i < n) {
        i++;
        document.setPageSize(reader.getPageSizeWithRotation(i));
        document.newPage();
        page = writer.getImportedPage(reader, i);
        rotation = reader.getPageRotation(i);
        if (rotation == 90 || rotation == 270) {
          cb.addTemplate(page, 0, -1f, 1f, 0, 0, reader
              .getPageSizeWithRotation(i).getHeight());
        } else {
          cb.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
        }
        System.out.printf("Processed page %s\n", i);
      }
      // --Add JS code
      writer
          .addJavaScript(
              "this.print({bUI: false, bSilent: true, bShrinkToFit: true});",
              false);
      // --Close document and stream
      document.close();
      writer.close();
      reader.close();
      System.out.printf("Generated in %s ms\n", (System
          .currentTimeMillis() - start));
    } catch (Exception e) {
      throw new ServletException(e);
    }
  }

  /**
   * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
   *      HttpServletResponse response)
   *
   * {@inheritDoc}
   */
  @Override
  protected void doPost(HttpServletRequest request,
      HttpServletResponse response) throws ServletException {
    this.doGet(request, response);
  }
}
TOP

Related Classes of com.drighetto.fop.essai.servlet.PDFGeneratorWithJS

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.