Сравнение двух PDF-файлов - PullRequest
9 голосов
/ 15 июля 2011

Мне нужно сравнить содержимое двух почти одинаковых файлов и выделить разнородные части в соответствующем файле PDF.Использую pdfbox.Пожалуйста, помогите мне хотя бы с логикой.

Ответы [ 4 ]

6 голосов
/ 18 июля 2011

Если вы предпочитаете инструмент с графическим интерфейсом, вы можете попробовать это: diffpdf . Это Mark Summerfield , и поскольку он написан с использованием Qt, он должен быть доступен (или должен быть встроен) на всех платформах, на которых работает Qt.

Вот скриншот: enter image description here

4 голосов
/ 18 июля 2011

Вы можете сделать то же самое со сценарием оболочки в Linux. Скрипт включает в себя 3 компонента:

  1. Команда ImageMagick compare
  2. утилита pdftk
  3. Ghostscript

Довольно просто перевести это в .bat Пакетный файл для DOS / Windows ...

Вот строительные блоки:

Pdftk

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

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

сравнить

Используйте эту команду для создания PDF-страницы "diff" для каждой из страниц:

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.

Если вы хотите автоматически обнаруживать все случаи, которые состоят из чисто белых страниц (что означает: нет видимых различий на ваших входных страницах), вы также можете преобразовать в формат точечного рисунка без метаданных, используя вывод bmp256 устройство. Вы можете сделать это для оригинальных PDF-файлов (first.pdf и 2nd.pdf) или для страниц diff-PDF:

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

 md5sum diff_page_001.bmp

Просто создайте полностью белую страницу BMP с ее суммой MD5 (для справки), например:

 gs \
   -o reference-white-page.bmp \
   -r72 \
   -g595x842 \
   -sDEVICE=bmp256 \
   -c "showpage quit"

 md5sum reference-white-page.bmp
2 голосов
/ 09 декабря 2015

У меня была эта проблема, и самый быстрый способ, который я нашел, - это использовать 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
0 голосов
/ 14 июня 2015

Я придумал банку с использованием apache pdfbox для сравнения PDF-файлов - это может сравнить pixel by pixel и выделить различия.

Проверьте мой блог: http://www.testautomationguru.com/introducing-pdfutil-to-compare-pdf-files-extract-resources/ например и скачать.


Чтобы получить количество страниц

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);
...