1 package org.simantics.document.linking.report.pdf;
\r
3 import java.awt.Font;
\r
4 import java.util.HashMap;
\r
5 import java.util.Map;
\r
7 import org.simantics.document.linking.report.Document;
\r
8 import org.simantics.document.linking.report.DocumentElement;
\r
9 import org.simantics.document.linking.report.DocumentItem;
\r
10 import org.simantics.document.linking.report.DocumentTitlePage;
\r
11 import org.simantics.document.linking.report.Table;
\r
12 import org.simantics.document.linking.report.TableOfContents;
\r
13 import org.simantics.document.linking.report.TextItem;
\r
14 import org.simantics.document.linking.report.URLItem;
\r
15 import org.simantics.document.linking.report.base.TextItemImpl;
\r
16 import org.simantics.document.linking.report.base.URLItemImpl;
\r
17 import org.simantics.utils.datastructures.Arrays;
\r
21 * PDF format reporter.
\r
23 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
26 public class PDFDocument implements Document {
\r
27 private String filename;
\r
29 Map<TextSize, Font> fonts = new HashMap<TextSize, Font>();
\r
31 PDFPageStream contentStream;
\r
32 PDFTable currentTable;
\r
33 PDFTitlePage titlePage;
\r
36 public PDFDocument(String filename) throws Exception {
\r
37 this.filename = filename;
\r
38 contentStream = new PDFPageStream();
\r
40 contentStream.setDefaultFont(fonts.get(TextSize.SMALL));
\r
43 public PDFDocument(String filename, Font font) throws Exception {
\r
44 this.filename = filename;
\r
45 contentStream = new PDFPageStream();
\r
47 fonts.put(TextSize.SMALL, font);
\r
50 public PDFDocument(String filename, Font font, Font headerFont) throws Exception {
\r
51 this.filename = filename;
\r
52 contentStream = new PDFPageStream();
\r
54 fonts.put(TextSize.SMALL, font);
\r
55 fonts.put(TextSize.MEDIUM, headerFont);
\r
58 private void defaultFonts() {
\r
59 fonts.put(TextSize.TINY, new Font("Arial", Font.PLAIN, 6));
\r
60 fonts.put(TextSize.SMALL, new Font("Arial", Font.PLAIN, 8));
\r
61 fonts.put(TextSize.MEDIUM, new Font("Arial", Font.PLAIN, 10));
\r
62 fonts.put(TextSize.LARGE, new Font("Arial", Font.PLAIN, 16));
\r
63 fonts.put(TextSize.HUGE, new Font("Arial", Font.BOLD, 24));
\r
64 contentStream.setDefaultFont(fonts.get(TextSize.SMALL));
\r
67 Font getFont(TextSize size) {
\r
68 return fonts.get(size);
\r
72 public int getAvailableLines() {
\r
73 return contentStream.getAvailableLines();
\r
77 public int getCurrentLine() {
\r
78 return contentStream.getCurrentLine();
\r
81 public void close() throws Exception{
\r
84 toc.create(contentStream, contentStream.getPages().get(0));
\r
86 contentStream.close(filename);
\r
90 * @see org.simantics.document.linking.report.Document#nextPage()
\r
93 public void nextPage() throws Exception{
\r
94 contentStream.nextPage();
\r
97 @SuppressWarnings("unchecked")
\r
99 public <T extends DocumentElement> T newElement(Class<T> cls, String...options) throws Exception {
\r
100 if (cls == Table.class) {
\r
101 return (T)newTable();
\r
102 } else if (cls == TableOfContents.class) {
\r
103 return (T)getOrCreateToc();
\r
104 } else if (cls == DocumentTitlePage.class) {
\r
105 if (titlePage != null)
\r
106 throw new Exception("Report may contain only one title page");
\r
107 titlePage = new PDFTitlePage(this);
\r
108 return (T)titlePage;
\r
113 @SuppressWarnings("unchecked")
\r
115 public <T extends DocumentElement> T nextElement(Class<T> cls, String...options) throws Exception {
\r
116 if (cls == Table.class) {
\r
117 return (T)nextTable(Arrays.contains(options, Document.TOC));
\r
118 } else if (cls == TableOfContents.class) {
\r
119 return (T)getOrCreateToc();
\r
124 @SuppressWarnings("unchecked")
\r
126 public <T extends DocumentElement> T getCurrentElement(Class<T> cls) {
\r
127 if (cls == Table.class) {
\r
128 return (T)getCurrentTable();
\r
129 } else if (cls == TableOfContents.class) {
\r
131 } else if (cls == DocumentTitlePage.class) {
\r
132 return (T)titlePage;
\r
137 @SuppressWarnings("unchecked")
\r
139 public <T extends DocumentItem> T newItem(Class<T> cls, String... options)
\r
141 if (cls == TextItem.class)
\r
142 return (T)new TextItemImpl();
\r
143 if (cls == URLItem.class)
\r
144 return (T)new URLItemImpl();
\r
148 public Table nextTable(boolean id) throws Exception {
\r
149 if (currentTable!= null) {
\r
151 currentTable = new PDFTable(currentTable);
\r
152 return currentTable;
\r
159 private void closeTable() throws Exception {
\r
160 if (currentTable != null && currentTable.currentLine > 0) {
\r
161 currentTable.setLinesVisible(false);
\r
162 currentTable.setHeaderVisible(false);
\r
163 currentTable.writeLine("");
\r
168 public Table newTable() throws Exception {
\r
170 currentTable = new PDFTable(this,contentStream);
\r
171 return currentTable;
\r
175 Table getCurrentTable() {
\r
176 return currentTable;
\r
179 TableOfContents getOrCreateToc() throws Exception{
\r
181 toc = new PDFTocElement(this);
\r