Diff di due file pdf?


39

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 .


Deve essere open source e gratuito?
Rinzwind,

@Rinzwind: sarebbe preferibile, ovviamente.
krumpelstiltskin,

inetsoftware.de/other-products/pdf-content-comparer/… 2.2 qui afferma che può essere utilizzato sotto Linux (runPDFC.sh) ma il file non è nell'archivio (solo una mazza ...) ma è java quindi forse rinominandolo (?)
Rinzwind

@Rinzwind: non so abbastanza di Java per capire perché non funziona. lo faccio: java -cp. -jar PDFC.jar ma ottieni un java.lang.NoClassDefFoundError :(
krumpelstiltskin

@Rinzwind: l'ho eseguito su Windows; il programma è terribile. crea png che sono illeggibili.
Krumpelstiltskin,

Risposte:


28

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


2
Questo è il migliore che abbia mai visto. L'unico problema che vedo è che confronta i pdf pagina per pagina. Quindi se aggiungi un paragrafo su diciamo, pagina 1, l'inizio e la fine di ogni pagina dopo non corrispondono. :(
krumpelstiltskin

3
Penso che il link non sia più corretto. La nuova versione 3. * sembra essere disponibile solo per Windows. La vecchia versione 2. * può comunque essere installata tramite sudo apt-get install diffpdf.
peq

22

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

2
Ho reso il tuo script compatibile con gli spazi bianchi e ho aggiunto tempfile unici. Spero non ti dispiaccia.
Glutanimate,

2
Risolto anche un piccolo bug in cui lo script avrebbe creato un file di testo vuoto nella directory di lavoro. (ricordati di usare sempre doppie parentesi con istruzioni if ​​che usano ">" e operandi correlati.)
Glutanimate,

2
Un'ultima osservazione: questo script funzionerà bene solo per documenti in formato DIN A4. Dovrai regolare il valore PAGEHEIGHT per farlo funzionare con documenti più piccoli. Sono sicuro che c'è un modo per automatizzare questo, ma non so come atm.
Glutanimate,

2
Grazie per aver apportato i miglioramenti a @Glutanimate. Ho aggiunto il supporto per il confronto di pdf di dimensioni arbitrarie e diverse (purché le pagine all'interno di ciascun pdf siano di dimensioni uniformi, cioè).
Krumpelstiltskin,

salvato in un gist per comodità gist.github.com/timabell/9616807b2fe3fa60f234
Tim Abell

8

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


4

Se hai 2-3 enormi file pdf (o epub o altri formati, leggi sotto) da confrontare, è possibile combinare la potenza di:

  1. calibre (per convertire la fonte in testo)

  2. fusione (per cercare visivamente le differenze tra i file di testo)

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.