--- /dev/null
+package org.simantics.document.linking.report.pdf;\r
+\r
+import java.awt.Font;\r
+import java.awt.FontMetrics;\r
+import java.awt.Graphics2D;\r
+import java.awt.font.FontRenderContext;\r
+import java.io.File;\r
+import java.io.FileOutputStream;\r
+\r
+import com.lowagie.text.Document;\r
+import com.lowagie.text.Rectangle;\r
+import com.lowagie.text.pdf.PdfContentByte;\r
+import com.lowagie.text.pdf.PdfTemplate;\r
+import com.lowagie.text.pdf.PdfWriter;\r
+\r
+public class PDFPage {\r
+ public PDFPageStream stream;\r
+ public Graphics2D g2d;\r
+ public Document document;\r
+ public PdfWriter writer;\r
+ public File tempFile;\r
+ public PdfContentByte cb;\r
+ public PdfTemplate template = null;\r
+ public Font font;\r
+ \r
+ FontRenderContext frc;\r
+ FontMetrics fm;\r
+ \r
+ int currentPixel = 0;\r
+ int currentLine = 0;\r
+ int availableLines = 0;\r
+ \r
+ \r
+ public PDFPage(PDFPageStream stream) throws Exception{\r
+ this.stream = stream;\r
+ Rectangle pageSize = stream.getPageSize();\r
+ document = new Document(pageSize);\r
+ tempFile = File.createTempFile("ReportGenerator", ".pdf");\r
+ writer = PdfWriter.getInstance(document, new FileOutputStream(tempFile));\r
+ document.open();\r
+ this.cb = writer.getDirectContent();\r
+\r
+ \r
+ writer.flush();\r
+ template = cb.createTemplate(pageSize.getWidth(), pageSize.getHeight());\r
+ g2d = template.createGraphics(pageSize.getWidth(), pageSize.getHeight());\r
+ g2d.translate(stream.marginLeft, stream.marginTop);\r
+ g2d.setClip(0, 0, stream.contentWidth, stream.contentHeight);\r
+ currentPixel = 0;\r
+ currentLine = 1;\r
+ \r
+ setFont(stream.getDefaultFont());\r
+ }\r
+ \r
+ protected int getLineHeight() {\r
+ return fm.getHeight();\r
+ }\r
+ \r
+ public boolean isOpen() {\r
+ return template != null;\r
+ }\r
+ \r
+ public void setFont(Font font) {\r
+ this.font = font;\r
+ g2d.setFont(font);\r
+ fm = g2d.getFontMetrics();\r
+ frc = new FontRenderContext(g2d.getTransform(), true, true);\r
+ estimateAvailableLines();\r
+ }\r
+ \r
+ protected void estimateAvailableLines() {\r
+ availableLines = (int)Math.floor((stream.contentHeight-currentPixel)/getLineHeight());\r
+ }\r
+ \r
+ public Font getFont() {\r
+ return font;\r
+ }\r
+ \r
+ public void writeLine(String line) throws Exception{\r
+ writeLine(line, 0);\r
+ }\r
+ \r
+ public void writeLine(String line, int x) throws Exception{\r
+ g2d.drawString(line, x, currentPixel+getLineHeight());\r
+ currentLine++;\r
+ availableLines--;\r
+ currentPixel += getLineHeight();\r
+ stream.checkNextPage();\r
+ }\r
+ \r
+ public void close() {\r
+ g2d.dispose();\r
+ cb.addTemplate(template, 0, 0);\r
+ template = null;\r
+ \r
+ document.close();\r
+ if (writer != null)\r
+ writer.close();\r
+ document = null;\r
+ writer = null;\r
+ cb = null;\r
+ g2d = null;\r
+ }\r
+}\r