Encontrando páginas duplicadas em documento pdf

2

Eu tenho um documento em pdf que foi criado pela concatenação de (um grande número) de pequenos documentos. Por exemplo, 1.pdf, 2.pdf e 3.pdf. O problema é que a última página do 1.pdf é também a primeira página do 2.pdf, e a última página do 2.pdf também é a primeira ... você tem a idéia.

Então, depois de entrar, recebi o documento em PDF com muitas páginas duplicadas. E o documento tem cerca de 12.000 páginas (!!). Existe uma maneira de detectar automaticamente as páginas duplicadas e removê-las?

Ou alguma idéia de como tornar isso um pouco mais fácil?

    
por Rook 26.09.2009 / 22:29

2 respostas

4

Se suas páginas "idênticas" renderizar exatamente a mesma aparência visual na tela, a seguinte abordagem algorítmica poderia funcionar para descobrir duplicatas:

  1. Converta cada página em um arquivo TIFF ou JPEG de baixa resolução usando o Ghostscript (por exemplo, usando 72 dpi).
  2. Caso você use TIFF: execute um dos utilitários de linha de comando libtiff para "normalizar" os metadados TIFF.
  3. Execute md5sum.exe em cada página TIFF ou JPEG e lembre-se do Md5sum para cada página.
  4. Classifique a lista de MD5sums para encontrar as páginas duplicadas.
  5. Lembre-se de todos os números de página duplicados a serem excluídos.
  6. Execute uma linha de comando pdftk.exe no PDF original para remover as duplicatas.

Você pode codificar este algoritmo em qualquer idioma que desejar (mesmo em lote no Windows ou bash em Linux / Unix / MacOSX).

Primeiro: Algumas notas sobre o uso do Ghostscript. Crie suas 1200 páginas TIFF (ou JPEG) (no Linux você usaria gs em vez 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* 

Segundo: Algumas anotações sobre o requisito de usar os utilitários libtiff (disponíveis gratuitamente) Quando o Ghostscript cria uma página TIFF, observe sua versão atual, data e hora, além de alguns outros metadados dentro do TIFF. Isso pode alterar a verificação do MD5, pois TIFFs idênticos podem ter um carimbo de data / hora diferente. Daí a necessidade de "normalizar" isso. Use tiffinfo page-000001.tif ou tiffdump page-000001.tif para ver o que quero dizer. Você pode ver s.th. assim:

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
 c:\downloads> tiffset -s 306 "0000:00:00 00:00:00" ex001.tif
> DateTime (306) ASCII (2) 20<2010:06:22 04:56:12
 c:\pa>tiffdump ex001.tif | findstr DateTime
   DateTime (306) ASCII (2) 20<0000:00:00 00:00:00
 c:\downloads> for /l %i in (C:\temp\tiffs\*.tif) ^
                  do tiffset -s 306 "0000:00:00 00:00:00" %i
>
>

Aqui está o comando para "normalizar" os campos de data e hora (que são marcados como "306" no meu caso) em um exemplo de TIFF:

 c:\downloads> md5sum.exe C:\temp\tiffs\*.tif | sort

Como resultado, o campo DateTime agora mudou:

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
  [....]

Agora percorra todos os seus TIFFs para normalizar todos os campos DateTime:

 c: > pdftk.exe A=12000pages.pdf ^
          cat A1-32 A34-76 A78-187 A189-443 A445-699 A701-899 A901-end ^
          output nonduplicates.pdf

Terceiro e Quarto: Execute md5sum.exe e ordene a lista de arquivos para encontrar duplicatas. Aqui está uma linha de comando para usar:

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* 

Como resultado, você deve ver facilmente quais arquivos / páginas têm o mesmo hash MD5. Será semelhante a isto:

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
 c:\downloads> tiffset -s 306 "0000:00:00 00:00:00" ex001.tif
> DateTime (306) ASCII (2) 20<2010:06:22 04:56:12
 c:\pa>tiffdump ex001.tif | findstr DateTime
   DateTime (306) ASCII (2) 20<0000:00:00 00:00:00
 c:\downloads> for /l %i in (C:\temp\tiffs\*.tif) ^
                  do tiffset -s 306 "0000:00:00 00:00:00" %i
>
>

Deixo para você automatizar essa etapa.

Quinto e sexto: Exclua todas as páginas duplicadas do PDF original. Suponha que você queira excluir as páginas 33, 77, 188, 444, 700 e 900. Aqui está o comando pdftk.exe para conseguir isso:

 c:\downloads> md5sum.exe C:\temp\tiffs\*.tif | sort

* Edit: Não sei porque eu sugeri TIFF no início - mais inteligente seria usar o BMP. *

Se você usar -sDEVICE=bmp256 e -sOutputFile=C:\temp\tiffs\page-%06d.bmp , não precisará lidar com a etapa de 'normalização' descrita acima. O resto do procedimento ( md5sum ... ) é o mesmo ....

    
por 24.06.2010 / 22:39
1

O pdftk pode dividir / combinar / remover páginas em arquivos PDF. Não conheço nenhuma função para encontrar duplicatas.

Você pode dividir o documento em páginas individuais e, em seguida, usar apenas o tamanho do arquivo ou convertê-lo para texto sem formatação e usar diff, localizar as páginas correspondentes adjacentes e excluí-las. Em seguida, recombine em um único documento.

    
por 26.09.2009 / 23:50

Tags