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:
- Converta cada página em um arquivo TIFF ou JPEG de baixa resolução usando o Ghostscript (por exemplo, usando 72 dpi).
- Caso você use TIFF: execute um dos utilitários de linha de comando libtiff para "normalizar" os metadados TIFF.
- Execute md5sum.exe em cada página TIFF ou JPEG e lembre-se do Md5sum para cada página.
- Classifique a lista de MD5sums para encontrar as páginas duplicadas.
- Lembre-se de todos os números de página duplicados a serem excluídos.
- 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 ....