Zróżnicowane dwa pliki pdf?

39

Szukam dobrego programu, który pokazałby mi różnice między dwoma podobnymi plikami pdf. W szczególności szukam czegoś, co nie tylko uruchomi różnicę w wersji ascii (z „pdftotext”) plików. To właśnie robi pdfdiff.py .

krumpelstiltskin
źródło
Czy musi to być oprogramowanie open source i bezpłatne?
Rinzwind
@Rinzwind: Oczywiście byłoby to lepsze.
krumpelstiltskin
inetsoftware.de/other-products/pdf-content-comparer/... 2.2 tutaj stwierdza, że ​​można go używać pod Linuksem (runPDFC.sh), ale plik nie znajduje się w archiwum (tylko nietoperz ...), ale jest java, więc może zmiana nazwy (?)
Rinzwind
@Rinzwind: Nie wiem wystarczająco dużo o Javie, aby dowiedzieć się, dlaczego nie działa. robię: java -cp. -jar PDFC.jar, ale otrzymaj java.lang.NoClassDefFoundError :(
krumpelstiltskin
@Rinzwind: uruchomiłem to w systemie Windows; program jest okropny. tworzy png, które są nieczytelne.
krumpelstiltskin

Odpowiedzi:

28

Możesz do tego użyć DiffPDF . Z opisu:

DiffPDF służy do porównywania dwóch plików PDF. Domyślnie porównanie dotyczy tekstu na każdej parze stron, ale obsługiwane jest również porównywanie wyglądu stron (na przykład, jeśli schemat zostanie zmieniony lub sformatowany akapit). Można także c> porównać poszczególne strony lub zakresy stron. Na przykład, jeśli istnieją dwie wersje pliku PDF, jedna ze stronami 1-12, a druga ze stronami 1-13 z powodu dodania dodatkowej strony jako strony 4, można je porównać, określając dwa zakresy stron, 1 -12 dla pierwszego i 1-3, 5-13 dla drugiego. Spowoduje to, że DiffPDF porówna strony w parach (1, 1), (2, 2), (3, 3), (4, 5), (5, 6) i tak dalej, do (12, 13).

qbi
źródło
2
To jest najlepsze, co widziałem. Jedyny problem, jaki widzę, to porównanie pliku pdf strona po stronie. Więc jeśli dodasz akapit na powiedzmy na stronie 1, początek i koniec każdej strony po nim nie będą pasować. :(
krumpelstiltskin
3
Myślę, że link nie jest już poprawny. Nowa wersja 3. * wydaje się być dostępna tylko dla systemu Windows. Jednak stara wersja 2. * może być nadal instalowana za pośrednictwem sudo apt-get install diffpdf.
peq
22

Właśnie wymyśliłem włamanie, aby DiffPDF (program sugerowany przez @qbi) mógł być wykorzystywany do więcej niż drobnych zmian. To, co robię, to łączenie wszystkich stron pdf w długi przewijanie za pomocą pdfjam, a następnie porównywanie zwojów. Działa nawet po usunięciu lub wstawieniu dużych sekcji!

Oto skrypt bash, który wykonuje zadanie:

#!/bin/bash
#
# Compare two PDF files.
# Dependencies:
#  - pdfinfo (xpdf)
#  - pdfjam  (texlive-extra-utils)
#  - diffpdf
#

MAX_HEIGHT=15840  #The maximum height of a page (in points), limited by pdfjam.

TMPFILE1=$(mktemp /tmp/XXXXXX.pdf)
TMPFILE2=$(mktemp /tmp/XXXXXX.pdf)

usage="usage: scrolldiff -h FILE1.pdf FILE2.pdf
  -h print this message

v0.0"

while getopts "h" OPTIONS ; do
    case ${OPTIONS} in
        h|-help) echo "${usage}"; exit;;
    esac
done
shift $(($OPTIND - 1))

if [ -z "$1" ] || [ -z "$2" ] || [ ! -f "$1" ] || [ ! -f "$2" ]
then
  echo "ERROR: input files do not exist."
  echo
  echo "$usage"
  exit
fi

    #Get the number of pages:
pages1=$( pdfinfo "$1" | grep 'Pages' - | awk '{print $2}' )
pages2=$( pdfinfo "$2" | grep 'Pages' - | awk '{print $2}' )
numpages=$pages2
if [[ $pages1 > $pages2 ]]
then
  numpages=$pages1
fi

     #Get the paper size:
width1=$( pdfinfo "$1" | grep 'Page size' | awk '{print $3}' )
height1=$( pdfinfo "$1" | grep 'Page size' | awk '{print $5}' )
width2=$( pdfinfo "$2" | grep 'Page size' | awk '{print $3}' )
height2=$( pdfinfo "$2" | grep 'Page size' | awk '{print $5}' )

if [ $(bc <<< "$width1 < $width2") -eq 1 ]
then
  width1=$width2
fi
if [ $(bc <<< "$height1 < $height2") -eq 1 ]
then
  height1=$height2
fi

height=$( echo "scale=2; $height1 * $numpages" | bc )
if [ $(bc <<< "$MAX_HEIGHT < $height") -eq 1 ]
then
  height=$MAX_HEIGHT
fi
papersize="${width1}pt,${height}pt"



    #Make the scrolls:
pdfj="pdfjam --nup 1x$numpages --papersize {${papersize}} --outfile"
$pdfj "$TMPFILE1" "$1"
$pdfj "$TMPFILE2" "$2"

diffpdf "$TMPFILE1" "$TMPFILE2"

rm -f $TMPFILE1 $TMPFILE2
krumpelstiltskin
źródło
2
Zrobiłem twój skrypt kompatybilny z białymi spacjami i dodałem unikalne pliki tymczasowe. Mam nadzieję, że nie masz nic przeciwko.
Glutanimate,
2
Naprawiono również mały błąd, w którym skrypt tworzył pusty plik tekstowy w katalogu roboczym. (pamiętaj, aby zawsze używać podwójnych nawiasów, jeśli instrukcje, które używają „>” i powiązanych argumentów.)
Glutanimate
2
Ostatnia uwaga: ten skrypt będzie działał dobrze tylko dla dokumentów formatu A4. Będziesz musiał dostosować wartość PAGEHEIGHT, aby działała z mniejszymi dokumentami. Jestem pewien, że istnieje sposób na zautomatyzowanie tego, ale nie wiem jak atm.
Glutanimate,
2
Dziękujemy za dokonanie ulepszeń @Glutanimate. Dodałem obsługę porównywania plików pdf o dowolnych i różnych rozmiarach (o ile strony w każdym pliku pdf mają jednakowy rozmiar).
krumpelstiltskin
zapisane w pamięci
Tim Abell,
8

Chociaż to nie rozwiązuje problemu bezpośrednio, oto dobry sposób na zrobienie tego wszystkiego z wiersza polecenia z kilkoma zależnościami:

diff <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)

