==========renderfilter.java
package filter;
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 java.io.Writer;
import javax.imageio.ImageIO;import javax.servlet.Filter;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.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;
import org.apache.batik.svggen.SVGGeneratorContext;import org.apache.batik.svggen.SVGGraphics2D;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;
public class RendererFilter implements Filter {
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(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; //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(response); filterChain.doFilter(request,capContent); try { //Parse the XHTML content to a document that is readable by the XHTML renderer. StringReader contentReader = new StringReader(capContent.getContent()); InputSource source = new InputSource(contentReader); Document xhtmlContent = documentBuilder.parse(source); if(renderType.equals("pdf")){ ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(xhtmlContent,""); 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*/} Graphics2DRenderer renderer = new Graphics2DRenderer(); renderer.setDocument(xhtmlContent,""); if(renderType.equals("image")){ 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); //Now finally output the image to PNG using the ImageIO libraries. OutputStream browserStream = response.getOutputStream(); response.setContentType("image/png"); ImageIO.write(image, "png", browserStream); return; } if(renderType.equals("svg")){
Document svgDocument = documentBuilder.newDocument(); BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics2D layoutGraphics = (Graphics2D)image.getGraphics(); // Create an instance of the SVG Generator SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(svgDocument); ctx.setEmbeddedFontsOn(true); ctx.setPrecision(12); SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx,false);
renderer.layout(layoutGraphics,new Dimension(width,height)); renderer.render(svgGenerator); // Finally, stream out SVG to the browser response.setContentType("image/svg+xml"); Writer browserOutput = response.getWriter(); svgGenerator.stream(browserOutput, true); return; } } catch (SAXException e) { throw new ServletException(e); } catch (DocumentException e) { throw new ServletException(e); } }else{ //Normal processing filterChain.doFilter(request,response); } }
public void destroy() { }}
=============ContentCaptureServletResponse.java
package filter;
import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;
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(){ writer.flush(); String xhtmlContent = new String(contentBuffer.toByteArray()); xhtmlContent = xhtmlContent.replaceAll("<thead>|</thead>|"+ "<tbody>|</tbody>",""); return xhtmlContent; }}