Si vos pages "identiques" ont exactement la même apparence visuelle à l'écran, l'approche algorithmique suivante pourrait permettre de détecter les doublons :
- Convertissez chaque page en un fichier TIFF ou JPEG basse résolution à l'aide de Ghostscript (c'est-à-dire en 72 dpi).
- Si vous utilisez le format TIFF : exécutez l'une des options suivantes libtiff des utilitaires en ligne de commande pour "normaliser" les métadonnées TIFF.
- Exécutez md5sum.exe sur chaque page TIFF ou JPEG et mémorisez la somme Md5 de chaque page.
- Trier la liste des MD5sums pour trouver les pages dupliquées.
- Se souvenir de tous les numéros de page en double à supprimer.
- Exécuter un
pdftk.exe
sur le PDF original pour supprimer les doublons.
Vous pouvez coder cet algorithme dans n'importe quel langage (même batch sous Windows ou bash sous Linux/Unix/MacOSX).
Premièrement : Quelques remarques sur l'utilisation de Ghostscript. Créez vos 1200 pages TIFF (ou JPEG) (sous Linux, vous utiliserez gs
au lieu de gswin32c
):
gswin32c.exe ^
-dBATCH -dNOPAUSE -dSAFER ^
-sDEVICE=tiffg4 ^
-sOutputFile=C:\temp\tiffs\page-%06d.tif ^
-r72x72 ^
12000pages.pdf ^
# use -sDEVICE=jpeg to create *.jpeg files + adapt -sOutputFile= accordingly
# page-%06d.tif creates TIFFs named page-000001.tif through page-012000.tif*
Deuxièmement : Quelques notes sur la nécessité d'utiliser les utilitaires libtiff (disponibles gratuitement). Lorsque Ghostscript crée une page TIFF, il note sa version actuelle, la date et l'heure ainsi que d'autres métadonnées à l'intérieur du TIFF. Cela peut faire échouer votre vérification MD5, car des TIFF identiques peuvent porter un horodatage différent. D'où la nécessité de les "normaliser". Utiliser tiffinfo page-000001.tif
o tiffdump page-000001.tif
pour voir ce que je veux dire. Vous pourriez voir le s.th. comme ceci :
c:\downloads> tiffdump.exe page-000001.tif
page-000001.tif:
Magic: 0x4949 <little-endian> Version: 0x2a
Directory 0: offset 2814 (0xafe) next 0 (0)
SubFileType (254) LONG (4) 1<2>
ImageWidth (256) SHORT (3) 1<595>
ImageLength (257) SHORT (3) 1<842>
BitsPerSample (258) SHORT (3) 1<1>
Compression (259) SHORT (3) 1<4>
Photometric (262) SHORT (3) 1<0>
FillOrder (266) SHORT (3) 1<1>
StripOffsets (273) LONG (4) 8<8 341 1979 1996 2013 2030 2047 2064>
Orientation (274) SHORT (3) 1<1>
SamplesPerPixel (277) SHORT (3) 1<1>
RowsPerStrip (278) SHORT (3) 1<109>
StripByteCounts (279) LONG (4) 8<333 1638 17 17 17 17 17 13>
XResolution (282) RATIONAL (5) 1<72>
YResolution (283) RATIONAL (5) 1<72>
PlanarConfig (284) SHORT (3) 1<1>
Group4Options (293) LONG (4) 1<0>
ResolutionUnit (296) SHORT (3) 1<2>
PageNumber (297) SHORT (3) 2<0 0>
Software (305) ASCII (2) 21<GPL Ghostscript 8.71\0>
DateTime (306) ASCII (2) 20<2010:06:22 04:56:12\0>
Voici la commande pour "normaliser" les champs date+heure (qui sont étiquetés "306" dans mon cas) dans un exemple de TIFF :
c:\downloads> tiffset -s 306 "0000:00:00 00:00:00" ex001.tif
En conséquence, la DateTime a changé :
c:\pa>tiffdump ex001.tif | findstr DateTime
DateTime (306) ASCII (2) 20<0000:00:00 00:00:00\0>
Passez maintenant en revue tous vos fichiers TIFF pour normaliser tous leurs champs DateTime :
c:\downloads> for /l %i in (C:\temp\tiffs\*.tif) ^
do tiffset -s 306 "0000:00:00 00:00:00" %i
Troisième et quatrième : Exécutez md5sum.exe et triez la liste des fichiers pour trouver les doublons. Voici une ligne de commande à utiliser :
c:\downloads> md5sum.exe C:\temp\tiffs\*.tif | sort
Ainsi, vous devriez facilement voir quels fichiers/pages ont le même hachage MD5. Cela ressemblera à ceci :
c:\> md5sum.exe c:/temp/tiffs/page-0*.tif
[....]
fae9fa136c4f7ecca23b6a34d620fb02 *c:\temp\tiffs\page-000032.tif
fae9fa136c4f7ecca23b6a34d620fb02 *c:\temp\tiffs\page-000033.tif
fb5fef1732148d71bfff841c214cf836 *c:\temp\tiffs\page-000076.tif
fb5fef1732148d71bfff841c214cf836 *c:\temp\tiffs\page-000077.tif
fb86c1bdbc697eef7cb869f4e2e2957b *c:\temp\tiffs\page-000187.tif
fb86c1bdbc697eef7cb869f4e2e2957b *c:\temp\tiffs\page-000188.tif
fbb801ab3ef7ea33619132f97dcab045 *c:\temp\tiffs\page-000443.tif
fbb801ab3ef7ea33619132f97dcab045 *c:\temp\tiffs\page-000444.tif
fbc33cc0ff3e1252de1653ef2e978f94 *c:\temp\tiffs\page-000699.tif
fbc33cc0ff3e1252de1653ef2e978f94 *c:\temp\tiffs\page-000700.tif
fc3fd164e20bb707acddeabbc4e60f7e *c:\temp\tiffs\page-000899.tif
fc3fd164e20bb707acddeabbc4e60f7e *c:\temp\tiffs\page-000900.tif
[....]
Je vous laisse le soin d'automatiser cette étape.
Cinquième et sixième : Supprimez toutes les pages dupliquées de votre PDF original. Supposons que vous souhaitiez maintenant supprimer les pages 33, 77, 188, 444, 700 et 900. Voici le pdftk.exe
pour y parvenir :
c: > pdftk.exe A=12000pages.pdf ^
cat A1-32 A34-76 A78-187 A189-443 A445-699 A701-899 A901-end ^
output nonduplicates.pdf
*Edit : Je ne sais pas pourquoi j'ai suggéré TIFF au début -- il serait plus intelligent d'utiliser BMP. *
Si vous utilisez -sDEVICE=bmp256
y -sOutputFile=C:\temp\tiffs\page-%06d.bmp
vous n'aurez pas à vous préoccuper de l'étape de "normalisation" que j'ai décrite plus haut. Le reste de la procédure ( md5sum ...
) est la même....