]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFPageStream.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / pdf / PDFPageStream.java
1 package org.simantics.document.linking.report.pdf;\r
2 \r
3 import java.awt.Font;\r
4 import java.io.FileOutputStream;\r
5 import java.io.IOException;\r
6 import java.util.ArrayList;\r
7 import java.util.List;\r
8 \r
9 import com.lowagie.text.Document;\r
10 import com.lowagie.text.PageSize;\r
11 import com.lowagie.text.Rectangle;\r
12 import com.lowagie.text.pdf.PdfCopy;\r
13 import com.lowagie.text.pdf.PdfImportedPage;\r
14 import com.lowagie.text.pdf.PdfReader;\r
15 \r
16 public class PDFPageStream {\r
17         boolean modifiable = false;\r
18         Rectangle pageSize = PageSize.A4;\r
19         Font defaultFont;\r
20         List<PDFPage> pages = new ArrayList<PDFPage>();\r
21         \r
22         int contentWidth;\r
23         int contentHeight;\r
24         \r
25         int marginLeft = 20;\r
26     int marginRight = 20;\r
27     int marginTop = 10;\r
28     int marginBottom = 45;\r
29 \r
30         int currentPage = 0;\r
31         \r
32         public PDFPageStream() {\r
33                 calculateContent();\r
34         }\r
35         \r
36         public PDFPageStream(Rectangle pageSize) {\r
37                 this.pageSize = pageSize;\r
38                 calculateContent();\r
39         }\r
40         \r
41         public PDFPageStream(boolean modifiable) {\r
42                 this.modifiable = modifiable;\r
43                 calculateContent();\r
44         }\r
45         \r
46         public PDFPageStream(Rectangle pageSize, boolean modifiable) {\r
47                 this.pageSize = pageSize;\r
48                 this.modifiable = modifiable;\r
49                 calculateContent();\r
50         }\r
51         \r
52         private void calculateContent() {\r
53                 contentWidth = (int)getPageSize().getWidth() - marginLeft - marginRight;\r
54         contentHeight = (int)getPageSize().getHeight() - marginTop - marginBottom;\r
55         }\r
56         \r
57 \r
58         public Rectangle getPageSize() {\r
59                 return pageSize;\r
60         }\r
61         \r
62         public Font getDefaultFont() {\r
63                 return defaultFont;\r
64         }\r
65         \r
66         public void setDefaultFont(Font defaultFont) {\r
67                 this.defaultFont = defaultFont;\r
68         }\r
69         \r
70         public List<PDFPage> getPages() {\r
71                 return pages;\r
72         }\r
73         \r
74         public void nextPage() throws Exception{\r
75                 endPage();\r
76                 \r
77                 PDFPage page = new PDFPage(this);\r
78                 pages.add(page);\r
79                 currentPage++;\r
80                 \r
81         }\r
82 \r
83         private void endPage() {\r
84                 if (pages.size() > 0) {\r
85                         PDFPage lastPage = pages.get(pages.size()-1);\r
86                         if (!modifiable && lastPage.isOpen())\r
87                                 lastPage.close();\r
88                 }\r
89         }\r
90         \r
91         \r
92         \r
93         public int getAvailableLines() {\r
94                 return getCurrentPage().availableLines;\r
95         }\r
96         \r
97 //      public int getTotalLines() {\r
98 //              return totalLines;\r
99 //      }\r
100         \r
101         public int getCurrentLine() {\r
102                 return getCurrentPage().currentLine;\r
103         }\r
104         \r
105         public int getContentWidth() {\r
106                 return contentWidth;\r
107         }\r
108         \r
109         public int getContentHeight() {\r
110                 return contentHeight;\r
111         }\r
112         \r
113         protected void checkNextPage() throws Exception{\r
114                 PDFPage page = getCurrentPage();\r
115                 if (contentHeight - page.currentPixel - page.getLineHeight() <= 0)\r
116                         nextPage();\r
117         }\r
118         \r
119         public int getCurrentPageIndex() {\r
120                 return currentPage;\r
121         }\r
122         \r
123         public PDFPage getCurrentPage() {\r
124                 return pages.get(currentPage-1);\r
125         }\r
126         \r
127         public void copy(PdfCopy pdfCopy) throws IOException{\r
128                 for (PDFPage page : pages) {\r
129                         if (page.isOpen())\r
130                                 page.close();\r
131                         PdfReader reader = new PdfReader(page.tempFile.getAbsolutePath());\r
132                         try {\r
133                         for (int i = 1; i <= reader.getNumberOfPages(); i++) {\r
134                                 PdfImportedPage ipage = pdfCopy.getImportedPage(reader, i);\r
135                             pdfCopy.addPage(ipage);\r
136                         }\r
137                         } catch (Exception e) {\r
138                                 e.printStackTrace();\r
139                 } finally {\r
140                         reader.close();\r
141                 }\r
142                 }\r
143         }\r
144         \r
145         public void close(String filename) throws Exception{\r
146                 if (pages.size() == 0) {\r
147                         return;\r
148                 }\r
149                 try {\r
150                         endPage();\r
151                         Document document = new Document(pageSize);\r
152                         PdfCopy pdfCopy = new PdfCopy(document, new FileOutputStream(filename));\r
153                         document.open();\r
154                         copy(pdfCopy);\r
155                         document.close();\r
156                         pdfCopy.close();\r
157                 } finally {\r
158                         close();\r
159                 }\r
160         }\r
161         \r
162         public void close() throws Exception{\r
163                 for (PDFPage page : pages) {\r
164                                 page.tempFile.delete();\r
165                 }\r
166                 pages.clear();\r
167                 defaultFont = null;\r
168         }\r
169 }\r