Java da Web Sayfalarını PDF ve Image Formatına Çevirme

Web uygulamalarında PDF ile çıktı üretmek zaman alabilen bir iş olabiliyor. Seam içerisinde pdf ile ilgili hali hazırda bir kütüphane bulunmakta ancak yinede istediğimiz gibi sonuçlar elde edebilmek bazen imkansız duruma gelebiliyor.

Java Seam PDF

JSF ve PDF Üretimi

Bu durumda aşağıdaki örnek işinizi görecektir. Bu örnekte herhangi bir web sayfasını bir servlet filter aracılığı ile parametrik olarak pdf ve image formatlarına çevirebiliyorsunuz.

Buradaki uygulama seam ortamına göre hazırlanmıştır. İsterseniz standart servlet operasyonlarında da çıktılar üretebilirsiniz. Bu durumda filter tanımlarını web.xml içerisinde yapmanız gerekiyor.

 

 

Kullanım olarak aşağıdaki kodları ekledikten sonra pdf çağırımlarında aşağıdaki gibi bir link olmalı
http://localhost:8080/mergecons/home.seam?RenderOutputType=image

Resim çağırımlarında ise ister aşağıdaki gibi bir çıktı yaratabilir.
http://localhost:8080/mergecons/home.seam?RenderOutputType=image

İsterseniz de üreteceğiniz resmin boyutlarını verebilirsiniz.
http://localhost:8080/mergecons/home.seam?RenderOutputType=image&height=900&width=800

Ortamı hazırlamak için öncelikle ilgili kütüphanelere ihtiyacınız var.
core-renderer.jar
dom4j.jar
itext-2.0.8.jar
nekohtml.jar
xercesImpl-2.9.1.jar
xml-apis.jar

Ben bunları her ihtimale karşı aşağıdaki linke ekledim.

http://www.mergecons.com/downloads/java-pdf.rar

Umarim faydalı bir uygulama olur.

package com.mergecons.otelrezervasyon.session;
     
    import static org.jboss.seam.ScopeType.APPLICATION;
    import static org.jboss.seam.annotations.Install.BUILT_IN;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.StringReader;
     
    import javax.imageio.ImageIO;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpUtils;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.TransformerException;
     
    import org.jboss.seam.annotations.Install;
    import org.jboss.seam.annotations.Name;
    import org.jboss.seam.annotations.Scope;
    import org.jboss.seam.annotations.intercept.BypassInterceptors;
    import org.jboss.seam.annotations.web.Filter;
    import org.jboss.seam.web.AbstractFilter;
    import org.w3c.dom.Document;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    import org.xhtmlrenderer.simple.Graphics2DRenderer;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
     
    import com.lowagie.text.DocumentException;
     
    @Scope(APPLICATION)
    @Install(precedence = BUILT_IN, classDependencies="javax.faces.context.FacesContext")
    @BypassInterceptors
    @Filter(around="org.jboss.seam.web.ajax4jsfFilter")
    @Name("RendererFilter")
    public class RendererFilter extends AbstractFilter {
     
       FilterConfig config;
       private DocumentBuilder documentBuilder;
     
       public void init(FilterConfig config) throws ServletException {
          try {
             this.config = config;
             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
             documentBuilder = factory.newDocumentBuilder();
          } catch (ParserConfigurationException e) {
             throw new ServletException(e);
          }
       }
     
       public void doFilter(final ServletRequest request, final ServletResponse response,
                            final FilterChain chain) throws IOException, ServletException {
     
          HttpServletRequest req = (HttpServletRequest) request;
          HttpServletResponse resp = (HttpServletResponse) response;
     
          //Check to see if this filter should apply.
          String renderType = request.getParameter("RenderOutputType");
          if (renderType != null) {
             //Capture the content for this request
             ContentCaptureServletResponse capContent = new ContentCaptureServletResponse(resp);
             chain.doFilter(request, capContent);
     
             try {
                //Parse the XHTML content to a document that is readable by the XHTML renderer.
                StringReader contentReader = null;
                try {
                   contentReader = new StringReader(capContent.getContent());
                } catch (TransformerException e) {
                   e.printStackTrace();
                }
                InputSource source = new InputSource(contentReader);
                Document xhtmlContent = documentBuilder.parse(source);
                /*NaiveUserAgent nua = new NaiveUserAgent();
                nua.setBaseURL(null);*/
                if (renderType.equals("pdf")) {
                   //PDFRenderer pdfr = new PDFRenderer(nua);
                   ITextRenderer renderer = new ITextRenderer();
    //
     
                   String baseURL = (HttpUtils.getRequestURL(req)).toString();
                   String self = baseURL.substring(0, baseURL.lastIndexOf("/") + 1);
     
                   renderer.setDocument(xhtmlContent, self);
                   renderer.layout();
     
                   response.setContentType("application/pdf");
                   OutputStream browserStream = response.getOutputStream();
                   renderer.createPDF(browserStream);
                   return;
                }
     
                //For the other formats, you might need to specify a width and a height.
                int width = 850;
                int height = 500;
     
                try{
                   if(request.getParameter("width") != null) width = Integer.parseInt(request.getParameter("width"));
                   if(request.getParameter("height") != null) height = Integer.parseInt(request.getParameter("height"));
                }catch(NumberFormatException ne){ /*Nothing much to do here*/}
     
                if (renderType.equals("image")) {
                   Graphics2DRenderer renderer = new Graphics2DRenderer();
     
                   String baseURL = (HttpUtils.getRequestURL(req)).toString();
                   String self = baseURL.substring(0, baseURL.lastIndexOf("/") + 1);
     
                   renderer.setDocument(xhtmlContent, self);
     
                   BufferedImage image = new BufferedImage(width, height,
                           BufferedImage.TYPE_INT_RGB);
                   Graphics2D imageGraphics = (Graphics2D) image.getGraphics();
                   imageGraphics.setColor(Color.white);
                   imageGraphics.fillRect(0, 0, width, height);
                   renderer.layout(imageGraphics, new Dimension(width, height));
                   renderer.render(imageGraphics);
     
                   OutputStream browserStream = response.getOutputStream();
                   response.setContentType("image/png");
                   ImageIO.write(image, "png", browserStream);
                   return;
                }
     
             } catch (SAXException e) {
                throw new ServletException(e);
             } catch (DocumentException e) {
                throw new ServletException(e);
             }
     
          } else {
             //Normal processing
             chain.doFilter(request, response);
          }
     
       }
     
       public void destroy() {
       }
    }
