小小少年QAQ 2024-05-20 21:42 采纳率: 31.6%
浏览 11

pdf文件差异比较,推荐工具

spriboot中,项目需要两个pdf文件比较差异性包括(文字、图片等),有什么工具支持这样的操作吗

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-20 21:42
    关注

    引自免费微信小程序:皆我百晓生

    在Spring Boot项目中进行PDF文件的差异比较,可以借助Java中的第三方库iText7实现。以下是详细的步骤和代码示例。

    首先,你需要在你的Spring Boot项目中添加iText7的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:

    <dependencies>
        <!-- ... -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.2.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-layout</artifactId>
            <version>7.2.3</version>
        </dependency>
        <!-- ... -->
    </dependencies>
    

    接下来,你可以编写一个服务类,用于比较两个PDF文件的差异。这里是一个简单的例子,它会遍历每个页面并比较文本内容。注意,这只是一个基础的文本比较,不包含图片的比较,因为iText7没有内置的方法来精确地比较PDF中的图片。对于图片的比较,可能需要使用其他图像处理库,例如OpenCV。

    创建一个新的Java类,例如PdfComparatorService.java:

    import com.itextpdf.kernel.pdf.PdfDocument;
    import com.itextpdf.kernel.pdf.PdfReader;
    import com.itextpdf.layout.Document;
    import com.itextpdf.layout.element.Paragraph;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    public class PdfComparatorService {
    
        public void comparePdfFiles(String path1, String path2) {
            try (PdfReader reader1 = new PdfReader(path1);
                 PdfReader reader2 = new PdfReader(path2)) {
    
                PdfDocument document1 = new PdfDocument(reader1);
                PdfDocument document2 = new PdfDocument(reader2);
    
                int n1 = document1.getNumberOfPages();
                int n2 = document2.getNumberOfPages();
    
                if (n1 != n2) {
                    System.out.println("Number of pages are different: " + n1 + " vs. " + n2);
                } else {
                    for (int i = 1; i <= n1; i++) {
                        Document doc1 = new Document(document1.getPage(i));
                        Document doc2 = new Document(document2.getPage(i));
    
                        List<Paragraph> elements1 = doc1.listElements();
                        List<Paragraph> elements2 = doc2.listElements();
    
                        for (int j = 0; j < elements1.size(); j++) {
                            Paragraph element1 = elements1.get(j);
                            Paragraph element2 = elements2.get(j);
    
                            if (!element1.getValue().equals(element2.getValue())) {
                                System.out.println("Difference found on page " + i + ": " + element1.getValue());
                            }
                        }
    
                        doc1.close();
                        doc2.close();
                    }
                }
    
                document1.close();
                document2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    现在,在你的主控制器或其他地方,你可以实例化这个服务类并调用comparePdfFiles方法来比较两个PDF文件:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.File;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    @Controller
    public class PdfCompareController {
    
        @Autowired
        private PdfComparatorService pdfComparatorService;
    
        @PostMapping("/compare")
        public String comparePdf(@RequestParam("file1") MultipartFile file1,
                                 @RequestParam("file2") MultipartFile file2,
                                 HttpServletRequest request) throws IOException {
    
            // Save uploaded files to a temporary directory
            File tempDir = Files.createTempDirectory("pdf-compare").toFile();
            Path path1 = Paths.get(tempDir.getAbsolutePath(), file1.getOriginalFilename());
            Path path2 = Paths.get(tempDir.getAbsolutePath(), file2.getOriginalFilename());
    
            Files.write(path1, file1.getBytes());
            Files.write(path2, file2.getBytes());
    
            // Compare the PDFs
            pdfComparatorService.comparePdfFiles(path1.toAbsolutePath().toString(),
                                                 path2.toAbsolutePath().toString());
    
            return "comparison_result"; // Return a view or any response you want
        }
    }
    

    这个示例仅比较了文本内容,并且是基于页面级别的。如果你想对图片进行更深入的比较,可能需要使用其他工具或库,比如OpenCV,然后结合iText7或者其他PDF处理库来提取和比较图片。

    注意:这个示例只展示了如何比较PDF的文本部分,对于复杂的布局和格式,以及图片的比较,可能需要更复杂的逻辑。同时,对于大量PDF的比较,可能需要优化性能,例如使用多线程。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月20日

悬赏问题

  • ¥15 idea 编辑语言的选择
  • ¥15 Windows下部署Asmjit
  • ¥15 请问双层规划模型的上下层目标函数不一致,是如何保证迭代收敛性的
  • ¥15 微信小程序 前端页面内容搜索
  • ¥15 cpu是如何判断当前指令已经执行完毕,然后去执行下条指令的
  • ¥15 安装visual studio2022时visualstudiosetup启动不了,闪退。问题代号0x0和0x1389
  • ¥30 java spring boot2.5.3版本websocket连不上
  • ¥15 angular js调外部链接查看pdf
  • ¥15 openFOAM DPMFoam
  • ¥15 将查询到的值,赋值到table指定行中