diff --git a/.gitignore b/.gitignore index 72fc850..bf0bf37 100644 --- a/.gitignore +++ b/.gitignore @@ -122,4 +122,5 @@ reise_bestand_ws_war/overlays # Gradle build/ -*.pdf \ No newline at end of file +*.pdf +output/ diff --git a/src/main/java/de/redsix/pdfcompare/AbstractCompareResultWithSwap.java b/src/main/java/de/redsix/pdfcompare/AbstractCompareResultWithSwap.java index 60e27af..53f4415 100644 --- a/src/main/java/de/redsix/pdfcompare/AbstractCompareResultWithSwap.java +++ b/src/main/java/de/redsix/pdfcompare/AbstractCompareResultWithSwap.java @@ -58,14 +58,16 @@ private boolean writeTo(final PDFMergerUtility mergerUtility) { swapToDisk(); Utilities.shutdownAndAwaitTermination(swapExecutor, "Swap"); try { - LOG.trace("Merging..."); + LOG.info("Merging..."); Instant start = Instant.now(); for (Path path : FileUtils.getPaths(getTempDir(), "partial_*")) { mergerUtility.addSource(path.toFile()); } mergerUtility.mergeDocuments(Utilities.getMemorySettings(environment.getMergeCacheSize())); Instant end = Instant.now(); + LOG.trace("Merging took: {}ms", Duration.between(start, end).toMillis()); + } catch (IOException e) { throw new RuntimeException(e); } finally { @@ -115,11 +117,11 @@ private synchronized void swapToDisk() { if (!images.isEmpty()) { swapped = true; getExecutor(environment).execute(() -> { - LOG.trace("Swapping {} pages to disk", images.size()); + LOG.info("Swapping {} pages to disk", images.size()); Instant start = Instant.now(); final int minPageIndex = images.keySet().iterator().next(); - LOG.trace("minPageIndex: {}", minPageIndex); + LOG.info("minPageIndex: {}", minPageIndex); try (PDDocument document = new PDDocument(Utilities.getMemorySettings(environment.getSwapCacheSize()))) { document.setResourceCache(new ResourceCacheWithLimitedImages(environment)); addImagesToDocument(document, images); @@ -129,7 +131,7 @@ private synchronized void swapToDisk() { throw new RuntimeException(e); } Instant end = Instant.now(); - LOG.trace("Swapping took: {}ms", Duration.between(start, end).toMillis()); + LOG.info("Swapping took: {}ms", Duration.between(start, end).toMillis()); }); } } diff --git a/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java b/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java index f239c46..a7a12fb 100644 --- a/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java +++ b/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java @@ -16,6 +16,8 @@ package de.redsix.pdfcompare; import de.redsix.pdfcompare.env.Environment; +import x.team.tool.MergeImages; + import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; @@ -122,21 +124,25 @@ protected boolean keepImages() { } @Override - public synchronized void addPage(final PageDiffCalculator diffCalculator, final int pageIndex, - final ImageWithDimension expectedImage, final ImageWithDimension actualImage, final ImageWithDimension diffImage) { - Objects.requireNonNull(expectedImage, "expectedImage is null"); - Objects.requireNonNull(actualImage, "actualImage is null"); - Objects.requireNonNull(diffImage, "diffImage is null"); - this.hasDifferenceInExclusion |= diffCalculator.differencesFoundInExclusion(); - diffPercentages.put(pageIndex, diffCalculator.getDifferenceInPercent()); - if (diffCalculator.differencesFound()) { - isEqual = false; - diffAreas.add(diffCalculator.getDiffArea()); - diffImages.put(pageIndex, diffImage); - pages++; - } else if (environment.addEqualPagesToResult()) { - diffImages.put(pageIndex, diffImage); - pages++; + public synchronized void addPage(final PageDiffCalculator diffCalculator, final int pageIndex,final ImageWithDimension expectedImage, final ImageWithDimension actualImage, final ImageWithDimension diffImage) { + if(this.environment.getEnableHorizontalCompareOutput()) { + this.addPageWithHorizontalCompare(diffCalculator, pageIndex, expectedImage, actualImage, diffImage); + }else { + Objects.requireNonNull(expectedImage, "expectedImage is null"); + Objects.requireNonNull(actualImage, "actualImage is null"); + Objects.requireNonNull(diffImage, "diffImage is null"); + + this.hasDifferenceInExclusion |= diffCalculator.differencesFoundInExclusion(); + if (diffCalculator.differencesFound()) { + isEqual = false; + diffAreas.add(diffCalculator.getDiffArea()); + diffImages.put(pageIndex, diffImage); + pages++; + } else if (environment.addEqualPagesToResult()) { + diffImages.put(pageIndex, diffImage); + pages++; + } + } } @@ -211,4 +217,33 @@ public void actualOnly() { public void setEnvironment(Environment environment) { this.environment = environment; } + + @Override + public void addPageWithHorizontalCompare(PageDiffCalculator diffCalculator, int pageIndex, + ImageWithDimension expectedImage, ImageWithDimension actualImage, ImageWithDimension diffImage) { + + Objects.requireNonNull(expectedImage, "expectedImage is null"); + Objects.requireNonNull(actualImage, "actualImage is null"); + Objects.requireNonNull(diffImage, "diffImage is null"); + this.hasDifferenceInExclusion |= diffCalculator.differencesFoundInExclusion(); + + //Creto una nuova immagine con a sinistra l'atteso e a destra l'attuale con segnate le differenze + MergeImages merge=new MergeImages(); + ImageWithDimension mergedImage=null; + if(pageIndex==0) { + mergedImage=merge.mergeOnLeft(expectedImage, diffImage,PdfComparator.headerLeft,PdfComparator.headerRight); + }else { + mergedImage=merge.mergeOnLeft(expectedImage, diffImage,null,null); + } + + if (diffCalculator.differencesFound()) { + isEqual = false; + diffAreas.add(diffCalculator.getDiffArea()); + diffImages.put(pageIndex, mergedImage); + pages++; + } else if (environment.addEqualPagesToResult()) { + diffImages.put(pageIndex, mergedImage); + pages++; + } + } } diff --git a/src/main/java/de/redsix/pdfcompare/DiffImage.java b/src/main/java/de/redsix/pdfcompare/DiffImage.java index a056274..488a9c6 100644 --- a/src/main/java/de/redsix/pdfcompare/DiffImage.java +++ b/src/main/java/de/redsix/pdfcompare/DiffImage.java @@ -2,14 +2,29 @@ import static de.redsix.pdfcompare.PdfComparator.MARKER_WIDTH; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + import de.redsix.pdfcompare.env.Environment; + + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + +import com.sun.org.apache.xalan.internal.xsltc.compiler.sym; + import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; + public class DiffImage { private static final Logger LOG = LoggerFactory.getLogger(DiffImage.class); @@ -49,6 +64,9 @@ public int getPage() { } public void diffImages() { + + System.out.println("TEST JVM 1"); + BufferedImage expectBuffImage = this.expectedImage.bufferedImage; BufferedImage actualBuffImage = this.actualImage.bufferedImage; expectedBuffer = expectBuffImage.getRaster().getDataBuffer(); @@ -75,8 +93,9 @@ public void diffImages() { final int actualLineOffset = y * actualImageWidth; final int resultLineOffset = y * resultImageWidth; for (int x = 0; x < resultImageWidth; x++) { - expectedElement = getExpectedElement(x, y, expectedLineOffset); + expectedElement = getExpectedElement(x, y, expectedLineOffset); actualElement = getActualElement(x, y, actualLineOffset); + //this.salvaSuFileImmagine(actualBuffer, expectedBuffer); int element = getElement(expectedElement, actualElement); if (pageExclusions.contains(x, y)) { element = ImageTools.fadeExclusion(element); @@ -87,8 +106,10 @@ public void diffImages() { if (expectedElement != actualElement) { extendDiffArea(x, y); diffCalculator.diffFound(); + LOG.trace("Difference found on page: {} at x: {}, y: {}", page + 1, x, y); mark(resultBuffer, x, y, resultImageWidth); + } } resultBuffer.setElem(x + resultLineOffset, element); @@ -96,7 +117,7 @@ public void diffImages() { } if (diffCalculator.differencesFound()) { diffCalculator.addDiffArea(new PageArea(page + 1, diffAreaX1, diffAreaY1, diffAreaX2, diffAreaY2)); - LOG.info("Differences found at { page: {}, x1: {}, y1: {}, x2: {}, y2: {} }", page + 1, diffAreaX1, diffAreaY1, diffAreaX2, + LOG.debug("Differences found at { page: {}, x1: {}, y1: {}, x2: {}, y2: {} }", page + 1, diffAreaX1, diffAreaY1, diffAreaX2, diffAreaY2); } final float maxWidth = Math.max(expectedImage.width, actualImage.width); @@ -104,7 +125,69 @@ public void diffImages() { compareResult.addPage(diffCalculator, page, expectedImage, actualImage, new ImageWithDimension(resultImage, maxWidth, maxHeight)); } - private void extendDiffArea(final int x, final int y) { + private void salvaSuFileImmagine(DataBuffer actualBuffer2, DataBuffer expectedBuffer2) { + System.out.println("********************* DATA BUFFER ACTUAL ******************************"); + String actualBuffer=""; + System.out.println("Inizio a leggere actualbuffer..."); + int value=0; + for(int i=0;i { private final T compareResult; private String expectedPassword = ""; private String actualPassword = ""; - private boolean withIgnoreCalled = false; + + private boolean withIgnoreCalled = false; + public static String headerLeft=""; + public static String headerRight=""; + private final ConcurrentLinkedQueue exceptionFromOtherThread = new ConcurrentLinkedQueue<>(); + /** * Compare two PDFs, that are given as base64 encoded strings. * diff --git a/src/main/java/de/redsix/pdfcompare/ResultCollector.java b/src/main/java/de/redsix/pdfcompare/ResultCollector.java index 85970f1..1a157bf 100644 --- a/src/main/java/de/redsix/pdfcompare/ResultCollector.java +++ b/src/main/java/de/redsix/pdfcompare/ResultCollector.java @@ -5,6 +5,10 @@ public interface ResultCollector { void addPage(PageDiffCalculator diffCalculator, int pageIndex, ImageWithDimension expectedImage, ImageWithDimension actualImage, ImageWithDimension diffImage); + void addPageWithHorizontalCompare(PageDiffCalculator diffCalculator, int pageIndex, + ImageWithDimension expectedImage, ImageWithDimension actualImage, ImageWithDimension diffImage); + + void noPagesFound(); default void done() {} diff --git a/src/main/java/de/redsix/pdfcompare/env/ConfigFileEnvironment.java b/src/main/java/de/redsix/pdfcompare/env/ConfigFileEnvironment.java index ad3162e..76ad340 100644 --- a/src/main/java/de/redsix/pdfcompare/env/ConfigFileEnvironment.java +++ b/src/main/java/de/redsix/pdfcompare/env/ConfigFileEnvironment.java @@ -65,7 +65,9 @@ public Path getTempDirectory() { @Override public int getNrOfImagesToCache() { - return config.getInt("imageCacheSizeCount"); + return(0); + //return config.getInt("imageCacheSizeCount"); + } @Override @@ -137,4 +139,9 @@ public boolean failOnMissingIgnoreFile() { private int getMB(final String path) { return config.getInt(path) * 1024 * 1024; } + + @Override + public boolean getEnableHorizontalCompareOutput() { + return false; + } } diff --git a/src/main/java/de/redsix/pdfcompare/env/Environment.java b/src/main/java/de/redsix/pdfcompare/env/Environment.java index c039e0c..88a023e 100644 --- a/src/main/java/de/redsix/pdfcompare/env/Environment.java +++ b/src/main/java/de/redsix/pdfcompare/env/Environment.java @@ -32,4 +32,6 @@ public interface Environment { boolean addEqualPagesToResult(); boolean failOnMissingIgnoreFile(); + + boolean getEnableHorizontalCompareOutput(); } diff --git a/src/main/java/de/redsix/pdfcompare/env/SimpleEnvironment.java b/src/main/java/de/redsix/pdfcompare/env/SimpleEnvironment.java index 0291fac..1d03449 100644 --- a/src/main/java/de/redsix/pdfcompare/env/SimpleEnvironment.java +++ b/src/main/java/de/redsix/pdfcompare/env/SimpleEnvironment.java @@ -37,6 +37,7 @@ public class SimpleEnvironment implements Environment { private Integer dpi; private Boolean addEqualPagesToResult; private Boolean failOnMissingIgnoreFile; + private Boolean enableHorizontalCompareOutput=false; public SimpleEnvironment() { this(DefaultEnvironment.create()); @@ -186,4 +187,17 @@ public SimpleEnvironment setFailOnMissingIgnoreFile(final boolean b) { this.failOnMissingIgnoreFile = b; return this; } + + public SimpleEnvironment setEnableHorizontalCompareOutput(Boolean enableHorizontalCompareOutput) { + this.enableHorizontalCompareOutput = enableHorizontalCompareOutput; + return this; + } + + public boolean getEnableHorizontalCompareOutput() { + return enableHorizontalCompareOutput; + } + + + + } diff --git a/src/main/java/x/team/poc/POC.java b/src/main/java/x/team/poc/POC.java new file mode 100644 index 0000000..dc70495 --- /dev/null +++ b/src/main/java/x/team/poc/POC.java @@ -0,0 +1,33 @@ +package x.team.poc; + +import java.awt.Color; + +import de.redsix.pdfcompare.CompareResult; +import de.redsix.pdfcompare.PdfComparator; +import de.redsix.pdfcompare.env.SimpleEnvironment; + +public class POC { + + public static void main(String[] args) { + try { + + PdfComparator compare = new PdfComparator("input/expected.pdf", "input/actual.pdf") + .withEnvironment(new SimpleEnvironment().setActualColor(Color.red) + .setExpectedColor(Color.white).setAddEqualPagesToResult(true) + .setEnableHorizontalCompareOutput(true)); + + CompareResult result = compare.compare(); + result .writeTo("output/diffOutput"); + if (result.isNotEqual()) { + System.out.println("Ho trovato differenza!"); + } + if (result.isEqual()) { + System.out.println("Non ho trovato nessuna differenza!"); + } + result.getDifferences(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/x/team/tool/MergeImages.java b/src/main/java/x/team/tool/MergeImages.java new file mode 100644 index 0000000..975c226 --- /dev/null +++ b/src/main/java/x/team/tool/MergeImages.java @@ -0,0 +1,61 @@ +package x.team.tool; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; + +import javax.imageio.ImageIO; + +import de.redsix.pdfcompare.ImageWithDimension; + +public class MergeImages { + + public ImageWithDimension mergeOnLeft(ImageWithDimension left, ImageWithDimension right, String headerLeft, + String headerRight) { + BufferedImage newImage = null; + ImageWithDimension nuovaImmag = null; + try { + ImageIO.write(left.getBufferedImage(), "PNG", new File("left.png")); + ImageIO.write(right.getBufferedImage(), "PNG", new File("right.png")); + + float totalWidth = left.getBufferedImage().getWidth() + right.getBufferedImage().getWidth(); + float maxHeight = Math.max(left.getBufferedImage().getHeight(), right.getBufferedImage().getHeight()); + + // System.out.println("totalWidth:" + totalWidth); + // System.out.println("maxHeight:" + maxHeight); + BufferedImage combined = new BufferedImage(Math.round(totalWidth), Math.round(maxHeight), + BufferedImage.TYPE_INT_ARGB); + Graphics g = combined.getGraphics(); + + if (headerLeft != null && !headerLeft.isEmpty()) { + Graphics leftG = left.getBufferedImage().getGraphics(); + leftG.setColor(Color.black); + int fontSize = 50; + leftG.setFont(new Font(g.getFont().getFontName(), Font.BOLD, 50)); + leftG.drawString(headerLeft, Math.round(left.getBufferedImage().getWidth() / 2), fontSize); + } + if (headerRight != null && !headerRight.isEmpty()) { + Graphics rightG = right.getBufferedImage().getGraphics(); + rightG.setColor(Color.black); + int fontSize = 50; + rightG.setFont(new Font(g.getFont().getFontName(), Font.BOLD, 50)); + rightG.drawString(headerRight, Math.round(right.getBufferedImage().getWidth() / 2), fontSize); + + } + + //ImageIO.write(left.getBufferedImage(), "PNG", new File("left.png")); + g.drawImage(left.getBufferedImage(), 0, 0, null); + g.drawImage(right.getBufferedImage(), Math.round(left.getBufferedImage().getWidth()), 0, null); + ImageIO.write(combined, "PNG", new File("comb.png")); + g.dispose(); + nuovaImmag = new ImageWithDimension(combined, combined.getWidth(), combined.getHeight()); + // ImageIO.write(nuovaImmag.getBufferedImage(), "PNG", new + // File("output/combfinal.png")); + } catch (Exception e) { + e.printStackTrace(); + } + return (nuovaImmag); + } +}