package com.mergecons.otelrezervasyon.session;
     
    import static org.jboss.seam.ScopeType.APPLICATION;
     
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringReader;
    import java.io.StringWriter;
     
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
     
    import org.cyberneko.html.parsers.DOMParser;
    import org.jboss.seam.annotations.Name;
    import org.jboss.seam.annotations.Scope;
    import org.w3c.dom.Document;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
     
    @Scope(APPLICATION)
    @Name("ContentCaptureServletResponse")
    public class ContentCaptureServletResponse extends HttpServletResponseWrapper {
     
     private ByteArrayOutputStream contentBuffer;
     private PrintWriter writer;
     
     public ContentCaptureServletResponse(HttpServletResponse originalResponse) {
      super(originalResponse);
     }
     
     @Override
     public PrintWriter getWriter() throws IOException {
      if (writer == null) {
       contentBuffer = new ByteArrayOutputStream();
       writer = new PrintWriter(contentBuffer);
      }
      return writer;
     }
     
     public String getContent() throws IOException, SAXException,
       TransformerException {
      getWriter();
      writer.flush();
      String xhtmlContent = new String(contentBuffer.toByteArray());
      xhtmlContent = xhtmlContent.replaceAll("
    |
     
    |"
        + "
    |
     
     
    ", "");
     
      DOMParser parser = new DOMParser();
     
      parser.setFeature("http://cyberneko.org/html/features/balance-tags",
        true);
      parser.setProperty("http://cyberneko.org/html/properties/names/elems",
        "lower");
      parser.setFeature(
        "http://cyberneko.org/html/features/override-namespaces", true);
      parser.setFeature(
        "http://cyberneko.org/html/features/insert-namespaces", true);
      parser.setProperty(
        "http://cyberneko.org/html/properties/namespaces-uri",
        "http://www.w3.org/1999/xhtml");
     
      parser.parse(new InputSource(new StringReader(xhtmlContent)));
     
      Document node = parser.getDocument();
     
      StringWriter sw = new StringWriter();
      Transformer t = TransformerFactory.newInstance().newTransformer();
      t.setOutputProperty(OutputKeys.METHOD, "xml");
      t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
      t.transform(new DOMSource(node), new StreamResult(sw));
      xhtmlContent = sw.toString();
      return xhtmlContent;
     }
    }
Jun 28th, 2011
  1. yakup
    Jun 29th, 2011 at 19:24 | #1
  2. Jun 29th, 2011 at 22:29 | #2

    Düzelttim uyari icin tesekkurler ;)

  3. Hakan Aslım
    Aug 18th, 2011 at 13:22 | #3

    Merhaba, sayfamın içindeki Türkçe karakterleri PDF içinde göstermiyor.

  4. Aug 22nd, 2011 at 08:22 | #4

    Aslinda ilgili karakter set i eklemek gerekiyor

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>