From a69453749e6317f15c6bcb6c1da5b33e31244f65 Mon Sep 17 00:00:00 2001
From: Andreas Fitzek <andreas.fitzek@iaik.tugraz.at>
Date: Fri, 24 Oct 2014 09:44:56 +0200
Subject: Image Scaling

---
 .../pdfbox/PDFAsVisualSignatureBuilder.java        | 19 +-------
 .../lib/impl/stamping/pdfbox/PDFBoxTable.java      | 51 +++++++++++++++++-----
 .../lib/impl/stamping/pdfbox/PdfBoxStamper.java    |  7 ++-
 .../impl/stamping/pdfbox/PdfBoxVisualObject.java   | 14 ++++--
 4 files changed, 57 insertions(+), 34 deletions(-)

(limited to 'pdf-as-pdfbox')

diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java
index e3ee19f6..f5776c0a 100644
--- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java
+++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java
@@ -551,24 +551,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder {
 				if (cell.getType() == Entry.TYPE_IMAGE) {
 					String img_ref = (String) cell.getValue();
 					if (!images.containsKey(img_ref)) {
-						File img_file = new File(img_ref);
-						if (!img_file.isAbsolute()) {
-							logger.debug("Image file declaration is relative. Prepending path of resources directory.");
-							logger.debug("Image Location: "
-									+ settings.getWorkingDirectory()
-									+ File.separator + img_ref);
-							img_file = new File(settings.getWorkingDirectory()
-									+ File.separator + img_ref);
-						} else {
-							logger.debug("Image file declaration is absolute. Skipping file relocation.");
-						}
-
-						if (!img_file.exists()) {
-							logger.debug("Image file \""
-									+ img_file.getCanonicalPath()
-									+ "\" doesn't exist.");
-							throw new PdfAsException("error.pdf.stamp.04");
-						}
+						File img_file = ImageUtils.getImageFile(img_ref, settings);
 
 						BufferedImage img = null;
 						try {
diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java
index f83d099a..2fec7083 100644
--- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java
+++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java
@@ -24,21 +24,22 @@
 package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox;
 
 import java.awt.Color;
+import java.awt.Dimension;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.fontbox.ttf.TrueTypeFont;
 import org.apache.pdfbox.pdmodel.font.PDFont;
-import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
-import org.apache.pdfbox.pdmodel.font.PDType1Font;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
 import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException;
 import at.gv.egiz.pdfas.common.settings.ISettings;
+import at.gv.egiz.pdfas.common.utils.ImageUtils;
 import at.gv.egiz.pdfas.common.utils.StringUtils;
 import at.knowcenter.wag.egov.egiz.table.Entry;
 import at.knowcenter.wag.egov.egiz.table.Style;
@@ -144,7 +145,7 @@ public class PDFBoxTable {
 	}
 
 	public PDFBoxTable(Table abstractTable, PDFBoxTable parent, float fixSize,
-			ISettings settings) throws IOException {
+			ISettings settings) throws IOException, PdfAsException {
 		this.settings = settings;
 		initializeStyle(abstractTable, parent);
 		float[] relativSizes = abstractTable.getColsRelativeWith();
@@ -177,13 +178,13 @@ public class PDFBoxTable {
 	}
 
 	public PDFBoxTable(Table abstractTable, PDFBoxTable parent,
-			ISettings settings) throws IOException {
+			ISettings settings) throws IOException, PdfAsException {
 		this.settings = settings;
 		initializeStyle(abstractTable, parent);
 		this.calculateWidthHeight();
 	}
 
-	private void calculateHeightsBasedOnWidths() throws IOException {
+	private void calculateHeightsBasedOnWidths() throws IOException, PdfAsException {
 		int rows = this.table.getRows().size();
 		rowHeights = new float[rows];
 		addPadding = new boolean[rows];
@@ -227,7 +228,7 @@ public class PDFBoxTable {
 		calcTotals();
 	}
 
-	private void calculateWidthHeight() throws IOException {
+	private void calculateWidthHeight() throws IOException, PdfAsException {
 		int cols = this.table.getMaxCols();
 		colWidths = new float[cols];
 
@@ -299,7 +300,7 @@ public class PDFBoxTable {
 		}
 	}
 
-	private float getCellWidth(Entry cell) throws IOException {
+	private float getCellWidth(Entry cell) throws IOException, PdfAsException {
 		boolean isValue = true;
 		switch (cell.getType()) {
 		case Entry.TYPE_CAPTION:
@@ -503,7 +504,7 @@ public class PDFBoxTable {
 		return heights;
 	}
 
-	private float getCellHeight(Entry cell, float width) throws IOException {
+	private float getCellHeight(Entry cell, float width) throws IOException, PdfAsException {
 		boolean isValue = true;
 		switch (cell.getType()) {
 		case Entry.TYPE_CAPTION:
@@ -526,12 +527,25 @@ public class PDFBoxTable {
 			float[] heights = getStringHeights(lines, c, fontSize);
 			return fontSize * heights.length  + padding * 2;
 		case Entry.TYPE_IMAGE:
+			String imageFile = (String)cell.getValue();
+			File img_file = ImageUtils.getImageFile(imageFile, settings);
 			if (style != null && style.getImageScaleToFit() != null) {
 				//if (style.getImageScaleToFit().getHeight() < width) {
 					return style.getImageScaleToFit().getHeight() + padding * 2;
 				//}
 			}
-			return width + padding * 2;
+			FileInputStream fis = new FileInputStream(img_file);
+			try {
+				Dimension dim = ImageUtils.getImageDimensions(fis);
+				if(dim.getHeight() > 80.0f) {
+					return width + padding * 2;
+				}
+				return (float)dim.getHeight() + padding * 2;
+			} finally {
+				if(fis != null) {
+					fis.close();
+				}
+			}
 		case Entry.TYPE_TABLE:
 			PDFBoxTable pdfBoxTable = null;
 			if (cell.getValue() instanceof Table) {
@@ -554,7 +568,7 @@ public class PDFBoxTable {
 		return 0;
 	}
 
-	private float getCellHeight(Entry cell) throws IOException {
+	private float getCellHeight(Entry cell) throws IOException, PdfAsException {
 		boolean isValue = true;
 		switch (cell.getType()) {
 		case Entry.TYPE_CAPTION:
@@ -579,10 +593,23 @@ public class PDFBoxTable {
 				return fontSize + padding * 2;
 			}
 		case Entry.TYPE_IMAGE:
+			String imageFile = (String)cell.getValue();
+			File img_file = ImageUtils.getImageFile(imageFile, settings);
 			if (style != null && style.getImageScaleToFit() != null) {
 				return style.getImageScaleToFit().getHeight() + padding * 2;
 			}
-			return 80.f + padding * 2;
+			FileInputStream fis = new FileInputStream(img_file);
+			try {
+				Dimension dim = ImageUtils.getImageDimensions(fis);
+				if(dim.getHeight() > 80.0f) {
+					return 80.0f + padding * 2;
+				}
+				return (float)dim.getHeight() + padding * 2;
+			} finally {
+				if(fis != null) {
+					fis.close();
+				}
+			}
 		case Entry.TYPE_TABLE:
 			PDFBoxTable pdfBoxTable = null;
 			if (cell.getValue() instanceof Table) {
diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java
index c60c4283..5c190883 100644
--- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java
+++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java
@@ -26,6 +26,7 @@ package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox;
 import java.io.IOException;
 
 import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
+import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException;
 import at.gv.egiz.pdfas.common.settings.ISettings;
 import at.gv.egiz.pdfas.lib.impl.stamping.IPDFStamper;
 import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject;
@@ -44,7 +45,11 @@ public class PdfBoxStamper implements IPDFStamper {
 	}
 	
 	public IPDFVisualObject createVisualPDFObject(PDFObject pdf, Table table) throws IOException {
-		return new PdfBoxVisualObject(table, pdf.getStatus().getSettings());
+		try {
+			return new PdfBoxVisualObject(table, pdf.getStatus().getSettings());
+		} catch (PdfAsException e) {
+			throw new PdfAsWrappedIOException(e);
+		}
 	}
 
 	public byte[] writeVisualObject(IPDFVisualObject visualObject,
diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java
index c7623cf9..cc2912ea 100644
--- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java
+++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxVisualObject.java
@@ -25,12 +25,19 @@ package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox;
 
 import java.io.IOException;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
 import at.gv.egiz.pdfas.common.settings.ISettings;
 import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject;
 import at.knowcenter.wag.egov.egiz.table.Table;
 
 public class PdfBoxVisualObject implements IPDFVisualObject {
 
+	private static final Logger logger = LoggerFactory
+			.getLogger(PdfBoxVisualObject.class);
+	
 	private Table abstractTable;
 	private PDFBoxTable table;
 	private float width;
@@ -40,7 +47,7 @@ public class PdfBoxVisualObject implements IPDFVisualObject {
 	private ISettings settings;
 
 	public PdfBoxVisualObject(Table table, ISettings settings)
-			throws IOException {
+			throws IOException, PdfAsException {
 		this.abstractTable = table;
 		this.table = new PDFBoxTable(table, null, settings);
 		this.settings = settings;
@@ -54,8 +61,9 @@ public class PdfBoxVisualObject implements IPDFVisualObject {
 		try {
 			table = new PDFBoxTable(abstractTable, null, this.width,  settings);
 		} catch (IOException e) {
-			// should not occur
-			e.printStackTrace();
+			logger.error("Failed to fix width of Table!", e);
+		} catch (PdfAsException e) {
+			logger.error("Failed to fix width of Table!", e);
 		}
 	}
 
-- 
cgit v1.2.3