1 /*******************************************************************************
\r
2 ' * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.trend.util;
\r
14 import java.awt.Graphics;
\r
15 import java.awt.Graphics2D;
\r
16 import java.awt.geom.Rectangle2D;
\r
17 import java.awt.print.PageFormat;
\r
18 import java.awt.print.Printable;
\r
19 import java.awt.print.PrinterException;
\r
20 import java.awt.print.PrinterJob;
\r
21 import java.io.File;
\r
22 import java.io.FileOutputStream;
\r
23 import java.io.IOException;
\r
24 import java.util.ArrayList;
\r
25 import java.util.List;
\r
27 import org.simantics.g2d.canvas.impl.CanvasContext;
\r
28 import org.simantics.history.HistoryManager;
\r
29 import org.simantics.trend.TrendInitializer;
\r
30 import org.simantics.trend.configuration.TrendSpec;
\r
31 import org.simantics.trend.configuration.Viewport;
\r
32 import org.simantics.trend.impl.MilestoneSpec;
\r
33 import org.simantics.trend.impl.TrendNode;
\r
34 import org.simantics.utils.page.MarginUtils;
\r
35 import org.simantics.utils.page.PageDesc;
\r
36 import org.simantics.utils.page.PageOrientation;
\r
37 import org.simantics.utils.threads.AWTThread;
\r
39 import com.lowagie.text.Document;
\r
40 import com.lowagie.text.DocumentException;
\r
41 import com.lowagie.text.FontFactory;
\r
42 import com.lowagie.text.Rectangle;
\r
43 import com.lowagie.text.pdf.DefaultFontMapper;
\r
44 import com.lowagie.text.pdf.FontMapper;
\r
45 import com.lowagie.text.pdf.PdfContentByte;
\r
46 import com.lowagie.text.pdf.PdfWriter;
\r
48 public class PrintUtil {
\r
52 List<PrintPage> pages = new ArrayList<PrintPage>();
\r
56 pageDesc = new PageDesc("A4", PageOrientation.Landscape, 210, 297).withMargins( MarginUtils.MARGINS_10mm );
\r
57 mapper = new DefaultFontMapper();
\r
58 FontFactory.registerDirectories();
\r
61 public void addTrendPage(TrendSpec trendSpec, HistoryManager historian, MilestoneSpec milestones, Viewport viewport)
\r
63 pages.add( TrendPage.addTrendPage(trendSpec, historian, milestones, viewport) );
\r
66 public void addTrendPage(TrendNode srcTrend) {
\r
67 pages.add( TrendPage.createFrom(srcTrend));
\r
70 public void setPageDesc(PageDesc pageDesc)
\r
72 this.pageDesc = pageDesc;
\r
75 public void print() throws PrinterException {
\r
76 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
77 printJob.setPrintable( new Printable() {
\r
79 public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
\r
80 if (graphics instanceof Graphics2D == false) {
\r
81 throw new PrinterException("Printer context does not support Graphics2D");
\r
83 if (pageIndex < pages.size()) {
\r
84 Graphics2D g2d = (Graphics2D) graphics;
\r
86 g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
\r
88 Rectangle2D rect = new Rectangle2D.Double(0, 0, pageFormat.getImageableWidth(), pageFormat.getImageableHeight());
\r
89 //g2d.setClip( rect );
\r
90 System.out.println("Printing page "+pageIndex+", pageFormat="+pageFormat.getImageableX()+", "+pageFormat.getImageableY()+", "+pageFormat.getImageableWidth()+", "+pageFormat.getImageableHeight());
\r
91 PrintPage trend = pages.get(pageIndex);
\r
92 trend.print(g2d, rect);
\r
96 return NO_SUCH_PAGE;
\r
98 printJob.printDialog();
\r
102 public void printPdf(File file) throws IOException
\r
104 Document document = null;
\r
105 FileOutputStream fos = null;
\r
106 Graphics2D g2 = null;
\r
109 Rectangle2D.Float pageArea = new Rectangle2D.Float();
\r
110 pageDesc.getPageRectangle( pageArea );
\r
112 // Content area in page
\r
113 Rectangle2D.Float contentArea = new Rectangle2D.Float();
\r
114 pageDesc.getMarginsRectangle( contentArea );
\r
116 // step 1: creation of a document-object
\r
117 Rectangle pageArea2 = new Rectangle(
\r
118 (float) PageDesc.toPoints(pageArea.getMinX()),
\r
119 (float) PageDesc.toPoints(pageArea.getMinY()),
\r
120 (float) PageDesc.toPoints(pageArea.getWidth()),
\r
121 (float) PageDesc.toPoints(pageArea.getHeight()) );
\r
122 document = new Document( pageArea2 );
\r
124 // step 2: creation of the writer
\r
125 if ( !file.exists() ) file.createNewFile();
\r
126 fos = new FileOutputStream( file, false );
\r
129 writer = PdfWriter.getInstance(document, fos);
\r
130 } catch (DocumentException e) {
\r
131 throw new IOException(e);
\r
134 // step 3: we open the document
\r
138 for ( PrintPage page : pages )
\r
140 if (!document.newPage()) break;
\r
141 PdfContentByte cb = writer.getDirectContent();
\r
142 g2 = cb.createGraphics( pageArea2.getWidth(), pageArea2.getHeight(), mapper);
\r
144 Rectangle2D contentArea2 = new Rectangle2D.Float(
\r
145 (float) PageDesc.toPoints(contentArea.getMinX()),
\r
146 (float) PageDesc.toPoints(contentArea.getMinY()),
\r
147 (float) PageDesc.toPoints(contentArea.getWidth()),
\r
148 (float) PageDesc.toPoints(contentArea.getHeight()) );
\r
150 page.print(g2, contentArea2);
\r
155 if (g2 != null) g2.dispose();
\r
156 if (document != null) document.close();
\r
157 if (fos != null) fos.close();
\r
158 } catch (Exception e) {}
\r
162 interface PrintPage {
\r
163 void print(Graphics2D g2d, Rectangle2D pageArea);
\r
166 static class TrendPage implements PrintPage
\r
171 public static TrendPage createFrom(TrendNode srcTrend)
\r
173 TrendPage page = new TrendPage();
\r
174 CanvasContext ctx = TrendInitializer.createDefaultCanvas(AWTThread.getThreadAccess(), srcTrend.historian, srcTrend.collector, null, srcTrend.getTrendSpec());
\r
175 TrendNode trend = TrendInitializer.getTrendNode( ctx );
\r
176 trend.setViewport( srcTrend.getViewport() );
\r
177 page.autoscale = false;
\r
178 if (srcTrend.milestones != null) trend.setMilestones( srcTrend.milestones );
\r
179 trend.printing = true;
\r
180 page.trend = trend;
\r
184 public static TrendPage addTrendPage(TrendSpec trendSpec, HistoryManager historian, MilestoneSpec milestones, Viewport viewport)
\r
186 TrendPage page = new TrendPage();
\r
187 CanvasContext ctx = TrendInitializer.createDefaultCanvas(AWTThread.getThreadAccess(), historian, null, null, trendSpec);
\r
188 TrendNode trend = TrendInitializer.getTrendNode( ctx );
\r
189 trend.printing = true;
\r
190 if (milestones!=null) {
\r
191 trend.setMilestones(milestones);
\r
193 if ( viewport!=null ) {
\r
194 trend.setViewport(viewport);
\r
195 page.autoscale = false;
\r
197 page.autoscale = true;
\r
199 page.trend = trend;
\r
203 public void print(Graphics2D g2d, Rectangle2D pageArea)
\r
205 Rectangle2D contentArea2 = new Rectangle2D.Float(
\r
206 (float) PageDesc.toPoints(pageArea.getMinX()),
\r
207 (float) PageDesc.toPoints(pageArea.getMinY()),
\r
208 (float) PageDesc.toPoints(pageArea.getWidth()),
\r
209 (float) PageDesc.toPoints(pageArea.getHeight()) );
\r
211 java.awt.Rectangle r2 = g2d.getClipBounds();
\r
212 java.awt.Rectangle r = g2d.getClipBounds();
\r
215 g2d.scale(0.5, 0.5);
\r
216 // r = g2d.getClipBounds();
\r
217 // System.out.println(r);
\r
220 trend.setSize(r.width, r.height);
\r
221 // trend.setSize(contentArea2.getWidth()*2, contentArea2.getHeight()*2);
\r
222 // g2d.setClip( contentArea2 );
\r
223 //trend.setSize(contentArea2.getWidth(), contentArea2.getHeight());
\r
224 if ( autoscale ) trend.zoomOut();
\r
226 trend.render( g2d );
\r