--- /dev/null
+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