5 package net.sf.openrocket.gui.print;
7 import com.itextpdf.text.Document;
8 import com.itextpdf.text.DocumentException;
9 import com.itextpdf.text.ExceptionConverter;
10 import com.itextpdf.text.Rectangle;
11 import com.itextpdf.text.pdf.PdfBoolean;
12 import com.itextpdf.text.pdf.PdfName;
13 import com.itextpdf.text.pdf.PdfWriter;
14 import net.sf.openrocket.document.OpenRocketDocument;
15 import net.sf.openrocket.gui.print.components.Rule;
16 import net.sf.openrocket.gui.print.visitor.CenteringRingStrategy;
17 import net.sf.openrocket.gui.print.visitor.FinMarkingGuideStrategy;
18 import net.sf.openrocket.gui.print.visitor.FinSetPrintStrategy;
19 import net.sf.openrocket.gui.print.visitor.PageFitPrintStrategy;
20 import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
21 import net.sf.openrocket.gui.print.visitor.TransitionStrategy;
23 import java.io.IOException;
24 import java.io.OutputStream;
25 import java.util.Iterator;
29 * This is the main active object for printing. It performs all actions necessary to create and populate the print
32 public class PrintController {
35 * Print the selected components to a PDF document.
37 * @param doc the OR document
38 * @param toBePrinted the user chosen items to print
39 * @param outputFile the file being written to
40 * @param settings the print settings
41 * @param rotation the angle the rocket figure is rotated
43 public void print(OpenRocketDocument doc, Iterator<PrintableContext> toBePrinted, OutputStream outputFile,
44 PrintSettings settings, double rotation) {
46 Document idoc = new Document(getSize(settings));
47 PdfWriter writer = null;
49 writer = PdfWriter.getInstance(idoc, outputFile);
50 writer.setStrictImageSequence(true);
52 writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
53 writer.addViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
58 catch (InterruptedException e) {
61 // Used to combine multiple components onto fewer sheets of paper
62 PageFitPrintStrategy pageFitPrint = new PageFitPrintStrategy(idoc, writer);
64 boolean addRule = false;
66 while (toBePrinted.hasNext()) {
67 PrintableContext printableContext = toBePrinted.next();
69 Set<Integer> stages = printableContext.getStageNumber();
71 switch (printableContext.getPrintable()) {
73 DesignReport dp = new DesignReport(doc, idoc, rotation);
74 dp.writeToDocument(writer);
79 final FinSetPrintStrategy finWriter = new FinSetPrintStrategy(idoc, writer, stages, pageFitPrint);
80 finWriter.writeToDocument(doc.getRocket());
85 final PartsDetailVisitorStrategy detailVisitor = new PartsDetailVisitorStrategy(idoc, writer, stages);
86 detailVisitor.writeToDocument(doc.getRocket());
87 detailVisitor.close();
91 case TRANSITION_TEMPLATE:
92 final TransitionStrategy tranWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
93 if (tranWriter.writeToDocument(doc.getRocket(), false)) {
98 case NOSE_CONE_TEMPLATE:
99 final TransitionStrategy coneWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
100 if (coneWriter.writeToDocument(doc.getRocket(), true)) {
105 case CENTERING_RING_TEMPLATE:
106 final CenteringRingStrategy crWriter = new CenteringRingStrategy(idoc, writer, stages,
108 crWriter.writeToDocument(doc.getRocket());
112 case FIN_MARKING_GUIDE:
113 final FinMarkingGuideStrategy fmg = new FinMarkingGuideStrategy(idoc, writer);
114 fmg.writeToDocument(doc.getRocket());
122 //Add a ruler to the output.
123 pageFitPrint.addComponent(new Rule(Rule.Orientation.BOTTOM));
126 // Write out parts that we are going to combine onto single sheets of paper
127 pageFitPrint.writeToDocument(doc.getRocket());
130 //Stupid iText throws a really nasty exception if there is no data when close is called.
131 if (writer.getCurrentDocumentSize() <= 140) {
132 writer.setPageEmpty(false);
137 catch (DocumentException e) {
139 catch (ExceptionConverter ec) {
142 if (outputFile != null) {
146 catch (IOException e) {
153 * Get the correct paper size from the print settings.
155 * @param settings the print settings
157 * @return the paper size
159 private Rectangle getSize(PrintSettings settings) {
160 PaperSize size = settings.getPaperSize();
161 PaperOrientation orientation = settings.getPaperOrientation();
162 return orientation.orient(size.getSize());