https://linux.die.net/man/1/pdftotext

Działa naprawdę dobrze w przypadku podstawowych porównań pdf. Jeśli masz nowszą wersję pdftotext, możesz spróbować -bboxzamiast -layout.

Jeśli chodzi o różne programy, lubię używać rozproszonego, więc polecenie zmienia się nieznacznie:

diffuse <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)

http://diffuse.sourceforge.net/

Mam nadzieję, że to pomaga.

phyatt
źródło
3

Jeśli masz 2-3 duże pliki pdf (lub epub lub inne formaty, czytaj poniżej) do porównania, możesz połączyć moc:

  1. calibre (do konwersji źródła na tekst)

  2. meld (do wizualnego wyszukiwania różnic między plikami tekstowymi)

  3. równoległy (aby przyspieszyć wszystkie rdzenie systemu)

Poniższy skrypt akceptuje jako dane wejściowe dowolny z następujących formatów plików: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF i LRS.

Jeśli nie jest zainstalowany, zainstaluj meld, calibre i równoległy:

#install packages
sudo apt-get -y install meld calibre parallel

Aby móc wykonać kod z dowolnego miejsca na komputerze, zapisz następujący kod w pliku o nazwie „diffepub” (bez rozszerzeń) w katalogu „/ usr / local / bin”.

usage="
*** usage:

diffepub - compare text in two files. Valid format for input files are:
MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF and LRS.

diffepub -h | FILE1 FILE2

-h print this message

Example:
diffepub my_file1.pdf my_file2.pdf
diffepub my_file1.epub my_file2.epub

v0.2 (added parallel and 3 files processing)
"

#parse command line options
while getopts "h" OPTIONS ; do
  case ${OPTIONS} in
    h|-help) echo "${usage}"; exit;;
  esac
done
shift $(($OPTIND - 1))

#check if first 2 command line arguments are files
if [ -z "$1" ] || [ -z "$2" ] || [ ! -f "$1" ] || [ ! -f "$2" ]
then
  echo "ERROR: input files do not exist."
  echo
  echo "$usage"
  exit
fi



#create temporary files (first & last 10 characters of
# input files w/o extension)
file1=`basename "$1" | sed -r -e '
s/\..*$//                     #strip file extension
s/(^.{1,10}).*(.{10})/\1__\2/ #take first-last 10 chars
s/$/_XXX.txt/                 #add tmp file extension
'`
TMPFILE1=$(mktemp --tmpdir "$file1")

file2=`basename "$2" | sed -r -e '
s/\..*$//                     #strip file extension
s/(^.{1,10}).*(.{10})/\1__\2/ #take first-last 10 chars
s/$/_XXX.txt/                 #add tmp file extension
'`
TMPFILE2=$(mktemp --tmpdir "$file2")

if [ "$#" -gt 2 ] 
then
  file3=`basename "$3" | sed -r -e '
  s/\..*$//                     #strip file extension
  s/(^.{1,10}).*(.{10})/\1__\2/ #take first-last 10 chars
  s/$/_XXX.txt/                 #add tmp file extension
  '`
  TMPFILE3=$(mktemp --tmpdir "$file3")
fi

#convert to txt and compare using meld
doit(){ #to solve __space__ between filenames and parallel
  ebook-convert $1
}
export -f doit
if [ "$#" -gt 2 ] 
then
  (parallel doit ::: "$1 $TMPFILE1" \
                     "$2 $TMPFILE2" \
                     "$3 $TMPFILE3" ) &&
  (meld "$TMPFILE1" "$TMPFILE2" "$TMPFILE3")
else
  (parallel doit ::: "$1 $TMPFILE1" \
                     "$2 $TMPFILE2" ) &&
  (meld "$TMPFILE1" "$TMPFILE2")
fi

Upewnij się, że właścicielem jest Twój użytkownik i ma uprawnienia do wykonywania:

sudo chown $USER:$USER /usr/local/bin/diffepub
sudo chmod 700 /usr/local/bin/diffepub

Aby to przetestować, po prostu wpisz:

diffepub FILE1 FILE2

Testuję to, aby porównać 2 wersje pdf +1600 stron i działa idealnie. Ponieważ kaliber został napisany za pomocą Pythona w celu przenoszenia, konwersja obu plików na tekst zajęła 10 minut. Powolny, ale niezawodny.

luis_js
źródło