首页 > 解决方案 > 由于预告片,两个相同 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

实际上,我试图找出错误并发现了这一点(使用字符串输出格式(.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

正如你所看到的,ID 不同,这就是我有断言失败的原因

我发现每个文档的标识符都是唯一的: https ://www.oreilly.com/library/view/developing-with-pdf/9781449327903/ch01.html

截屏

所以,我不知道如何比较这两个文件。

默认情况下,我不能修改响应,所以也许我可以使用比字节到字节比较更智能的东西,可以识别文件内容并只使用它的东西。

标签: javapdfjunitmocking

解决方案


Google 建议您应该将 PDF 呈现为图像并像此库那样比较图像:

有像这个库这样更灵活的解决方案:


推荐阅读