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.FinSetVisitorStrategy;
16 import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
17 import net.sf.openrocket.rocketcomponent.ComponentVisitor;
19 import javax.print.attribute.standard.MediaSizeName;
20 import java.io.OutputStream;
21 import java.util.Iterator;
25 * This is the main active object for printing. It performs all actions necessary to create and populate the print file.
27 public class PrintController {
30 * Print the selected components to a PDF document.
32 * @param doc the OR document
33 * @param toBePrinted the user chosen items to print
34 * @param outputFile the file being written to
35 * @param msn the paper size
37 public void print (OpenRocketDocument doc, Iterator<PrintableContext> toBePrinted, OutputStream outputFile, MediaSizeName msn) {
39 Document idoc = new Document(convertWithDefault(msn));
40 PdfWriter writer = null;
41 // OutputStream fileOutputStream = null;
43 // fileOutputStream = outputFile;
44 writer = PdfWriter.getInstance(idoc, outputFile);
45 writer.setStrictImageSequence(true);
47 writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
48 writer.addViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
53 catch (InterruptedException e) {
55 while (toBePrinted.hasNext()) {
56 PrintableContext printableContext = toBePrinted.next();
58 Set<Integer> stages = printableContext.getStageNumber();
60 switch (printableContext.getPrintable()) {
62 DesignReport dp = new DesignReport(doc, idoc);
67 final ComponentVisitor finVisitor = new ComponentVisitor(new FinSetVisitorStrategy(idoc,
70 finVisitor.visit(doc.getRocket());
74 final ComponentVisitor detailVisitor = new ComponentVisitor(new PartsDetailVisitorStrategy(idoc,
77 detailVisitor.visit(doc.getRocket());
78 detailVisitor.close();
82 final ComponentVisitor partsVisitor = new ComponentVisitor(new PartsListVisitorStrategy(idoc,
85 partsVisitor.visit(doc.getRocket());
91 //Stupid iText throws a really nasty exception if there is no data when close is called.
92 if (writer.getCurrentDocumentSize() <= 140) {
93 writer.setPageEmpty(false);
98 catch (DocumentException e) {
100 catch (ExceptionConverter ec) {
103 if (fileOutputStream != null) {
105 fileOutputStream.close();
107 catch (IOException e) {
113 private Rectangle convertWithDefault (final MediaSizeName msn) {
114 Rectangle result = PaperSize.convert(msn);
115 if (result == null) {
116 result = PaperSize.convert(PrintUtilities.getDefaultMedia().getMediaSizeName());