Je suis à la recherche d'un bon programme pour me montrer les différences entre deux fichiers pdf similaires. En particulier, je cherche quelque chose qui ne se contente pas de lancer diff sur une version ascii (avec "pdftotext") des fichiers. Voici ce que je recherche pdfdiff.py fait.
Réponses
Trop de publicités?Vous pouvez utiliser DiffPDF pour ça. D'après la description :
D . Par défaut, la comparaison est du texte sur chaque paire de pages, mais mais la comparaison de l'apparence des pages est également prise en charge (par exemple, si un diagramme est modifié ou un paragraphe reformaté). Il est également possible de c> omparer des pages ou des plages de pages pages. [ ] deux versions d'un fichier PDF, l'une avec les pages 1-12 et l'autre avec les pages 1-13 en raison d'une page supplémentaire qui a été ajoutée comme page 4, elles peuvent être comparées en spécifiant deux plages de pages, 1-12 pour la première et 1-3, 5-13 pour la seconde. Ainsi, DiffPDF comparera les pages des paires (1, 1), (2, 2), (3, 3), (4, 5), (5, 6), et ainsi de suite, jusqu'à (12, 13).
Je viens de trouver un hack pour rendre DiffPDF (le programme suggéré par @qbi) utilisable pour des changements plus que mineurs. Ce que je fais, c'est concaténer toutes les pages pdfs en un long défilement en utilisant pdfjam et ensuite comparer les parchemins. Cela fonctionne même lorsque de grandes sections sont retirées ou insérées !
Voici un bash script qui fait le travail :
#!/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
Même si cela ne résout pas directement le problème, voici une bonne façon de faire tout cela à partir de la ligne de commande avec peu de dépendances :
diff <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
https://linux.die.net/man/1/pdftotext
Il fonctionne très bien pour les comparaisons basiques de pdf. Si vous avez une version plus récente de pdftotext vous pouvez essayer -bbox
au lieu de -layout
.
En ce qui concerne les programmes de différenciation, j'aime utiliser diffuse, donc la commande change légèrement :
diffuse <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
http://diffuse.sourceforge.net/
J'espère que cela vous aidera.
Si vous avez 2 ou 3 gros fichiers pdf (ou epub ou d'autres formats, voir ci-dessous) à comparer, il est possible de combiner la puissance de :
-
calibre (pour convertir votre source en texte)
-
meld (pour rechercher visuellement les différences entre les fichiers texte)
-
parallèle (pour utiliser tous les cœurs de votre système afin d'accélérer)
Le script ci-dessous accepte en entrée l'un des formats de fichier suivants : MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF et LRS.
S'il n'est pas installé, alors installez meld, calibre et parallel :
#install packages
sudo apt-get -y install meld calibre parallel
Pour pouvoir exécuter le code depuis n'importe quel endroit de votre ordinateur, enregistrez le code suivant dans un fichier nommé "diffepub" (sans extension) dans le répertoire "/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
Assurez-vous que le propriétaire est votre utilisateur et qu'il a les droits d'exécution :
sudo chown $USER:$USER /usr/local/bin/diffepub
sudo chmod 700 /usr/local/bin/diffepub
Pour le tester, il suffit de taper :
diffepub FILE1 FILE2
Je l'ai testé pour comparer 2 révisions d'un pdf de +1600 pages et cela fonctionne parfaitement. Comme calibre est écrit en Python pour la portabilité, il a fallu 10 minutes pour convertir les deux fichiers en texte. Lent, mais fiable.
En complément de la réponse ci-dessus à propos de diff
y diffuse
nous pouvons utiliser Meld comme outil de comparaison graphique - installez-le avec
sudo apt-get install meld
et ensuite comparer les documents avec une commande comme
meld <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
Personnellement, je préfère Meld à DiffUse de Kdiff3.
- Réponses précédentes
- Plus de réponses