Сравнение двух одинаковых PDF-файлов не удается из-за трейлера - PullRequest
0 голосов
/ 07 мая 2020

Я здесь новичок и немного испытал Java. Я создаю простой модульный тест, где я загружаю какой-нибудь PDF-файл и пытаюсь сравнить его с моим локальным файлом.

        final byte[] content = mockMvc.perform(
                get(URL, SAMPLE_1_ID)
                        .contentType(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk())
                .andReturn().getResponse().getContentAsByteArray();

        final byte[] expectedContent = Files.readAllBytes(Paths.get("src\\test\\resources\\my-local-file.pdf"));

        assertThat(content).isEqualTo(expectedContent);

Я пытаюсь сравнить два абсолютно идентичных файла PDF, но когда я использую сравнение байтов , это дает мне:

Expected :[B@1b708791
Actual   :[B@42e6e4b6

На самом деле, я попытался найти, что было не так, и нашел это (при использовании формата вывода String (.getContentAsString()))

В первом файле:

trailer
<</Info 7 0 R/ID [<435536b10a5043b4c9e7a580fddc1aad><0c71af32c6741a3e5d5b226eb852934a>]/Root 6 0 R/Size 8>>
startxref
3274
%%EOF

И во втором файле:

trailer
<</Info 7 0 R/ID [<af96b826e05e3a7d865b83646cae3b40><98b845965d6bf45ee9a8faf6f6be9981>]/Root 6 0 R/Size 8>>
startxref
3274
%%EOF

Как вы можете видеть, идентификаторы разные, поэтому у меня ошибка утверждения

Я обнаружил, что идентификатор сгенерирован уникальный для каждого документа: https://www.oreilly.com/library/view/developing-with-pdf/9781449327903/ch01.html

скриншот

Итак, я понятия не имею, как я могу сравнить эти два файла.

По умолчанию я не могу изменить ответ, поэтому, возможно, я смогу использовать что-то более умное, чем побайтовое сравнение, что-то, что может распознавать содержимое файла и использовать только его.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Если кому-то интересно, я нашел для себя одно возможное решение. Я использовал библиотеку com.itextpdf, предоставленную

Это решение, которое я использовал:

        final byte[] content = performRequestToDownloadPdfReport(SAMPLE_1_ID); 
        final PdfReader reader_on_actual_content = new PdfReader(content);
        final String actual_parsed_content = PdfTextExtractor.getTextFromPage(reader_on_actual_content, NumberUtils.INTEGER_ONE);

        final PdfReader reader_on_expected_content = new PdfReader("src/test/resources/sample-history-report.pdf");
        final String expected_parsed_content = PdfTextExtractor.getTextFromPage(reader_on_expected_content, NumberUtils.INTEGER_ONE);

        assertThat(actual_parsed_content).isEqualTo(expected_parsed_content);

В моем прим. У меня есть файл * .pdf только с одной страницей, поэтому я могу использовать PdfTextExtractor.getTextFromPage() для извлечения необходимого содержимого и сравнения его с ожидаемым.

0 голосов
/ 07 мая 2020

Google предлагает визуализировать PDF-файл как изображение и сравнить изображения, как это делает эта библиотека:

Там являются более гибкими решениями, такими как эта библиотека:

...