]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFPageStream.java b/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/pdf/PDFPageStream.java
new file mode 100644 (file)
index 0000000..ae9ac70
--- /dev/null
@@ -0,0 +1,169 @@
+package org.simantics.document.linking.report.pdf;\r
+\r
+import java.awt.Font;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.lowagie.text.Document;\r
+import com.lowagie.text.PageSize;\r
+import com.lowagie.text.Rectangle;\r
+import com.lowagie.text.pdf.PdfCopy;\r
+import com.lowagie.text.pdf.PdfImportedPage;\r
+import com.lowagie.text.pdf.PdfReader;\r
+\r
+public class PDFPageStream {\r
+       boolean modifiable = false;\r
+       Rectangle pageSize = PageSize.A4;\r
+       Font defaultFont;\r
+       List<PDFPage> pages = new ArrayList<PDFPage>();\r
+       \r
+       int contentWidth;\r
+       int contentHeight;\r
+       \r
+       int marginLeft = 20;\r
+    int marginRight = 20;\r
+    int marginTop = 10;\r
+    int marginBottom = 45;\r
+\r
+       int currentPage = 0;\r
+       \r
+       public PDFPageStream() {\r
+               calculateContent();\r
+       }\r
+       \r
+       public PDFPageStream(Rectangle pageSize) {\r
+               this.pageSize = pageSize;\r
+               calculateContent();\r
+       }\r
+       \r
+       public PDFPageStream(boolean modifiable) {\r
+               this.modifiable = modifiable;\r
+               calculateContent();\r
+       }\r
+       \r
+       public PDFPageStream(Rectangle pageSize, boolean modifiable) {\r
+               this.pageSize = pageSize;\r
+               this.modifiable = modifiable;\r
+               calculateContent();\r
+       }\r
+       \r
+       private void calculateContent() {\r
+               contentWidth = (int)getPageSize().getWidth() - marginLeft - marginRight;\r
+        contentHeight = (int)getPageSize().getHeight() - marginTop - marginBottom;\r
+       }\r
+       \r
+\r
+       public Rectangle getPageSize() {\r
+               return pageSize;\r
+       }\r
+       \r
+       public Font getDefaultFont() {\r
+               return defaultFont;\r
+       }\r
+       \r
+       public void setDefaultFont(Font defaultFont) {\r
+               this.defaultFont = defaultFont;\r
+       }\r
+       \r
+       public List<PDFPage> getPages() {\r
+               return pages;\r
+       }\r
+       \r
+       public void nextPage() throws Exception{\r
+               endPage();\r
+               \r
+               PDFPage page = new PDFPage(this);\r
+               pages.add(page);\r
+               currentPage++;\r
+               \r
+       }\r
+\r
+       private void endPage() {\r
+               if (pages.size() > 0) {\r
+                       PDFPage lastPage = pages.get(pages.size()-1);\r
+                       if (!modifiable && lastPage.isOpen())\r
+                               lastPage.close();\r
+               }\r
+       }\r
+       \r
+       \r
+       \r
+       public int getAvailableLines() {\r
+               return getCurrentPage().availableLines;\r
+       }\r
+       \r
+//     public int getTotalLines() {\r
+//             return totalLines;\r
+//     }\r
+       \r
+       public int getCurrentLine() {\r
+               return getCurrentPage().currentLine;\r
+       }\r
+       \r
+       public int getContentWidth() {\r
+               return contentWidth;\r
+       }\r
+       \r
+       public int getContentHeight() {\r
+               return contentHeight;\r
+       }\r
+       \r
+       protected void checkNextPage() throws Exception{\r
+               PDFPage page = getCurrentPage();\r
+               if (contentHeight - page.currentPixel - page.getLineHeight() <= 0)\r
+                       nextPage();\r
+       }\r
+       \r
+       public int getCurrentPageIndex() {\r
+               return currentPage;\r
+       }\r
+       \r
+       public PDFPage getCurrentPage() {\r
+               return pages.get(currentPage-1);\r
+       }\r
+       \r
+       public void copy(PdfCopy pdfCopy) throws IOException{\r
+               for (PDFPage page : pages) {\r
+                       if (page.isOpen())\r
+                               page.close();\r
+                       PdfReader reader = new PdfReader(page.tempFile.getAbsolutePath());\r
+                       try {\r
+                       for (int i = 1; i <= reader.getNumberOfPages(); i++) {\r
+                               PdfImportedPage ipage = pdfCopy.getImportedPage(reader, i);\r
+                           pdfCopy.addPage(ipage);\r
+                       }\r
+                       } catch (Exception e) {\r
+                               e.printStackTrace();\r
+               } finally {\r
+                       reader.close();\r
+               }\r
+               }\r
+       }\r
+       \r
+       public void close(String filename) throws Exception{\r
+               if (pages.size() == 0) {\r
+                       return;\r
+               }\r
+               try {\r
+                       endPage();\r
+                       Document document = new Document(pageSize);\r
+                       PdfCopy pdfCopy = new PdfCopy(document, new FileOutputStream(filename));\r
+                       document.open();\r
+                       copy(pdfCopy);\r
+                       document.close();\r
+                       pdfCopy.close();\r
+               } finally {\r
+                       close();\r
+               }\r
+       }\r
+       \r
+       public void close() throws Exception{\r
+               for (PDFPage page : pages) {\r
+                               page.tempFile.delete();\r
+               }\r
+               pages.clear();\r
+               defaultFont = null;\r
+       }\r
+}\r