Если ваши "идентичные" страницы отображаются на экране одинаково визуально, следующий алгоритмический подход может помочь найти дубликаты:
- Конвертируйте каждую страницу в файл формата TIFF или JPEG с низким разрешением, используя Ghostscript (например, 72 dpi).
- Если вы используете TIFF: запустите одну из утилит командной строки libtiff, чтобы "нормализовать" метаданные TIFF.
- Запустите md5sum.exe на каждой странице TIFF или JPEG и запомните Md5sum для каждой страницы.
- Сортируйте список сумм MD5, чтобы найти дубликаты страниц.
- Запомните все повторяющиеся номера страниц, которые будут удалены.
- Запустите
pdftk.exe
в исходном PDF- файле, чтобы удалить дубликаты.
Вы можете написать этот алгоритм на любом языке, который вам нравится (даже в пакетном режиме в Windows или в bash в Linux/Unix/MacOSX).
Первое: некоторые заметки по использованию Ghostscript. Создайте свои 1200 страниц TIFF (или JPEG) (в Linux вы бы использовали gs
вместо 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*
Второе: некоторые замечания по требованию использования (свободно доступных) утилит libtiff. Когда Ghostscript создает страницу TIFF, он отмечает ее текущую версию, дату и время, а также некоторые другие метаданные внутри TIFF. Это может испортить проверку MD5, потому что в противном случае идентичные TIFF-файлы могут иметь различную отметку даты / времени. Отсюда необходимость "нормализовать" их. Используйте tiffinfo page-000001.tif
или tiffdump page-000001.tif
чтобы понять, что я имею в виду. Вы могли видеть s.th. как это:
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>
Вот команда для "нормализации" полей даты + времени (которые в моем случае помечены как "306") в примере TIFF:
c:\downloads> tiffset -s 306 "0000:00:00 00:00:00" ex001.tif
В результате поле DateTime теперь изменилось:
c:\pa>tiffdump ex001.tif | findstr DateTime
DateTime (306) ASCII (2) 20<0000:00:00 00:00:00\0>
Теперь переберите все ваши TIFF-файлы, чтобы нормализовать все их поля DateTime:
c:\downloads> for /l %i in (C:\temp\tiffs\*.tif) ^
do tiffset -s 306 "0000:00:00 00:00:00" %i
Третий и четвертый: запустите md5sum.exe и отсортируйте список файлов, чтобы найти дубликаты. Вот командная строка для использования:
c:\downloads> md5sum.exe C:\temp\tiffs\*.tif | sort
В результате вы должны легко увидеть, какие файлы / страницы имеют одинаковый хэш MD5. Это будет выглядеть примерно так:
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
[....]
Я оставляю вам автоматизировать этот шаг.
Пятый и шестой: удалите все дубликаты страниц из вашего оригинального PDF. Предположим, вы хотите удалить страницы 33, 77, 188, 444, 700 и 900. Вот команда pdftk.exe
для достижения этой цели:
c: > pdftk.exe A=12000pages.pdf ^
cat A1-32 A34-76 A78-187 A189-443 A445-699 A701-899 A901-end ^
output nonduplicates.pdf
* Изменить: Не знаю, почему я сначала предложил TIFF - более разумным было бы использовать BMP. *
Если вы используете -sDEVICE=bmp256
и -sOutputFile=C:\temp\tiffs\page-%06d.bmp
вам не придется иметь дело с шагом «нормализации», который я описал выше. Остальная часть процедуры (md5sum ...
) такая же ....