比较两个pdf文件

时间:2011-07-15 08:46:41

标签: pdf comparison pdfbox

我需要比较两个几乎相似的文件的内容,并突出显示相应pdf文件中的不同部分。我正在使用pdfbox。请帮助我了解逻辑。

4 个答案:

答案 0 :(得分:6)

如果您更喜欢带有GUI的工具,可以试试这个:diffpdf。它是Mark Summerfield,因为它是用Qt编写的,所以它应该在运行Qt的所有平台上可用(或者应该是可构建的)。

以下是截图:enter image description here

答案 1 :(得分:4)

您可以在Linux上使用shell脚本执行相同的操作。该脚本包含3个组件:

  1. ImageMagick的compare命令
  2. pdftk实用程序
  3. Ghostscript的
  4. 将其转换为DOS / Windows的.bat批处理文件相当容易......

    以下是构建基块:

    PDFTK

    使用此命令将多页PDF文件拆分为多个单页PDF:

    pdftk  first.pdf  burst  output  somewhere/firstpdf_page_%03d.pdf
    pdftk  2nd.pdf    burst  output  somewhere/2ndpdf_page_%03d.pdf
    

    比较

    使用此命令为每个页面创建“diff”PDF页面:

    compare \
           -verbose \
           -debug coder -log "%u %m:%l %e" \
            somewhere/firstpdf_page_001.pdf \
            somewhere/2ndpdf_page_001.pdf \
           -compose src \
            somewhereelse/diff_page_001.pdf
    

    请注意,compare是ImageMagick的一部分。但对于PDF处理,它需要Ghostscript作为'委托',因为它本身不能这样做。

    再一次,pdftk

    现在,您可以再次将“diff”PDF页面与pdftk

    连接起来
    pdftk \
          somewhereelse/diff_page_*.pdf \
          cat \
          output somewhereelse/diff_allpages.pdf
    

    Ghostscript的

    Ghostscript会自动将元数据(例如当前日期+时间)插入其PDF输出中。因此,这对于基于MD5hash的文件比较效果不佳。

    如果您想自动发现所有由纯白页组成的案例(这意味着:输入页面中没有明显的差异),您还可以使用{{1}转换为无元数据的位图格式} 输出设备。您可以为原始PDF(first.pdf和2nd.pdf)或diff-PDF页面执行此操作:

    bmp256

    只需创建一个全白色的BMP页面及其MD5sum(供参考),如下所示:

     gs \
       -o diff_page_001.bmp \
       -r72 \
       -g595x842 \
       -sDEVICE=bmp256 \
        diff_page_001.pdf
    
     md5sum diff_page_001.bmp
    

答案 2 :(得分:2)

我自己遇到了这个问题,我发现最快捷的方法是使用PHP及其绑定ImageMagick(Imagick)。

<?php
$im1 = new \Imagick("file1.pdf");
$im2 = new \Imagick("file2.pdf");

$result = $im1->compareImages($im2, \Imagick::METRIC_MEANSQUAREERROR);

if($result[1] > 0.0){
    // Files are DIFFERENT
}
else{
    // Files are IDENTICAL
}

$im1->destroy();
$im2->destroy();

当然,您需要先安装ImageMagick绑定:

sudo apt-get install php5-imagick # Ubuntu/Debian

答案 3 :(得分:0)

我使用apache pdfbox来比较pdf文件 - 这可以比较pixel by pixel&amp;强调差异。

查看我的博客:http://www.testautomationguru.com/introducing-pdfutil-to-compare-pdf-files-extract-resources/例如&amp;下载。

获取页数

import com.taguru.utility.PDFUtil;

PDFUtil pdfUtil = new PDFUtil();
pdfUtil.getPageCount("c:/sample.pdf"); //returns the page count

将页面内容作为纯文本

//returns the pdf content - all pages
pdfUtil.getText("c:/sample.pdf");

// returns the pdf content from page number 2
pdfUtil.getText("c:/sample.pdf",2);

// returns the pdf content from page number 5 to 8
pdfUtil.getText("c:/sample.pdf", 5, 8);

从PDF中提取附加图像

//set the path where we need to store the images
 pdfUtil.setImageDestinationPath("c:/imgpath");
 pdfUtil.extractImages("c:/sample.pdf");

// extracts & saves the pdf content from page number 3
pdfUtil.extractImages("c:/sample.pdf", 3);

// extracts & saves the pdf content from page 2
pdfUtil.extractImages("c:/sample.pdf", 2, 2);

将PDF页面存储为图像

//set the path where we need to store the images
 pdfUtil.setImageDestinationPath("c:/imgpath");
 pdfUtil.savePdfAsImage("c:/sample.pdf");

在文本模式下比较PDF文件(更快 - 但它不会比较PDF中的格式,图像等)

String file1="c:/files/doc1.pdf";
String file1="c:/files/doc2.pdf";

// compares the pdf documents & returns a boolean
// true if both files have same content. false otherwise.
pdfUtil.comparePdfFilesTextMode(file1, file2);

// compare the 3rd page alone
pdfUtil.comparePdfFilesTextMode(file1, file2, 3, 3);

// compare the pages from 1 to 5
pdfUtil.comparePdfFilesTextMode(file1, file2, 1, 5);

以二进制模式比较PDF文件(较慢 - 逐个像素地比较PDF文档 - 突出显示pdf差异并将结果存储为图像)

String file1="c:/files/doc1.pdf";
String file1="c:/files/doc2.pdf";

// compares the pdf documents & returns a boolean
// true if both files have same content. false otherwise.
pdfUtil.comparePdfFilesBinaryMode(file1, file2);

// compare the 3rd page alone
pdfUtil.comparePdfFilesBinaryMode(file1, file2, 3, 3);

// compare the pages from 1 to 5
pdfUtil.comparePdfFilesBinaryMode(file1, file2, 1, 5);

//if you need to store the result
pdfUtil.highlightPdfDifference(true);
pdfUtil.setImageDestinationPath("c:/imgpath");
pdfUtil.comparePdfFilesBinaryMode(file1, file2);