Сравнение двух одинаковых файлов PDF не удается из-за трейлера

Я новичок здесь и немного опытен в 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

скриншот

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

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


person Evgeniy Mukhamadiarov    schedule 07.05.2020    source источник


Ответы (2)


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

Есть более гибкие решения, такие как эта библиотека:

person JohannesB    schedule 07.05.2020
comment
Спасибо за ваш совет! К сожалению, в моем проекте я был вынужден использовать только уже реализованные библиотеки, и, к счастью для меня, я нашел подходящую для решения моей проблемы) - person Evgeniy Mukhamadiarov; 08.05.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 только с 1 страницей, поэтому я могу использовать PdfTextExtractor.getTextFromPage() для извлечения необходимого содержимого и сравнения его с ожидаемым.

person Evgeniy Mukhamadiarov    schedule 08.05.2020