Sto cercando un buon programma per mostrarmi le differenze tra due file pdf simili. In particolare, sto cercando qualcosa che non funzioni solo su una versione ASCII (con "pdftotext") dei file. Questo è ciò che fa pdfdiff.py .
Sto cercando un buon programma per mostrarmi le differenze tra due file pdf simili. In particolare, sto cercando qualcosa che non funzioni solo su una versione ASCII (con "pdftotext") dei file. Questo è ciò che fa pdfdiff.py .
Risposte:
È possibile utilizzare DiffPDF per questo. Dalla descrizione:
DiffPDF viene utilizzato per confrontare due file PDF. Per impostazione predefinita, il confronto è del testo su ciascuna coppia di pagine, ma è supportato anche il confronto dell'aspetto delle pagine (ad esempio, se un diagramma viene modificato o un paragrafo riformattato). È anche possibile confrontare particolari pagine o intervalli di pagine. Ad esempio, se esistono due versioni di un file PDF, una con le pagine 1-12 e l'altra con le pagine 1-13 a causa dell'aggiunta di una pagina aggiuntiva come pagina 4, è possibile confrontarle specificando due intervalli di pagine, 1 -12 per il primo e 1-3, 5-13 per il secondo. In questo modo DiffPDF confronta le pagine nelle coppie (1, 1), (2, 2), (3, 3), (4, 5), (5, 6) e così via, con (12, 13).
sudo apt-get install diffpdf
.
Ho appena escogitato un trucco per rendere DiffPDF (il programma suggerito da @qbi) utilizzabile per cambiamenti più che lievi. Quello che faccio è concatenare tutte le pagine pdf in una lunga pergamena usando pdfjam e quindi confrontare le pergamene. Funziona anche quando vengono rimosse o inserite grandi sezioni!
Ecco uno script bash che fa il lavoro:
#!/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
Anche se questo non risolve direttamente il problema, ecco un bel modo per fare tutto dalla riga di comando con poche dipendenze:
diff <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
https://linux.die.net/man/1/pdftotext
Funziona davvero bene per i confronti di base in pdf. Se hai una versione più recente di pdftotext puoi provare -bbox
invece di -layout
.
Per quanto riguarda i programmi diffing, mi piace usare diffuse, quindi il comando cambia leggermente:
diffuse <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
http://diffuse.sourceforge.net/
Spero che sia d'aiuto.
Se hai 2-3 enormi file pdf (o epub o altri formati, leggi sotto) da confrontare, è possibile combinare la potenza di:
calibre (per convertire la fonte in testo)
fusione (per cercare visivamente le differenze tra i file di testo)
parallelo (per utilizzare tutti i core del sistema per accelerare)
Lo script seguente accetta come input uno dei seguenti formati di file: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF e LRS.
Se non installato, installare Meld, Calibre e parallelo:
#install packages
sudo apt-get -y install meld calibre parallel
Per poter eseguire il codice da qualsiasi punto del computer, salva il seguente codice in un file chiamato "diffepub" (senza estensioni) all'interno della directory "/ 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
Assicurati che il proprietario sia il tuo utente e disponga delle autorizzazioni di esecuzione:
sudo chown $USER:$USER /usr/local/bin/diffepub
sudo chmod 700 /usr/local/bin/diffepub
Per provarlo, basta digitare:
diffepub FILE1 FILE2
Lo collaudo per confrontare 2 revisioni di un pdf di +1600 pagine e funziona perfettamente. Poiché calibre viene scritto utilizzando Python per la portabilità, sono stati necessari 10 minuti per convertire entrambi i file in testo. Lento, ma affidabile.