57 votes

Diffusion de deux fichiers pdf ?

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.

38voto

cbp Points 229

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).

35voto

krumpelstiltskin Points 2398

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

10voto

phyatt Points 201

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.

4voto

luis_js Points 221

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 :

  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 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.

2voto

N0rbert Points 86925

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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X