PDFSheetRenderer.java

00001 package edu.stanford.hci.r3.render.sheets;
00002 
00003 import java.awt.Graphics2D;
00004 import java.awt.geom.AffineTransform;
00005 import java.io.File;
00006 import java.io.FileNotFoundException;
00007 import java.io.FileOutputStream;
00008 import java.io.IOException;
00009 import java.util.List;
00010 
00011 import com.lowagie.text.DocumentException;
00012 import com.lowagie.text.pdf.PdfContentByte;
00013 import com.lowagie.text.pdf.PdfReader;
00014 import com.lowagie.text.pdf.PdfStamper;
00015 
00016 import edu.stanford.hci.r3.paper.Region;
00017 import edu.stanford.hci.r3.paper.sheets.PDFSheet;
00018 import edu.stanford.hci.r3.render.SheetRenderer;
00019 import edu.stanford.hci.r3.units.coordinates.Coordinates;
00020 import edu.stanford.hci.r3.util.DebugUtils;
00021 import edu.stanford.hci.r3.util.graphics.GraphicsUtils;
00022 
00033 public class PDFSheetRenderer extends SheetRenderer {
00034 
00038         private PDFSheet pdfSheet;
00039 
00043         public PDFSheetRenderer(PDFSheet s) {
00044                 super(s);
00045                 pdfSheet = s;
00046         }
00047 
00058         public void renderToG2D(Graphics2D g2d) {
00059                 /*
00060                 // TODO: FIX THIS AT SOME POINT...
00061                 // render the PDF to the g2d's background (do we need to do this? since we are using a stamper???)
00062                 PdfReader reader = pdfSheet.getReader();
00063 
00064                 // deleted some code from here... about PDF Imported Page
00065 
00066                 // call the super's renderToG2D to paint all the other regions
00067                 //DebugUtils.println("Commented Out Super.RenderToG2D"); //(uncommented, obviously)
00068                 super.renderToG2D(g2d);
00069                 */
00070                 
00071                 // anti-aliased, high quality rendering
00072                 g2d.setRenderingHints(GraphicsUtils.getBestRenderingHints());
00073 
00074                 final List<Region> regions = sheet.getRegions();
00075 
00076                 // render each region
00077                 for (Region r : regions) {
00078                         if (r.isActive()) continue;
00079                         // Weird. g2d.getTransform SHOULD give us a copy....
00080                         // a real copy
00081                         final AffineTransform currTransform = new AffineTransform(g2d.getTransform());
00082                         DebugUtils.println("Rendering " + r.getName());
00083                         final Coordinates regionOffset = sheet.getRegionOffset(r);
00084                         final double xOffsetPts = regionOffset.getX().getValueInPoints();
00085                         final double yOffsetPts = regionOffset.getY().getValueInPoints();
00086                         // System.out.println(xOffsetPts);
00087                         // g2d.transform(AffineTransform.getTranslateInstance(xOffsetPts, yOffsetPts));
00088                         g2d.translate((int) xOffsetPts, (int) yOffsetPts);
00089                         r.getRenderer().renderToG2D(g2d);
00090                         g2d.setTransform(currTransform);
00091                 }
00092         }
00093 
00100         public void renderToPDF(File destPDFFile) {
00101                 try {
00102                         final FileOutputStream fileOutputStream = new FileOutputStream(destPDFFile);
00103 
00104                         final PdfReader reader = pdfSheet.getReader();
00105                         DebugUtils.println("NumPages in Existing PDF: " + reader.getNumberOfPages());
00106 
00107                         // allows us to stamp on top of an existing PDF
00108                         final PdfStamper stamp = new PdfStamper(reader, fileOutputStream);
00109 
00110                         // change the content on top of page 1
00111                         // bottom layer for regions
00112                         final PdfContentByte topLayer = stamp.getOverContent(1 /* page number */);
00113                         final PdfContentByte bottomLayer = stamp.getUnderContent(1);
00114                         renderToPDFContentLayers(destPDFFile, topLayer, bottomLayer);
00115                         stamp.close();
00116                         
00117                         // save the pattern info to the same directory automatically
00118                         savePatternInformation(); // do this automatically
00119                 } catch (FileNotFoundException e) {
00120                         e.printStackTrace();
00121                 } catch (DocumentException e) {
00122                         e.printStackTrace();
00123                 } catch (IOException e) {
00124                         e.printStackTrace();
00125                 }
00126         }
00127 }

Generated on Sat Apr 14 18:21:37 2007 for R3 Paper Toolkit by  doxygen 1.4.7