diff options
author | Christian Maierhofer <cmaierhofer@iaik.tugraz.at> | 2016-06-13 13:17:30 +0200 |
---|---|---|
committer | Andreas Fitzek <andreas.fitzek@iaik.tugraz.at> | 2016-08-17 16:46:09 +0200 |
commit | 06705460473fe1d911d29f264b9ac505d5111fbf (patch) | |
tree | cda49ac87432643f1a9a0a4b03df4e7c4de02017 /pdf-as-pdfbox-2/src/main/java/at/knowcenter/wag | |
parent | 4a0feb2e69b86cd4a7c574de49907af2620f5e23 (diff) | |
download | pdf-as-4-06705460473fe1d911d29f264b9ac505d5111fbf.tar.gz pdf-as-4-06705460473fe1d911d29f264b9ac505d5111fbf.tar.bz2 pdf-as-4-06705460473fe1d911d29f264b9ac505d5111fbf.zip |
Modified sig-block positioning to image-based
Diffstat (limited to 'pdf-as-pdfbox-2/src/main/java/at/knowcenter/wag')
-rw-r--r-- | pdf-as-pdfbox-2/src/main/java/at/knowcenter/wag/egov/egiz/pdfbox2/pdf/PDFUtilities.java | 181 |
1 files changed, 133 insertions, 48 deletions
diff --git a/pdf-as-pdfbox-2/src/main/java/at/knowcenter/wag/egov/egiz/pdfbox2/pdf/PDFUtilities.java b/pdf-as-pdfbox-2/src/main/java/at/knowcenter/wag/egov/egiz/pdfbox2/pdf/PDFUtilities.java index c1578120..79e75b99 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/knowcenter/wag/egov/egiz/pdfbox2/pdf/PDFUtilities.java +++ b/pdf-as-pdfbox-2/src/main/java/at/knowcenter/wag/egov/egiz/pdfbox2/pdf/PDFUtilities.java @@ -48,65 +48,150 @@ */ package at.knowcenter.wag.egov.egiz.pdfbox2.pdf; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; import java.io.IOException; -import java.util.Iterator; -import java.util.List; +import java.util.HashMap; -import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageTree; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.rendering.PDFRenderer; +import org.apache.pdfbox.tools.imageio.ImageIOUtil; -import at.gv.egiz.pdfas.common.exceptions.PDFIOException; +import at.gv.egiz.pdfas.lib.impl.pdfbox2.positioning.PositioningRenderer; +import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; -/** - * Contains useful helpers for accessing PDF documents. - * - * @author wprinz - * @author mruhmer - */ public abstract class PDFUtilities { - public static float calculatePageLength(PDDocument document, int page, - float effectivePageHeight, /* int pagerotation, */boolean legacy32, boolean legacy40) - throws PDFIOException { - // int last_page_id = document.getNumberOfPages(); - PDPageTree allPages = document.getDocumentCatalog().getPages(); - PDPage pdpage = allPages.get(page); - // pdpage.setRotation(pagerotation); - return calculatePageLength(pdpage, effectivePageHeight, legacy32, legacy40); - } - public static float calculatePageLength(PDPage page, - float effectivePageHeight, boolean legacy32, boolean legacy40) throws PDFIOException { - try { - PDFPage my_page = new PDFPage(effectivePageHeight, legacy32, legacy40); - //PDResources resources = page.getResources(); - if (page.getContents() != null) { - //COSStream stream = page.getContents(); - // List<PDThreadBead> articles = page.getThreadBeads(); - // my_page.processMyPage(page); - //my_page.processStream(page, resources, stream); //TODO: pdfbox2 -> right? - my_page.processPage(page); - } - if (!legacy32) { - if (page.getAnnotations() != null) { - Iterator<PDAnnotation> annotationsIt = page - .getAnnotations().iterator(); + public static Color MAGIC_COLOR = new Color(152,254,52);// green-ish background + + public static float getMaxYPosition( + PDDocument pdfDataSource, int page, IPDFVisualObject pdfTable, float signatureMarginVertical, float footer_line) throws IOException { + long t0 = System.currentTimeMillis(); + PositioningRenderer renderer = new PositioningRenderer(pdfDataSource); + //BufferedImage bim = renderer.renderImage(page); + long t1 = System.currentTimeMillis(); + int width = (int) pdfDataSource.getPage(page).getCropBox().getWidth(); + int height = (int) pdfDataSource.getPage(page).getCropBox().getHeight(); + BufferedImage bim = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + long t2 = System.currentTimeMillis(); + Graphics2D graphics = bim.createGraphics(); + long t3 = System.currentTimeMillis(); +// graphics.setPaint(MAGIC_COLOR); +// graphics.fillRect(0, 0, width, height); + graphics.setBackground(MAGIC_COLOR); + + renderer.renderPageToGraphics(page, graphics); + long t4 = System.currentTimeMillis(); + Color bgColor = MAGIC_COLOR; + + if(true){ //only used if background color should be determined automatically + bgColor = determineBackgroundColor(bim); + } + long t5 = System.currentTimeMillis(); + int yCoord = bim.getHeight() - 1 - (int)footer_line; - while (annotationsIt.hasNext()) { - PDAnnotation annotation = annotationsIt.next(); - if (!annotation.isInvisible()) { - my_page.processAnnotation(annotation); - } - } + for(int row = yCoord; row >= 0; row--){ + for(int col = 0; col < bim.getWidth(); col++){ + int val = bim.getRGB(col, row); + if(val != bgColor.getRGB()){ + yCoord = row; + row=-1; + break; } } - return my_page.getMaxPageLength(); - } catch (IOException e) { - throw new PDFIOException("error.pdf.stamp.11", e); } + long t6 = System.currentTimeMillis(); + + System.out.println("new Renderer: "+ (t1-t0)); + System.out.println("new BI: "+ (t2-t1)); + System.out.println("Create Graphics: "+ (t3-t2)); + System.out.println("Render to Graphics: "+ (t4-t3)); + System.out.println("Determined bg color: "+ (t5-t4)); + System.out.println("Calc y: "+ (t6-t5)); + +// for(int i=0; i < bim.getWidth(); i++){ +// bim.setRGB(i, yCoord, 255); +// } +// + ImageIOUtil.writeImage(bim, "/home/cmaierhofer/temp/bufferer.png", 72); + + return yCoord; } + +// public static float getFreeTablePosition( +// PDDocument pdfDataSource, int page, IPDFVisualObject pdfTable, float signatureMarginVertical) throws IOException { +// +// float table_height = pdfTable.getHeight(); +// +// PDFRenderer renderer = new PDFRenderer(pdfDataSource); +// +// BufferedImage bim = renderer.renderImage(page); +// +// Color bgColor = determineBackgroundColor(bim); +// float posY = bim.getHeight(); +// +// for(int row=0; row<bim.getHeight();row++){ +// boolean backgroundOnly = true; +// int countFreeRows = 0; +// for(int c = row; c<bim.getHeight();c++){ +// countFreeRows++; +// for(int col = 0; col < bim.getWidth(); col++){ +// int val = bim.getRGB(col, c); +// if(val != bgColor){//end of bg +// backgroundOnly = false; +// row = c; +// break; +// } +// } +// if(!backgroundOnly){ +// break; +// }else{ +// if(countFreeRows >= table_height+signatureMarginVertical){ +// posY = row; +// row=bim.getHeight(); +// break; +// } +// } +// } +// } +// +// if(posY == -1) +// return Float.NEGATIVE_INFINITY; +// return posY; +// } + + public static Color determineBackgroundColor(BufferedImage bim){ + + int inset = 5;//px + + int pixelUpLeft = bim.getRGB(inset,inset); + int pixelUpRight = bim.getRGB(bim.getWidth()-inset,inset); + int pixelDownLeft = bim.getRGB(inset, bim.getHeight()-inset); + int pixelDownRight = bim.getRGB(bim.getWidth()-inset, bim.getHeight()-inset); + + HashMap<Integer, Integer> stats = new HashMap<Integer, Integer>(); + stats.put(pixelUpLeft, 0); + stats.put(pixelUpRight, 0); + stats.put(pixelDownLeft, 0); + stats.put(pixelDownRight, 0); + + stats.put(pixelUpLeft, stats.get(pixelUpLeft)+1); + stats.put(pixelUpRight, stats.get(pixelUpRight)+1); + stats.put(pixelDownLeft, stats.get(pixelDownLeft)+1); + stats.put(pixelDownRight, stats.get(pixelDownRight)+1); + int bgValue = -1; + int cnt =0; + for(int key:stats.keySet()){ + if(stats.get(key) > cnt){ + cnt = stats.get(key); + bgValue = key; + } + } + + return new Color(bgValue); + } + } |