2012-05-02 16 views
5

Jestem ciekawy, czy ktoś ma doświadczenie w pisaniu JUnits dla plików PDF generowanych w Javie (szczególnie przez iText). Zrobiłem szybkie wyszukiwanie w google i nie mogłem znaleźć nic konkretnego. Do tej pory udało mi się sprawdzić, czy plik PDF został wygenerowany, ma określoną liczbę stron i dokument jest zamknięty. Ale nie udało mi się zweryfikować zawartości dokumentu. Czy ktoś może podać przykład tego, co zrobił w przeszłości, aby osiągnąć taki wynik? Czy też całkowicie się mylę i JUnits w przypadku moich plików PDF są przesadzone? DziękiPisanie JUnits dla plików PDF generowanych przez iText

+0

Prawdopodobnie można odczytać plik PDF z powrotem (za pomocą programu iText [com.itextpdf.text.pdf.parser.PdfTextExtractor] (http://api.itextpdf.com/itext/com/itextpdf/text/pdf/parser/ PdfTextExtractor.html) lub może [com.itextpdf.text.pdf.PdfReader] (http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfReader.html)), a następnie sprawdź zawartość. – wchargin

+0

Proste podejście do porównywania plików PDF polega na renderowaniu ich do bitmap i porównywaniu bitmap - jest to o.k. tak długo, jak jesteś zainteresowany wyglądem plików PDF i nie interesują Cię metadane itp. –

Odpowiedz

2

Biorąc pod uwagę, że używasz Javy, powinienem spojrzeć na PDFBox (Apache). To, o co prosisz, jest dość trudne, ponieważ retransformowany plik PDF może nie być syntaktycznie identyczny z oryginałem. Być może trzeba pomyśleć o podróżach w obie strony.

Dokumenty takie jak PDF mogą być delikatne w porównaniu. Jeśli okaże się, że porównanie nie powiedzie się, może to niewiele wskazywać na miejsce niepowodzenia. Dokument PDF może być bardzo złożony (drzewa mocno rozgałęzione). Być może będziesz musiał poszukać kanonizacji dokumentu, aby je porównać (robię to dla dokumentów XML).

Domyślam się, że pełny test to przesada i że obecne testy są tak dobre, jak to możliwe, przy rozsądnych kosztach.

AKTUALIZACJA: Sprawdziłem PDFBox dla PDDocument.equals (PDDocument) i nie ma metody deep equals. Sugeruje to, że nie okazało się to opłacalne (wymaga rekurencji w wielu podwęzłach). Istnieje również wiele liczb rzeczywistych, więc wszystkie one muszą być porównane z tolerancją.

Metoda bitmapowa może działać dla ludzi, ale jest bardzo wrażliwa na problemy z liczbami rzeczywistymi - błąd zaokrąglenia zapisuje trochę w innym pikselu. Prawie na pewno zachowa się inaczej w nowej wersji systemu operacyjnego.

Powiązane problemy