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.visitor.FinMarkingGuideStrategy;
16 import net.sf.openrocket.gui.print.visitor.FinSetPrintStrategy;
17 import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
18 import net.sf.openrocket.gui.print.visitor.TransitionStrategy;
20 import java.io.IOException;
21 import java.io.OutputStream;
22 import java.util.Iterator;
26 * This is the main active object for printing. It performs all actions necessary to create and populate the print
29 public class PrintController {
32 * Print the selected components to a PDF document.
34 * @param doc the OR document
35 * @param toBePrinted the user chosen items to print
36 * @param outputFile the file being written to
37 * @param settings the print settings
38 * @param rotation the angle the rocket figure is rotated
40 public void print(OpenRocketDocument doc, Iterator<PrintableContext> toBePrinted, OutputStream outputFile,
41 PrintSettings settings, double rotation) {
43 Document idoc = new Document(getSize(settings));
44 PdfWriter writer = null;
46 writer = PdfWriter.getInstance(idoc, outputFile);
47 writer.setStrictImageSequence(true);
49 writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
50 writer.addViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
54 } catch (InterruptedException e) {
56 while (toBePrinted.hasNext()) {
57 PrintableContext printableContext = toBePrinted.next();
59 Set<Integer> stages = printableContext.getStageNumber();
61 switch (printableContext.getPrintable()) {
63 DesignReport dp = new DesignReport(doc, idoc, rotation);
64 dp.writeToDocument(writer);
68 final FinSetPrintStrategy finWriter = new FinSetPrintStrategy(idoc, writer, stages);
69 finWriter.writeToDocument(doc.getRocket());
72 final PartsDetailVisitorStrategy detailVisitor = new PartsDetailVisitorStrategy(idoc, writer, stages);
73 detailVisitor.writeToDocument(doc.getRocket());
74 detailVisitor.close();
77 case TRANSITION_TEMPLATE:
78 final TransitionStrategy tranWriter = new TransitionStrategy(idoc, writer, stages);
79 tranWriter.writeToDocument(doc.getRocket(), false);
83 case NOSE_CONE_TEMPLATE:
84 final TransitionStrategy coneWriter = new TransitionStrategy(idoc, writer, stages);
85 coneWriter.writeToDocument(doc.getRocket(), true);
89 case FIN_MARKING_GUIDE:
90 final FinMarkingGuideStrategy fmg = new FinMarkingGuideStrategy(idoc, writer);
91 fmg.writeToDocument(doc.getRocket());
96 //Stupid iText throws a really nasty exception if there is no data when close is called.
97 if (writer.getCurrentDocumentSize() <= 140) {
98 writer.setPageEmpty(false);
102 } catch (DocumentException e) {
103 } catch (ExceptionConverter ec) {
105 if (outputFile != null) {
108 } catch (IOException e) {
115 * Get the correct paper size from the print settings.
117 * @param settings the print settings
118 * @return the paper size
120 private Rectangle getSize(PrintSettings settings) {
121 PaperSize size = settings.getPaperSize();
122 PaperOrientation orientation = settings.getPaperOrientation();
123 return orientation.orient(size.getSize());