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 .
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 .
Odpowiedzi:
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).
sudo apt-get install diffpdf
.
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
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ć -bbox
zamiast -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.
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:
calibre (do konwersji źródła na tekst)
meld (do wizualnego wyszukiwania różnic między plikami tekstowymi)
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.