/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ package tufts.vue; import java.awt.Color; import java.awt.Dimension; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import tufts.Util; import tufts.vue.gui.GUI; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.FontFactory; import com.lowagie.text.Image; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.FontMapper; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfGraphics2D; import com.lowagie.text.pdf.PdfName; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfTemplate; import com.lowagie.text.pdf.PdfWriter; import edu.tufts.vue.pdf.VueFontMapper; public class PresentationNotes { private static final org.apache.log4j.Logger Log = org.apache.log4j.Logger.getLogger(PresentationNotes.class); private static FontMapper dfm = null; private static FontMapper getFontMapper() { if (dfm != null) return dfm; else { dfm = new VueFontMapper(); if (Util.isWindowsPlatform()) { String drive = System.getenv("HOMEDRIVE"); String path = drive + "\\Windows\\Fonts\\"; ((VueFontMapper) dfm).insertDirectory(path); FontFactory.registerDirectory(path); } else if (Util.isMacPlatform()) { ((VueFontMapper) dfm).insertDirectory("/Library/Fonts/"); FontFactory.registerDirectory("/Library/Fonts/"); ((VueFontMapper) dfm).insertDirectory("/System/Library/Fonts/"); FontFactory.registerDirectory("/SystemLibrary/Fonts/"); } return dfm; } } public static void createMapAsPDF (File file) { createMapAsPDF(file,VUE.getActiveMap()); } public static void createMapAsPDF(File file, LWMap map) { // step 1: creation of a document-object Document document = new Document(PageSize.LETTER.rotate()); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); // writer.setStrictImageSequence(true); // step 3: we open the document document.open(); PdfContentByte cb = writer.getDirectContent(); // cb.setFontAndSize(arg0, arg1) PdfTemplate tp = cb.createTemplate(document.getPageSize().getWidth()-70, document.getPageSize().getHeight()-70); // tp.createGraphicsShapes(arg0, arg1) PdfGraphics2D g2d = (PdfGraphics2D)tp.createGraphics(document.getPageSize().getWidth()-70, document.getPageSize().getHeight()-70, getFontMapper(),false,60.0f); Dimension page = new Dimension((int)document.getPageSize().getWidth()-70,(int)document.getPageSize().getHeight()-70); // compute zoom & offset for visible map components Point2D.Float offset = new Point2D.Float(); offset.x=35; offset.y=35; // center vertically only if landscape mode //if (format.getOrientation() == PageFormat.LANDSCAPE) //TODO: allow horizontal centering, but not vertical centering (handle in computeZoomFit) Rectangle2D bounds = map.getBounds(); double scale = ZoomTool.computeZoomFit(page, 5, bounds, offset, true); // System.out.println(scale + " zoom factor..."); // set up the DrawContext DrawContext dc = new DrawContext(g2d, scale, -offset.x, -offset.y, null, // frame would be the PageFormat offset & size rectangle map, false); // todo: absolute links shouldn't be spec'd here // dc.setAntiAlias(true); dc.setMapDrawing(); // dc.setPDFRender(true); //dc.setPrioritizeQuality(false); // why was this low quality? dc.setPrintQuality(); //dc.setAntiAlias(false); // why was this turned off? was it redundant? dc.setClipOptimized(true); // dc.setDraftQuality(true); // dc.setRawDrawing(); //dc.setClipOptimized(false); dc.setInteractive(false); dc.setDrawPathways(false); // VUE.getActiveMap().draw(dc); LWPathway.setShowSlides(false); map.drawZero(dc); LWPathway.setShowSlides(true); g2d.dispose(); // document.add(new Paragraph(new Chunk().setAnchor("http://www.cnn.com"))); cb.addTemplate(tp,0,0); document.newPage(); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } public static void createPresentationSlidesDeck(File file) { // step 1: creation of a document-object final Document document = new Document(PageSize.LETTER.rotate()); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file final PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); writer.setStrictImageSequence(true); // step 3: we open the document document.open(); final float pageWidth = document.getPageSize().getWidth(); final float pageHeight = document.getPageSize().getHeight(); final float fillWidth = pageWidth - 70; final float fillHeight = pageHeight - 70; if (DEBUG.Enabled) { System.out.println("\n---------------------------------"); System.out.println("PDF DOCUMENT: pageSize " + document.getPageSize()); System.out.println("fillWidth=" + fillWidth + " fillHeight=" + fillHeight); } int currentIndex = VUE.getActivePathway().getIndex(); VUE.getActivePathway().setIndex(-1); for (LWPathway.Entry entry : VUE.getActivePathway().getEntries()) { if (DEBUG.Enabled) Log.debug("\n\nHANDLING DECK ENTRY " + entry); final LWSlide slide = entry.produceSlide(); final LWComponent toDraw = (slide == null ? entry.node : slide); final PdfTemplate template = PdfTemplate.createTemplate(writer, fillWidth, fillHeight); final PdfGraphics2D graphics = (PdfGraphics2D) template.createGraphics(fillWidth, fillHeight, getFontMapper(), false, 60.0f); final DrawContext dc = new DrawContext(graphics, 1.0); // //final DrawContext dc = new DrawContext(graphics, scale); //final DrawContext dc = new DrawContext(graphics, toDraw); // ideally, should use this dc.setClipOptimized(false); dc.setInteractive(false); // should be un-needed dc.setPrintQuality(); // We set dc.focused to the node, which is needed for portals so they know to render contents in their clip-region. // Normally a portal knows to do this because it's the focal (dc.focal), but in this case, the dc.focal could, // at best, be the slide. The current code actually uses NO focal in creating the DrawContext above, // and I'm not changing that just now as that would require lots of regression testing of printing. SMF 6/24/10 dc.focused = entry.node; if (DEBUG.Enabled) { Log.debug("DRAWING INTO " + dc + " g=" + graphics + " clip=" + tufts.Util.fmt(graphics.getClip())); if (DEBUG.PDF) { dc.g.setColor(Color.green); dc.g.fillRect(-Short.MAX_VALUE/2, -Short.MAX_VALUE/2, Short.MAX_VALUE, Short.MAX_VALUE); } } try { if (DEBUG.Enabled) dc.clearDebug(); toDraw.drawFit(dc, 0); } catch (Throwable t) { Log.error("exception drawing " + toDraw, t); } try { if (DEBUG.Enabled) Log.debug("painted " + DrawContext.getDebug() + " to " + dc); if (DEBUG.PDF) { final String dcDesc = dc.toString() + String.format(" scale=%.1f%%", dc.g.getTransform().getScaleX() * 100); dc.setRawDrawing(); dc.g.setColor(Color.red); dc.g.setFont(VueConstants.FixedSmallFont); dc.g.drawString(dcDesc, 10, fillHeight - 27); dc.g.drawString(entry.toString(), 10, fillHeight - 16); dc.g.drawString(toDraw.toString(), 10, fillHeight - 5); } // the graphics dispose appears to be very important -- we've seen completely intermittant // problems with generating many page PDF documents, which would be well explained by // java or internal itext buffers running out of memory. graphics.dispose(); document.add(Image.getInstance(template)); document.newPage(); } catch (Throwable t) { Log.error("exception finishing " + toDraw + " in " + dc, t); } } VUE.getActivePathway().setIndex(currentIndex); if (DEBUG.Enabled) Log.debug("PROCESSED ALL ENTRIES"); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } private static final int SlideSizeX = 230; private static final int SlideSizeY = 172; public static void createPresentationNotes8PerPage(File file) { //page size notes: //martin-top,left,right,bottom = 36 //widht :612 //height : 792 //usable space 540 x 720 // step 1: creation of a document-object Document document = new Document(PageSize.LETTER); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); // writer.setStrictImageSequence(true); // step 3: we open the document document.open(); // PdfPTable table; // PdfPCell cell; int entryCount = 0; int entryOnPage =0; int currentIndex = VUE.getActivePathway().getIndex(); VUE.getActivePathway().setIndex(-1); for (LWPathway.Entry entry : VUE.getActivePathway().getEntries()) { final LWSlide slide = entry.produceSlide(); final LWComponent toDraw = (slide == null ? entry.node : slide); entryCount++; //String label = entry.getLabel(); PdfContentByte cb = writer.getDirectContent(); //cb.cr PdfTemplate tp = cb.createTemplate(SlideSizeX,SlideSizeY); Point2D.Float offset = new Point2D.Float(); Rectangle2D bounds = null; bounds = slide.getBounds(); Dimension page = null; page = new Dimension(SlideSizeX,172); //PdfTemplate tp = cb.createTemplate(document.getPageSize().width()-80, document.getPageSize().height()-80); double scale = ZoomTool.computeZoomFit(page, 5, bounds, offset, true); PdfGraphics2D g2d = (PdfGraphics2D)tp.createGraphics(SlideSizeX,SlideSizeY, getFontMapper(),false,60.0f); DrawContext dc = new DrawContext(g2d, scale, -offset.x, -offset.y, null, // frame would be the PageFormat offset & size rectangle entry.isMapView() ? entry.getFocal() : slide, false); // todo: absolute links shouldn't be spec'd here dc.setClipOptimized(false); dc.setPrintQuality(); //slide.drawZero(dc); toDraw.drawFit(dc, 0); g2d.dispose(); //document.add(Image.getInstance(tp)); if (entryOnPage == 0) { drawSequenceNumber(writer,36,739,entryCount); cb.addTemplate(tp,56, 583); } if (entryOnPage == 1) { drawSequenceNumber(writer,296,739,entryCount); cb.addTemplate(tp,306, 583); } if (entryOnPage == 2) { drawSequenceNumber(writer,36,559,entryCount); cb.addTemplate(tp,56, 403); } if (entryOnPage == 3) { drawSequenceNumber(writer,296,559,entryCount); cb.addTemplate(tp,306, 403); } if (entryOnPage == 4) { drawSequenceNumber(writer,36,375,entryCount); cb.addTemplate(tp,56, 219); } if (entryOnPage == 5) { drawSequenceNumber(writer,296,375,entryCount); cb.addTemplate(tp,306, 219); } if (entryOnPage == 6) { drawSequenceNumber(writer,36,192,entryCount); cb.addTemplate(tp,56, 36); //cb.addTemplate(drawLines(writer),296,18); } if (entryOnPage == 7) { drawSequenceNumber(writer,296,192,entryCount); cb.addTemplate(tp,306, 36); } entryOnPage++; if (entryCount % 8 == 0) { document.newPage(); entryOnPage =0; } } VUE.getActivePathway().setIndex(currentIndex); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } private static PdfTemplate drawLines(PdfWriter writer) { PdfContentByte cb2 = writer.getDirectContent(); //cb.cr PdfTemplate tp2 = cb2.createTemplate(SlideSizeX+40,SlideSizeY); tp2.setColorStroke(Color.gray); //tp2.setColorFill(Color.gray); int x=30; for (int i=1; i < 9; i++) { tp2.moveTo(0, x); tp2.lineTo(SlideSizeX+40, x); tp2.stroke(); x+=20; } return tp2; } private static void drawSequenceNumber(PdfWriter writer, float x, float y, int seq) { PdfContentByte cb = writer.getDirectContent(); try { cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, false), 16); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } cb.beginText(); cb.showTextAligned(Element.ALIGN_CENTER, new Integer(seq).toString()+".", x, y, 0f); cb.endText(); cb.stroke(); //return tp2; } public static void createAudienceNotes(File file) { //page size notes: //martin-top,left,right,bottom = 36 //widht :612 //height : 792 //usable space 540 x 720 // step 1: creation of a document-object Document document = new Document(PageSize.LETTER); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); // writer.setStrictImageSequence(true); // step 3: we open the document document.open(); // PdfPTable table; // PdfPCell cell; int entryCount = 0; int entryOnPage =0; int currentIndex = VUE.getActivePathway().getIndex(); VUE.getActivePathway().setIndex(-1); for (LWPathway.Entry entry : VUE.getActivePathway().getEntries()) { final LWSlide slide = entry.produceSlide(); final LWComponent toDraw = (slide == null ? entry.node : slide); entryCount++; //String label = entry.getLabel(); PdfContentByte cb = writer.getDirectContent(); //cb.cr PdfTemplate tp = cb.createTemplate(SlideSizeX,SlideSizeY); Point2D.Float offset = new Point2D.Float(); // center vertically only if landscape mode //if (format.getOrientation() == PageFormat.LANDSCAPE) //TODO: allow horizontal centering, but not vertical centering (handle in computeZoomFit) Rectangle2D bounds = null; bounds = slide.getBounds(); Dimension page = null; page = new Dimension(SlideSizeX,172); //PdfTemplate tp = cb.createTemplate(document.getPageSize().width()-80, document.getPageSize().height()-80); double scale = ZoomTool.computeZoomFit(page, 5, bounds, offset, true); PdfGraphics2D g2d = (PdfGraphics2D)tp.createGraphics(SlideSizeX,SlideSizeY,getFontMapper(),false,60.0f); DrawContext dc = new DrawContext(g2d, scale, -offset.x, -offset.y, null, // frame would be the PageFormat offset & size rectangle entry.isMapView() ? entry.getFocal() : slide, false); // todo: absolute links shouldn't be spec'd here dc.setClipOptimized(false); dc.setPrintQuality(); toDraw.drawFit(dc,0); g2d.dispose(); //document.add(Image.getInstance(tp)); if (entryOnPage == 0) { drawSequenceNumber(writer,36,739,entryCount); cb.addTemplate(tp,56, 583); cb.addTemplate(drawLines(writer),296,565); } if (entryOnPage == 1) { drawSequenceNumber(writer,36,559,entryCount); cb.addTemplate(tp,56, 403); cb.addTemplate(drawLines(writer),296,385); } if (entryOnPage == 2) { drawSequenceNumber(writer,36,375,entryCount); cb.addTemplate(tp,56, 219); cb.addTemplate(drawLines(writer),296,201); } if (entryOnPage == 3) { drawSequenceNumber(writer,36,192,entryCount); cb.addTemplate(tp,56, 36); cb.addTemplate(drawLines(writer),296,18); } entryOnPage++; if (entryCount % 4 == 0) { document.newPage(); entryOnPage =0; } } VUE.getActivePathway().setIndex(currentIndex); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } public static void createSpeakerNotes1PerPage(File file) { // step 1: creation of a document-object //This is a bit of a mess but because of hte bugs with drawing the slides //the easy way, we have no other choice but to render them directly onto the pdf //which makes it hard to use tables for stuff like formatting text...so we'll render // a blank table cell then render the image into it. Document document = new Document(); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // step 3: we open the document document.open(); PdfPTable table; PdfPCell cell; int currentIndex = VUE.getActivePathway().getIndex(); VUE.getActivePathway().setIndex(-1); for (LWPathway.Entry entry : VUE.getActivePathway().getEntries()) { final LWSlide slide = entry.produceSlide(); final LWComponent toDraw = (slide == null ? entry.node : slide); final String notes = entry.getNotes(); //String label = entry.getLabel(); PdfContentByte cb = writer.getDirectContent(); Point2D.Float offset = new Point2D.Float(); Rectangle2D bounds = null; //if (!entry.isMapView()) bounds = slide.getBounds(); //else //bounds = entry.getFocal().getBounds(); Dimension page = null; page = new Dimension(432,324); PdfTemplate tp = cb.createTemplate(432,324); double scale = ZoomTool.computeZoomFit(page, 5, bounds, offset, true); PdfGraphics2D g2d = (PdfGraphics2D)tp.createGraphics(432,324, getFontMapper(),false,60.0f); DrawContext dc = new DrawContext(g2d, scale, -offset.x, -offset.y, null, // frame would be the PageFormat offset & size rectangle entry.isMapView() ? entry.getFocal() : slide, false); // todo: absolute links shouldn't be spec'd here dc.setClipOptimized(false); dc.setPrintQuality(); /*if (!entry.isMapView()) slide.drawZero(dc); else { entry.getFocal().draw(dc); }*/ toDraw.drawFit(dc,0); g2d.dispose(); cb.addTemplate(tp,80, 482); //Paragraph p = new Paragraph(); //p.setExtraParagraphSpace(330); // p.setSpacingBefore(330f); // p.setAlignment(Element.ALIGN_CENTER); Paragraph phrase = new Paragraph(notes); //phrase.setExtraParagraphSpace(340f); phrase.setSpacingBefore(320f); phrase.setKeepTogether(true); //cell = new PdfPCell(phrase); //cell.setBorder(0); // table = new PdfPTable(new float[]{ 1 }); // table.setWidthPercentage(100.0f); // table.getDefaultCell().setBorder(0); //table.getDefaultCell().setPaddingTop(30); //PdfPCell c2 = new PdfPCell(); //c2.setFixedHeight(340); //slides are 540x405 //c2.setBorder(0); //table.addCell(c2); //table.addCell(cell); //table.setKeepTogether(false); //cell.setVerticalAlignment(PdfPCell.ALIGN_TOP); //p.add(table); //System.out.println("CELL HEIGHT : " + cell.getHeight()); //Section s1 = new Section(); //ColumnText chunk2 = new ColumnText(cb); //chunk2.setText(phrase); //chunk2.setSi //chunk2.setSimpleColumn(phrase,70, 330, document.getPageSize().width()-70,document.getPageSize().height()-70,15, Element.ALIGN_LEFT); // chunk2.go(); //PdfChunk chunk2 = new PdfChunk); Paragraph p2 = new Paragraph(" "); p2.setKeepTogether(false); phrase.setKeepTogether(false); // p2.setExtraParagraphSpace(230f); document.add(p2); document.add(phrase); document.newPage(); } VUE.getActivePathway().setIndex(currentIndex); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } public static void createSpeakerNotes4PerPage(File file) { //page size notes: //martin-top,left,right,bottom = 36 //widht :612 //height : 792 //usable space 540 x 720 // step 1: creation of a document-object Document document = new Document(PageSize.LETTER); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); // writer.setStrictImageSequence(true); // step 3: we open the document document.open(); PdfPTable table; PdfPCell cell; int entryCount = 0; int entryOnPage =0; int currentIndex = VUE.getActivePathway().getIndex(); VUE.getActivePathway().setIndex(-1); for (LWPathway.Entry entry : VUE.getActivePathway().getEntries()) { final LWSlide slide = entry.produceSlide(); final LWComponent toDraw = (slide == null ? entry.node : slide); final String notes = entry.getNotes(); entryCount++; table = new PdfPTable(new float[]{ 1,1 }); table.getDefaultCell().setBorder(0); //table.getDefaultCell().setPaddingBottom(50.0f); table.setSpacingAfter(20.0f); Paragraph p = new Paragraph(); p.setAlignment(Element.ALIGN_CENTER); Phrase phrase = new Phrase(notes); Font f = phrase.getFont(); f.setSize(8.0f); p.setFont(f); cell = new PdfPCell(phrase); cell.setBorder(0); PdfPCell i2 = new PdfPCell(); i2.setFixedHeight(172); i2.setBorder(0); //Render the table then throw the images on PdfContentByte cb = writer.getDirectContent(); PdfTemplate tp = cb.createTemplate(SlideSizeX,SlideSizeY); Point2D.Float offset = new Point2D.Float(); // center vertically only if landscape mode //if (format.getOrientation() == PageFormat.LANDSCAPE) //TODO: allow horizontal centering, but not vertical centering (handle in computeZoomFit) Rectangle2D bounds = null; //if (!entry.isMapView()) bounds = slide.getBounds(); //else //bounds = entry.getFocal().getBounds(); Dimension page = null; page = new Dimension(SlideSizeX,172); //PdfTemplate tp = cb.createTemplate(document.getPageSize().width()-80, document.getPageSize().height()-80); double scale = ZoomTool.computeZoomFit(page, 5, bounds, offset, true); PdfGraphics2D g2d = (PdfGraphics2D)tp.createGraphics(SlideSizeX,SlideSizeY, getFontMapper(),false,60.0f); DrawContext dc = new DrawContext(g2d, scale, -offset.x, -offset.y, null, // frame would be the PageFormat offset & size rectangle entry.isMapView() ? entry.getFocal() : slide, false); // todo: absolute links shouldn't be spec'd here dc.setClipOptimized(false); dc.setPrintQuality(); /*if (!entry.isMapView()) slide.drawZero(dc); else { entry.getFocal().draw(dc); }*/ toDraw.drawFit(dc,0); g2d.dispose(); //document.add(Image.getInstance(tp)); // int position = cell. // drawSequenceNumber(writer,36,position+203,entryCount); // cb.addTemplate(tp,56, position); Image img = Image.getInstance(tp); table.addCell(img); table.addCell(cell); p.add(table); document.add(p); } VUE.getActivePathway().setIndex(currentIndex); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } public static void createNodeNotes4PerPage(File file) { //page size notes: //martin-top,left,right,bottom = 36 //widht :612 //height : 792 //usable space 540 x 720 // step 1: creation of a document-object Document document = new Document(PageSize.LETTER); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); // writer.setStrictImageSequence(true); // step 3: we open the document document.open(); PdfPTable table; PdfPCell cell; int entryCount = 0; int entryOnPage =0; Iterator i = VUE.getActiveMap().getAllDescendents(LWComponent.ChildKind.PROPER).iterator(); while (i.hasNext()) { LWComponent component = (LWComponent) i.next(); if (component instanceof LWNode) { final LWNode node= (LWNode)component; final String notes = node.getNotes(); entryCount++; table = new PdfPTable(new float[]{ 1,1 }); table.getDefaultCell().setBorder(0); table.setSpacingAfter(20.0f); Paragraph p = new Paragraph(); p.setAlignment(Element.ALIGN_CENTER); Phrase phrase = new Phrase(notes); Font f = phrase.getFont(); f.setSize(8.0f); p.setFont(f); cell = new PdfPCell(phrase); cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); cell.setBorder(0); PdfPCell i2 = new PdfPCell(); i2.setFixedHeight(172); i2.setBorder(0); //Render the table then throw the images on PdfContentByte cb = writer.getDirectContent(); PdfTemplate tp = cb.createTemplate(SlideSizeX,SlideSizeY); Point2D.Float offset = new Point2D.Float(); //center vertically only if landscape mode //if (format.getOrientation() == PageFormat.LANDSCAPE) //TODO: allow horizontal centering, but not vertical centering (handle in computeZoomFit) Rectangle2D bounds = null; bounds = node.getBounds(); Dimension page = null; page = new Dimension(SlideSizeX,172); // PdfTemplate tp = cb.createTemplate(document.getPageSize().width()-80, document.getPageSize().height()-80); double scale = ZoomTool.computeZoomFit(page, 15, bounds, offset, true); PdfGraphics2D g2d = (PdfGraphics2D)tp.createGraphics(SlideSizeX,SlideSizeY, getFontMapper(),false,60.0f); DrawContext dc = new DrawContext(g2d, scale, -offset.x, -offset.y, null, // frame would be the PageFormat offset & size rectangle node, false); // todo: absolute links shouldn't be spec'd here dc.setClipOptimized(false); dc.setPrintQuality(); node.drawFit(dc,15); g2d.dispose(); Image img = Image.getInstance(tp); table.addCell(img); table.addCell(cell); p.add(table); document.add(p); } } } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } public static void createOutline(File file) { //page size notes: //martin-top,left,right,bottom = 36 //widht :612 //height : 792 //usable space 540 x 720 // step 1: creation of a document-object Document document = new Document(PageSize.LETTER); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); // writer.setStrictImageSequence(true); // step 3: we open the document document.open(); Paragraph p1 = new Paragraph(VUE.getActivePathway().getLabel()); p1.setSpacingAfter(15.0f); Font f = p1.getFont(); f.setStyle(Font.BOLD); p1.setFont(f); document.add(p1); /*p1.add("The leading of this paragraph is calculated automagically. "); p1.add("The default leading is 1.5 times the fontsize. "); p1.add(new Chunk("You can add chunks ")); p1.add(new Phrase("or you can add phrases. ")); p1.add(new Phrase( */ int entryCount=1; int currentIndex = VUE.getActivePathway().getIndex(); VUE.getActivePathway().setIndex(-1); for (LWPathway.Entry entry : VUE.getActivePathway().getEntries()) { String notes = entry.getNotes(); Paragraph p = new Paragraph(entryCount + ". " + entry.getLabel()); f = p.getFont(); f.setStyle(Font.BOLD); p.setFont(f); Paragraph notesP = new Paragraph(notes); notesP.setIndentationLeft(15.0f); notesP.setSpacingAfter(15.0f); document.add(p); document.add(notesP); entryCount++; } VUE.getActivePathway().setIndex(currentIndex); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } public static void createNodeOutline(File file) { //page size notes: //martin-top,left,right,bottom = 36 //widht :612 //height : 792 //usable space 540 x 720 // step 1: creation of a document-object Document document = new Document(PageSize.LETTER); try { GUI.activateWaitCursor(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // writer.setDefaultColorspace(PdfName.DEFAULTRGB, null); // writer.setStrictImageSequence(true); // step 3: we open the document document.open(); Paragraph p1 = new Paragraph(VUE.getActiveMap().getLabel()); p1.setSpacingAfter(15.0f); Font f = p1.getFont(); f.setStyle(Font.BOLD); f.setSize(18f); p1.setFont(f); document.add(p1); String n2 =VUE.getActiveMap().getNotes(); if (n2 != null && n2.length() > 0) { Paragraph p2 = new Paragraph(n2); p2.setIndentationLeft(30.0f); p2.setSpacingAfter(15.0f); // f = p2.getFont(); //f.setSize(f.getSize()-2); //p2.setFont(f); document.add(p2); } int entryCount=1; float indentation = 0.0f; Iterator it = VUE.getActiveMap().getAllDescendents(LWComponent.ChildKind.PROPER).iterator(); while (it.hasNext()) { LWComponent c = (LWComponent)it.next(); if (c instanceof LWNode) { LWNode n = (LWNode)c; outlineChildNode(document, indentation, n, entryCount); entryCount++; iterateChildren(document,indentation+10,n,1); } } it = VUE.getActiveMap().getAllDescendents(LWComponent.ChildKind.PROPER).iterator(); while (it.hasNext()) { LWComponent c = (LWComponent)it.next(); if (c instanceof LWLink) { LWLink l = (LWLink)c; String notes = l.getNotes(); String linkLabel = l.getLabel(); if ((notes == null || notes.length() == 0) && (linkLabel == null || linkLabel.length() ==0)) continue; if (linkLabel == null || linkLabel.length()==0) linkLabel = "Link"; Paragraph p = new Paragraph(entryCount + ". " + linkLabel.replaceAll("\\n","")); f = p.getFont(); f.setStyle(Font.BOLD); f.setSize(14f); p.setFont(f); Paragraph notesP = new Paragraph(notes); // f = notesP.getFont(); // f.setSize(f.getSize()-2); notesP.setIndentationLeft(30.0f); notesP.setSpacingAfter(15.0f); document.add(p); document.add(notesP); entryCount++; } } } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } finally { GUI.clearWaitCursor(); } // step 5: we close the document document.close(); } private static void iterateChildren(Document d, float indentation,LWNode n, int entryCount) { if (n.hasChildren()) { Iterator i = n.getChildIterator(); while (i.hasNext()) { Object o = i.next(); // System.out.println("child : " + o); if (o instanceof LWNode) { //System.out.println("outlineChildNode"); outlineChildNode(d,indentation,(LWNode)o,entryCount); entryCount++; iterateChildren(d,indentation+10,(LWNode)o,1); } else continue; } } } private static void outlineChildNode(Document d, float indentation,LWNode n, int entryCount) { String notes = n.getNotes(); String nodeLabel = n.getLabel(); if (nodeLabel == null || nodeLabel.length()==0) nodeLabel = "Node"; Paragraph p = new Paragraph(entryCount + ". " + n.getLabel().replaceAll("\\n","")); Font f = p.getFont(); f.setStyle(Font.BOLD); f.setSize(14f); p.setFont(f); p.setIndentationLeft(indentation); Paragraph notesP = new Paragraph(notes); notesP.setIndentationLeft(indentation+20); notesP.setSpacingAfter(15.0f); try { d.add(p); d.add(notesP); } catch (DocumentException e) { e.printStackTrace(); } } }