kali - Comparación de PDF en línea de comandos de Linux
comandos shell linux (3)
Aquí hay un truco para hacerlo.
pdftotext file1.pdf
pdftotext file2.pdf
diff file1.txt file2.txt
Estoy buscando una herramienta de línea de comandos de Linux para comparar dos archivos PDF y guardar los diffs en un archivo PDF. La herramienta debe crear diff-pdf en un proceso por lotes. Los archivos PDF son planes de construcción, por lo que la comparación de texto pura no funciona.
Algo como:
<tool> file1.pdf file2.pdf -o diff-out.pdf
La mayoría de las herramientas que encontré convierten los archivos PDF a imágenes y los comparo, pero solo con una GUI.
Cualquier otra solución también es bienvenida.
He escrito mi propio script que hace algo similar a lo que estás pidiendo. El script usa 4 herramientas para lograr su objetivo:
- Comando de
compare
de ImageMagick - la utilidad
pdftk
(si tiene archivos PDF de varias páginas) - Ghostscript (opcional)
-
md5sum
(opcional)
Debería ser bastante fácil portar esto a un archivo por lotes .bat
para DOS / Windows.
Pero primero, tenga en cuenta: esto solo funciona bien para archivos PDF que tienen la misma página / tamaño de medios. La comparación se realiza píxel por píxel entre los dos archivos PDF de entrada. El archivo resultante es una imagen que muestra el "diff" de esta manera:
- Cada píxel que permanece sin cambios se vuelve blanco.
- Cada píxel que se cambió está pintado en rojo.
Esa imagen de diferencia se guarda como un nuevo PDF para que sea más accesible en diferentes plataformas de sistema operativo.
Estoy usando esto, por ejemplo, para descubrir diferencias mínimas en la visualización de la página cuando entra en juego la sustitución de fuentes en el procesamiento de PDF.
Podría suceder que no haya una diferencia visible entre sus archivos PDF, aunque son diferentes en hash MD5 y / o tamaño de archivo. En este caso, la página PDF de salida "diff" se volvería completamente blanca. Puede descubrir automáticamente esta condición, por lo que solo debe investigar visualmente los PDF no blancos eliminando automáticamente los blancos.
Aquí están los bloques de construcción:
pdftk
Utilice esta utilidad de línea de comando para dividir archivos PDF de varias páginas en varios archivos PDF de una sola página:
pdftk file_1.pdf burst output somewhere/file_1---page_%03d.pdf
pdftk file_2.pdf burst output somewhere/file_2---page_%03d.pdf
Si está comparando solo archivos PDF de 1 página, este building block es opcional. Como hablas de "planes de construcción", este es probablemente el caso.
comparar
Utilice esta utilidad de línea de comandos de ImageMagick para crear una página PDF "diff" para cada una de las páginas:
compare /
-verbose /
-debug coder /
-log "%u %m:%l %e" /
somewhere/file_1---page_001.pdf /
somewhere/file_2---page_001.pdf /
-compose src /
somewhereelse/file_1--file_2---diff_page_001.pdf
Ghostscript
Debido a metadatos insertados automáticamente (como la fecha actual + hora), la salida PDF no funciona bien para las comparaciones de archivos basados en MD5hash.
Si desea descubrir automáticamente todos los casos en que el PDF de diferenciación consta de una página puramente blanca, debe convertir la página PDF a un formato de mapa de bits sin metadatos utilizando el dispositivo de salida bmp256
. Puedes hacer eso así:
Primero, descubra cuál es el formato de tamaño de página de su PDF. Una vez más, este pequeño identify
utilidad viene como parte de cualquier instalación de ImageMagick:
identify /
-format "%[fx:(w)]x%[fx:(h)]" /
somewhereelse/file_1--file_2---diff_page_001.pdf
Puede almacenar este valor en una variable de entorno como esta:
export my_size=$(identify /
-format "%[fx:(w)]x%[fx:(h)]" /
somewhereelse/file_1--file_2---diff_page_001.pdf)
Ahora Ghostscript entra en juego, usando una línea de comandos que incluye el tamaño de página descubierto anteriormente como se almacena en la variable:
gs /
-o somewhereelse/file_1--file_2---diff_page_001.ppm /
-sDEVICE=ppmraw /
-r72 /
-g${my_size} /
somewhereelse/file_1--file_2---diff_page_001.pdf
Esto le proporciona un PPM (Portable PixMap) con una resolución de 72 ppp desde la página PDF original. Normalmente, 72 ppp es lo suficientemente bueno para lo que queremos ... A continuación, cree una página PPM puramente blanca con el mismo tamaño de página:
gs /
-o somewhereelse/file_1--file_2---whitepage_001.ppm /
-sDEVICE=ppmraw /
-r72 /
-g${my_size} /
-c "showpage"
La parte -c "showpage"
es un comando PostScript que le dice a Ghostscript que emita solo una página vacía.
Suma MD5
Use el hash MD5 para comparar automáticamente el PPM original con el PPM de página blanca. En caso de que sean iguales, puede suponer que no existen diferencias entre los archivos PDF y, por lo tanto, cambiar el nombre o eliminar el PDF dif:
MD5_1=$(md5sum somewhereelse/file_1--file_2---diff_page_001.ppm | awk ''{print $1}'')
MD5_2=$(md5sum somewhereelse/file_1--file_2---whitepage_001.ppm | awk ''{print $1}'')
if [ "x${MD5_1}" == "x${MD5_2}" ]; then
mv /
somewhereelse/file_1--file_2---diff_page_001.pdf /
somewhereelse/file_1--file_2---NODIFFERENCE_page_001.pdf # rename all-white PDF
rm /
somewhereelse/file_1--file_2---*_page_001.ppm # delete both PPMs
fi
Esto le evita tener que inspeccionar visualmente "archivos PDF de diferencias" que no tienen ninguna diferencia.
Hecho en 2 líneas con (allmighty) imagemagick y pdftk:
compare -verbose -debug coder $PDF_1 $PDF_2 -compose src $OUT_FILE.tmp
pdftk $OUT_FILE.tmp background $PDF_1 output $OUT_FILE
Las opciones -verbose y -debug son opcionales.
- compare crea un PDF con el diff como píxeles rojos.
- pdftk fusiona el diff-pdf con fondo PDF_1