# PDF Vergleichen



## ARadauer (28. Okt 2009)

Hi ich bin gerade dabei, ein kleines Test System für PDF Generatoren zu schreiben.
Ich habe nun ein paar PDF Files erstellt und müsste sie auf Unterschiede vergleichen. Wie gehe ich an so ein Problem heran?
Ich denke daran die PDFs in Bilder umzuwandeln, zu subtrahieren und vielleicht dann das Differnzbild azuszuwerten...

Hat schon schon mal jemand sowas gemcht. bzw wie könnte ich am einfachstenein PDF in ein Jpg umwandeln?

Danke


----------



## ARadauer (28. Okt 2009)

https://pdf-renderer.dev.java.net/examples.html

Das java.awt.Image hätte ich schon... weiß jemand, wie ich diese am einfachsten subtrahieren kann?


----------



## maki (28. Okt 2009)

Was genau willst du denn Testen?
Ob der pdf-generator richtig funktioniert? Hast du den geschrieben?


----------



## ARadauer (28. Okt 2009)

maki hat gesagt.:


> Was genau willst du denn Testen?
> Ob der pdf-generator richtig funktioniert? Hast du den geschrieben?



Unterschiede zwischen Ibex Versionen...



> java.lang.ArrayIndexOutOfBoundsException: 1
> at com.sun.pdfview.colorspace.PDFColorSpace.getColorSpace(PDFColorSpace.java:196)
> at com.sun.pdfview.PDFImage.createImage(PDFImage.java:160)
> at com.sun.pdfview.PDFParser.doImage(PDFParser.java:950)
> ...


danke sun...


Geht mir um so dinge wie.. ist eh nix Abgeschnitten, sind die Bilder gleich groß, ist alles an der richtigen stelle...

Konkreter vielleicht, eine andere Abteilung sagt: "wir wollen die Version unserers XSL:FO Processors umstellen, hat das eh keine Auswirkungen bei euch?" Ich muss nun einen rießen Haufen Vorlagen testen... das will ich einwenig automatisieren...


----------



## maki (28. Okt 2009)

> danke sun...


Das ist nicht Suns Fehler, bedanke dich bei dem Entwickler der auf die idiotische Idee kam com.sun.* packages zu verwenden, das soll man nämlich nicht, denn diese sind intern, können sich jederzeit ändern und sind nicht Teil des JDKs.

In der Tat, ein unangenehmes Problem, viellciht wäre hier der Weg über eine high-level PDF Api besser um die Dokumente zu vergleichen als über Bilder, ein eigener Assert wäre jedenfalls das Ziel.


----------



## ARadauer (28. Okt 2009)

> Das ist nicht Suns Fehler, bedanke dich bei dem Entwickler der auf die idiotische Idee kam com.sun.* packages zu verwenden, das soll man nämlich nicht, denn diese sind intern, können sich jederzeit ändern und sind nicht Teil des JDKs.


Das war ich, vor... 15 Minuten... Ich wollte einfach schnell ein Bild aus dem PDF machen, das war nur mal ein Versuch...



> über eine high-level PDF Api besser um die Dokumente zu vergleichen


Wie meinst du das? Bzw welche meinst du?


----------



## maki (28. Okt 2009)

k.A. ehrlich gesagt, hat PDFBox da nix?



> Konkreter vielleicht, eine andere Abteilung sagt: "wir wollen die Version unserers XSL:FO Processors umstellen, hat das eh keine Auswirkungen bei euch?" Ich muss nun einen rießen Haufen Vorlagen testen... das will ich einwenig automatisieren...


Dazu sind normale Unitest bzw. learning Tests sehr gut geeignet, klappt prima bei "normalen Frameworks (Hibernate, Spring, etc. pp.), dein Problem ist eben das Format (pdf), wie gesagt, würde da nicht Bilder vergleichen sondern versuchen das über high-level zu lösen, schlimmstenfalls das PDF File manuell parsen...

Was auch eght wäre das du eine erstellte & verifizierte Version des PDF unter deinem Testressourcen ablegst und es als "expected" betrachtest, dann dagegen deine neu erstellten und zu verifizierenden PDFs vergleichst.

NAHCTRAG: Bin gerade über jpdfunit gestolpert, k.A. ob das funnzt, würde ich an deiner Stelle  aber mal testen


----------



## ARadauer (28. Okt 2009)

Wie soll ich vergleichen? Um das gehts mir. Was meinst du mit high-level, bzw manuell parsen?
Es geht mir darum, ob die PDF gleich aussehen sollen. 

