Diff de deux fichiers pdf?

32

Je cherche 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. C’est ce que pdfdiff.py fait.

    
posée krumpelstiltskin 06.05.2011 - 21:43
la source

4 réponses

17

Je viens juste de trouver un moyen de rendre DiffPDF (le programme suggéré par @qbi) utilisable pour des modifications autres que mineures. Ce que je fais est de concaténer toutes les pages pdfs en un long parchemin en utilisant pdfjam , puis comparez les parchemins. Cela fonctionne même lorsque de grandes sections sont supprimées ou insérées!

Voici un script bash 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
    
réponse donnée krumpelstiltskin 19.05.2013 - 04:33
la source
25

Vous pouvez utiliser DiffPDF pour cela. De la description:

DiffPDF is used to compare two PDF files. By default the comparison is of the text on each pair of pages, but comparing the appearance of pages is also supported (for example, if a diagram is changed or a paragraph reformatted). It is also possible to c> ompare particular pages or page ranges. For example, if there are two versions of a PDF file, one with pages 1-12 and the other with pages 1-13 because of an extra page having been added as page 4, they can be compared by specifying two page ranges, 1-12 for the first and 1-3, 5-13 for the second. This will make DiffPDF compare pages in the pairs (1, 1), (2, 2), (3, 3), (4, 5), (5, 6), and so on, to (12, 13).

    
réponse donnée qbi 07.05.2011 - 01:18
la source
5

Même si cela ne résout pas le problème directement, voici une bonne façon de faire tout cela depuis la ligne de commande avec quelques dépendances:

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

lien

Cela fonctionne vraiment bien pour les comparaisons de base en pdf. Si vous avez une version plus récente de pdftotext, vous pouvez essayer -bbox au lieu de -layout .

Pour ce qui est des programmes, j'aime utiliser diffuse. La commande change donc très légèrement:

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

lien

L’espoir que cela aide.

    
réponse donnée phyatt 11.05.2017 - 17:39
la source
2

Si vous avez 2 ou 3 énormes fichiers pdf (ou epub ou autres formats, lisez ci-dessous) à comparer, il est possible de combiner la puissance de:

  1. calibre (pour convertir votre source en texte)

  2. meld (pour rechercher visuellement les différences entre les fichiers texte)

  3. parallèle (pour utiliser tous les cœurs de votre système pour accélérer)

Le script ci-dessous accepte comme 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é, installez alors meld, calibre et parallèle:

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

Pour pouvoir exécuter le code à partir de n’importe où sur 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})/__/ #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})/__/ #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})/__/ #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 dispose des autorisations d'exécution:

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

Pour le tester, tapez simplement:

diffepub FILE1 FILE2

Je l’ai testé pour comparer 2 révisions d’un pdf de +1600 pages et cela fonctionne parfaitement. Calibre étant écrit en python pour la portabilité, la conversion des deux fichiers en texte a pris 10 minutes. Lent, mais fiable.

    
réponse donnée luis_js 08.09.2015 - 11:02
la source

Lire d'autres questions sur les étiquettes