3 votes

Recherche de pages en double dans un document pdf

J'ai un document pdf qui a été créé par concaténation d'un très grand nombre de petits documents. Par exemple, 1.pdf, 2.pdf et 3.pdf. Le problème est que la dernière page de 1.pdf est aussi la première page de 2.pdf, et la dernière page de 2.pdf est aussi la première ... vous voyez l'idée.

Ainsi, après avoir adhéré, j'ai reçu le document pdf avec de nombreuses pages en double. Et le document compte environ 12000 pages ( !!). Existe-t-il un moyen de détecter automatiquement les pages dupliquées et de les supprimer ?

Ou avez-vous des idées pour faciliter les choses ?

5voto

Kurt Pfeifle Points 11465

Si vos pages "identiques" ont exactement la même apparence visuelle à l'écran, l'approche algorithmique suivante pourrait permettre de détecter les doublons :

  1. Convertissez chaque page en un fichier TIFF ou JPEG basse résolution à l'aide de Ghostscript (c'est-à-dire en 72 dpi).
  2. 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.
  3. Exécutez md5sum.exe sur chaque page TIFF ou JPEG et mémorisez la somme Md5 de chaque page.
  4. Trier la liste des MD5sums pour trouver les pages dupliquées.
  5. Se souvenir de tous les numéros de page en double à supprimer.
  6. 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....

1voto

keiw Points 315

En pdftk peut diviser/combiner/supprimer des pages dans des fichiers PDF. Je ne connais pas de fonction permettant de trouver des doublons.

Vous pourriez diviser le document en pages individuelles, puis soit utiliser uniquement la taille du fichier, soit convertir le document en texte brut et utiliser diff pour trouver les pages adjacentes correspondantes et les supprimer, puis recombiner le tout en un seul document.

0voto

netzaffin Points 101

En 回答 de @Kurt Pfeifle a montré une très bonne solution. Je suggère quelques améliorations mineures

1. créer des instantanés

gs -q -dBATCH -dNOPAUSE -dSAFER -sDEVICE=bmp256 -sOutputFile=%0d.bmp -r72x72 input.pdf

-q taira la commande, ce qui m'a permis d'améliorer les performances de 15 %. Inconvénient : Vous ne pouvez plus voir la progression !

-sOutputFile=%0d.bmp n'affichera que les numéros de page du nom de fichier, qui pourront être utilisés ultérieurement sans remplacer des parties du nom de fichier.

2. et les comparer

Sous UNIX, vous pouvez utiliser fdupes . jdupes pourrait le remplacer sous Windows, mais je n'ai pas pu vérifier (certaines options diffèrent).

fdupes --omitfirst . | awk -F'[^0-9]*' '$0=$2' | sort -n | awk '{print $0}' ORS=','

fdupes trouvera les fichiers dupliqués dans le répertoire courant, mais n'affichera que le second en raison de la présence de --omitfirst . Les commandes awk afficheront alors les numéros de pages uniquement dans une chaîne de caractères séparée par des virgules, par exemple 8,33,53,70,77,434,

3. puis retirer les pages de l'entrée

Les outils CLI comme pdftk ne font que concaténer les pages AFAIK, il faudrait donc un petit algorithme pour obtenir le nombre de pages, puis créer les sections, par ex. 1-7 9-32 ...

Comme je n'ai pas eu le temps d'y réfléchir (n'hésitez pas à ajouter un commentaire), j'ai utilisé Maître éditeur de PDF qui dispose d'un outil de suppression de pages (Document > Supprimer les pages). Une version gratuite est disponible ! Vous pouvez facilement ouvrir le fichier, copier les numéros et voilà !

-1voto

riya_001 Points 1

Si vous avez besoin de trouver des pages en double dans plusieurs fichiers PDF, vous pouvez toujours les fusionner en un seul PDF à l'aide de l'outil de fusion. Allez ensuite aux pages supprimées pour poursuivre le processus de suppression. Vous pouvez également utiliser l'application Adobe Acrobat pour ce processus.

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