PDFBox ... schau ich mir gleich an...


----------



## maki (28. Okt 2009)

Was ich meine ist, dass du rigendwie eine Methode haben müsstest, die ungefähr so aussieht:

```
public static void assertPdfFilesAreEqual(String message, File expected, File actual) {
...
}
```
Oder so ähnlich.

Bei solchen Dingen sind autom. Tests immer kompliziert.


----------



## ARadauer (28. Okt 2009)

jpdfunit ist nicht gerade das was ich suche. Es geht mir wirklich primär um das Aussehen, (Abstände, Ränder usw...) des PDF. Irgendwelche Texte die im PDF sein müssen zu überprüfen, macht keinen Sinn, da diese sicher drinnen sind, nur ob an den richtigen Stellen, das ist die Frage... bzw "richtig" stimmt auch nicht ganz... sondern eher an der selben Stellen wie beim anderen PDF..

PDFBox  hat mir da schon mehr geholfen. Jetzt hab ich Bilder der PDFs und möchte diese miteinander Vergleichen. Es geht mir nicht darum, dass ich jeden Tag 200 Tests ausführe, sondern eher dass ich einen Testaufwand von 20 Stunden den ich jede 6 Monate habe auf 2 Stunden reduziere...

Meine Frage jetzt: Ich habe zwei BufferedImages und möchte in Diffenzbild daraus erstellen, wie mache ich das am einfachsten?

 Ich weiß noch in Matlab war das einfach sowas... img3 = img2-img1;


----------



## ARadauer (28. Okt 2009)

```
BufferedImage img1 = readFile(pdf[0]);
      BufferedImage img2 = readFile(pdf[1]);   
      BufferedImage img3 = new BufferedImage(img1.getWidth(), img1.getHeight(), img1.getType());
      
      Graphics2D g2 =(Graphics2D) img3.getGraphics();
      g2.drawImage(img1,0,0, null);
      g2.setXORMode(Color.white);
      g2.drawImage(img2,0,0, null);
      ImageIO.write(img3, "jpeg", new File("c://out/new.jpg"));
```
.... 
das wollte ich...


----------



## ARadauer (28. Okt 2009)

Die Bilder die mit PDFBox erstellt sehen anders aus als das PDF im Acrobat oder im Druck... tja dann war das umsonst...


----------



## musiKk (28. Okt 2009)

Das hängt halt immer davon ab, was für Features in den Dokumenten sind. Je ausgefallener, desto unwahrscheinlicher ist natürlich, dass freie Libraries diese unterstützen. Der Support ist da sehr gemischt. Du kannst Dir ja mal JPedal anschauen, das scheint wohl recht gut zu sein.

Oder Du wartest nochmal sechs bis zwölf Monate, bis meine PDF-Library fertig ist...


----------



## objcler (29. Okt 2009)

Wieso machst du nicht einfach ein Hash aus den beiden Dateien und vergleichst den?


----------



## ARadauer (29. Okt 2009)

objcler hat gesagt.:


> Wieso machst du nicht einfach ein Hash aus den beiden Dateien und vergleichst den?



Weil es mir nicht darum geht, ob es die gleichen Dokumente sind. Sondern ob sie gleich/fast gleich aussehen.


----------



## Unregistriert (30. Okt 2009)

ARadauer hat gesagt.:


> Die Bilder die mit PDFBox erstellt sehen anders aus als das PDF im Acrobat oder im Druck... tja dann war das umsonst...



Das hätte ich dir auch gleich sagen können.

Der Acrobat hat auch noch eine Einstellung für Bildschirmbetrachtung die das PDF-Verändern, zumindest Farbwerte, Kantenglättung, etc....

Vor einiger Zeit hatte ich auch mit PDF-Erstellung mit iText zu tun.

Abhängig, davon ob eine bestimmte Grafik auf einer Seite eingebunden war, veränderten sich andere Farbwerte auf der Seite beim Betrachten mit dem Acrobat-Reader. 

Das selbe Dokument im Foxit-Reader lieferte die in iText angegebenen Farbwerte zurück.

Acrobat geht da einen sehr eigenen Weg, man könnte fast meinen die wären eine Tochter von MS.


----------



## ARadauer (30. Okt 2009)

> Der Acrobat hat auch noch eine Einstellung für Bildschirmbetrachtung die das PDF-Verändern, zumindest Farbwerte, Kantenglättung, etc....


ein Rahmen der im Druck und im Acrobat durchgängig ist, ist im erstellten Bild strichliert...


----------

