Diferença de dois arquivos pdf?

36

Estou procurando um bom programa para me mostrar as diferenças entre dois arquivos pdf similares. Em particular, estou procurando por algo que não execute apenas diff em uma versão ascii (com "pdftotext") dos arquivos. Isso é o que pdfdiff.py faz.

    
por krumpelstiltskin 06.05.2011 / 21:43

4 respostas

22

Eu acabei de descobrir um hack para tornar o DiffPDF (o programa sugerido pelo @qbi) utilizável para mais do que pequenas mudanças. O que eu faço é concatenar todas as páginas pdfs em um pergaminho longo usando pdfjam e compare os pergaminhos. Funciona mesmo quando secções grandes são removidas ou inseridas!

Aqui está um script bash que faz o trabalho:

#!/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
    
por krumpelstiltskin 19.05.2013 / 04:33
27

Você pode usar o DiffPDF para isso. A partir da descrição:

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

    
por qbi 07.05.2011 / 01:18
7

Mesmo que isso não resolva o problema diretamente, aqui está uma boa maneira de fazer tudo a partir da linha de comando com poucas dependências:

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

link

Funciona muito bem para comparações básicas de pdf. Se você tem uma versão mais nova do pdftotext, pode tentar -bbox em vez de -layout .

No que diz respeito aos programas de difusão, eu gosto de usar o difusa, então o comando muda levemente:

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

link

Espero que ajude.

    
por phyatt 11.05.2017 / 17:39
3

Se você tem 2-3 arquivos enormes (ou epub ou outros formatos, leia abaixo) para comparar, então é possível combinar o poder de:

  1. calibre (para converter sua fonte em texto)

  2. meld (para procurar visualmente as diferenças entre os arquivos de texto)

  3. paralelo (para usar todos os núcleos do seu sistema para acelerar)

Abaixo do script, aceite como entrada qualquer um dos seguintes formatos de arquivo: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF e LRS.

Se não estiver instalado, instale o meld, o calibre e o paralelo:

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

Para poder executar o código de qualquer lugar em seu computador, salve o seguinte código em um arquivo chamado "diffepub" (sem extensões) dentro do diretório "/ 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

Verifique se o proprietário é seu usuário e se tem permissões de execução:

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

Para testá-lo, basta digitar:

diffepub FILE1 FILE2

Eu testei para comparar duas revisões de um pdf de +1600 páginas e funciona perfeitamente. Como o calibre é escrito usando python para portabilidade, levou 10 minutos para converter os dois arquivos em texto. Lenta, mas confiável.

    
por luis_js 08.09.2015 / 11:02

Tags