diff options
3 files changed, 54 insertions, 15 deletions
diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/IDGenerator.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/IDGenerator.java new file mode 100644 index 00000000..cdb7873b --- /dev/null +++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/IDGenerator.java @@ -0,0 +1,5 @@ +package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; + +public interface IDGenerator { + public String createHashedId(String value); +} 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 9c1adcec..de944d43 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 @@ -26,10 +26,12 @@ package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.security.MessageDigest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -37,6 +39,9 @@ import java.util.Map; import javax.imageio.ImageIO; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.io.IOUtils; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; @@ -65,7 +70,7 @@ import at.gv.egiz.pdfas.common.settings.ISettings; import at.gv.egiz.pdfas.common.utils.ImageUtils; import at.knowcenter.wag.egov.egiz.table.Entry; -public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { +public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder implements IDGenerator { private static final Logger logger = LoggerFactory .getLogger(PDFAsVisualSignatureBuilder.class); @@ -116,6 +121,17 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { getStructure().setTemplate(template); } + public String createHashedId(String value) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-1"); + md.reset(); + return Hex.encodeHexString(md.digest(value.getBytes("UTF-8"))); + } catch(Throwable e) { + logger.warn("Failed to generate ID for Image using value", e); + return value; + } + } + private void readTableResources(PDFBoxTable table, PDDocument template) throws PdfAsException, IOException { @@ -162,15 +178,33 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { for (int j = 0; j < row.size(); j++) { Entry cell = (Entry) row.get(j); if (cell.getType() == Entry.TYPE_IMAGE) { - String img_ref = (String) cell.getValue(); + String img_value = (String) cell.getValue(); + String img_ref = createHashedId(img_value); if (!images.containsKey(img_ref)) { - File img_file = ImageUtils.getImageFile(img_ref, settings); - BufferedImage img = null; + try { - img = ImageIO.read(img_file); - } catch (IOException e) { - throw new PdfAsException("error.pdf.stamp.04", e); + File img_file = ImageUtils.getImageFile(img_value, settings); + + try { + img = ImageIO.read(img_file); + } catch (IOException e) { + throw new PdfAsException("error.pdf.stamp.04", e); + } + } catch(PdfAsException | IOException e) { + ByteArrayInputStream bais = null; + try { + bais = new ByteArrayInputStream(Base64.decodeBase64(img_value)); + img = ImageIO.read(bais); + bais.close(); + } catch(Throwable e1) { + // Ignore value is not base 64! + logger.debug("Value is not base64: ", e1); + // rethrow e + throw e; + } finally { + IOUtils.closeQuietly(bais); + } } float width = colsSizes[j]; @@ -250,7 +284,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { TableDrawUtils.drawTable(getStructure().getPage(), stream, 1, 1, designer.getWidth(), designer.getHeight(), properties.getMainTable(), template, false, - innerFormResources, images, settings); + innerFormResources, images, settings, this); stream.close(); PDStream innterFormStream = getStructure().getPage().getContents(); getStructure().setInnterFormStream(innterFormStream); diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java index 1530ab03..dff8e543 100644 --- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java +++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java @@ -54,7 +54,7 @@ public class TableDrawUtils { PDPageContentStream contentStream, float x, float y, float width, float height, PDFBoxTable abstractTable, PDDocument doc, boolean subtable, PDResources formResources, - Map<String, ImageObject> images, ISettings settings) + Map<String, ImageObject> images, ISettings settings, IDGenerator generator) throws PdfAsException { logger.debug("Drawing Table: X {} Y {} WIDTH {} HEIGHT {} \n{}", x, y, @@ -69,14 +69,14 @@ public class TableDrawUtils { doc, subtable, settings); drawContent(page, contentStream, x, y, width, height, abstractTable, - doc, subtable, formResources, images, settings); + doc, subtable, formResources, images, settings, generator); } public static void drawContent(PDPage page, PDPageContentStream contentStream, float x, float y, float width, float height, PDFBoxTable abstractTable, PDDocument doc, boolean subtable, PDResources formResources, - Map<String, ImageObject> images, ISettings settings) + Map<String, ImageObject> images, ISettings settings, IDGenerator generator) throws PdfAsException { float contentx = x; @@ -124,7 +124,7 @@ public class TableDrawUtils { drawImage(page, contentStream, contentx, contenty, colWidth, abstractTable.getRowHeights()[i], padding, abstractTable, doc, cell, formResources, - images, settings); + images, settings, generator); break; case Entry.TYPE_TABLE: @@ -137,7 +137,7 @@ public class TableDrawUtils { drawTable(page, contentStream, contentx, contenty - abstractTable.getRowHeights()[i], colWidth, abstractTable.getRowHeights()[i], tbl_value, doc, - true, formResources, images, settings); + true, formResources, images, settings, generator); break; default: logger.warn("Unknown Cell entry type: " + cell.getType()); @@ -329,12 +329,12 @@ public class TableDrawUtils { float width, float height, float padding, PDFBoxTable abstractTable, PDDocument doc, Entry cell, PDResources formResources, Map<String, ImageObject> images, - ISettings settings) throws PdfAsException { + ISettings settings, IDGenerator generator) throws PdfAsException { try { float innerHeight = height; float innerWidth = width; - String img_ref = (String) cell.getValue(); + String img_ref = generator.createHashedId((String) cell.getValue()); if (!images.containsKey(img_ref)) { logger.warn("Image not prepared! : " + img_ref); throw new PdfAsException("Image not prepared! : " + img_ref); |