Trouver des pages en double dans un document pdf

3

J'ai un document pdf qui a été créé par concaténation de (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 également la première page de 2.pdf, et la page précédente de 2.pdf est également la première ... vous voyez l'idée.

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

Ou des idées pour rendre cela un peu plus facile?

Tour
la source

Réponses:

4

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

  1. Convertissez chaque page en un fichier TIFF ou JPEG basse résolution en utilisant Ghostscript (par exemple, en utilisant 72 ppp).
  2. Si vous utilisez TIFF, exécutez l’un des utilitaires de ligne de commande libtiff pour "normaliser" les métadonnées TIFF.
  3. Exécutez md5sum.exe sur chaque page TIFF ou JPEG et rappelez-vous de la somme Md5 pour chaque page.
  4. Triez la liste des sommes MD5 pour trouver les pages en double.
  5. N'oubliez pas tous les numéros de page en double à supprimer.
  6. Exécutez une pdftk.exeligne de commande sur le fichier PDF d'origine pour supprimer les doublons.

Vous pouvez coder cet algorithme dans la langue de votre choix (même batch sous Windows ou bash sous Linux / Unix / MacOSX).

D'abord: quelques notes sur l'utilisation de Ghostscript. Créez vos 1200 pages TIFF (ou JPEG) (sous Linux, vous utiliseriez à la gsplace 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 remarques sur la nécessité d’utiliser les utilitaires libtiff (disponibles gratuitement). Lorsque Ghostscript crée une page TIFF, il notera sa version actuelle, la date et l'heure, ainsi que d'autres métadonnées à l'intérieur du fichier TIFF. Cela pourrait bloquer votre vérification MD5, car sinon des TIFF identiques pourraient porter un horodatage différent. D'où la nécessité de "normaliser" ceux-ci. Utilisez tiffinfo page-000001.tifou tiffdump page-000001.tifpour voir ce que je veux dire. Vous pouviez le voir comme ça:

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 marqués "306" dans mon cas) dans un exemple TIFF:

 c:\downloads> tiffset -s 306 "0000:00:00 00:00:00" ex001.tif

En conséquence, le champ DateTime a maintenant été modifié:

 c:\pa>tiffdump ex001.tif | findstr DateTime
   DateTime (306) ASCII (2) 20<0000:00:00 00:00:00\0>

Parcourez maintenant 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

En conséquence, 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 en double de votre PDF original. Supposons que vous souhaitiez maintenant supprimer les pages 33, 77, 188, 444, 700 et 900. Voici la pdftk.execommande pour cela:

 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é le format TIFF au début - plus intelligent serait d'utiliser le format BMP. *

Si vous utilisez -sDEVICE=bmp256et -sOutputFile=C:\temp\tiffs\page-%06d.bmpvous n'aurez pas à traiter avec l'étape de «normalisation» que j'ai décrite ci-dessus. Le reste de la procédure ( md5sum ...) est la même ....

Kurt Pfeifle
la source
J'ai finalement résolu le problème manuellement à la fin, donc je ne l'ai pas testé, mais malgré cela, je vous donne un + A pour l'effort. Ceci, si cela fonctionne, sera utile dans le futur, j'en suis sûr.
Rook
@ Idigas: Je ne vois pas de +1 pour cette réponse ...
Kurt Pfeifle le
1

Le pdftk peut diviser / combiner / supprimer des pages dans les fichiers PDF. Je ne connais aucune fonction pour trouver des doublons.

Vous pouvez scinder le document en pages individuelles, puis utiliser uniquement la taille du fichier ou convertir en texte brut et en utilisant diff, rechercher les pages correspondantes adjacentes et les supprimer - puis les recombiner en un seul document.

Martin Beckett
la source
Je le sais, mais cela ne m'aide pas dans ce cas. Et avec ce nombre de pages, faire quoi que ce soit manuellement est une perte de temps collosale. Cette dernière approche ne fonctionnera pas car beaucoup de pages sont la même chose (tables), donc elles ont la même taille.
Rook