Нахождение дублирующихся страниц в документе PDF

У меня есть документ PDF, который был создан конкатенацией (огромное количество) небольших документов. Например, 1.pdf, 2.pdf и 3.pdf. Проблема состоит в том, что последняя страница 1.pdf является также первой страницей 2.pdf, и прошлая страница 2.pdf является также первой..., Вы получаете идею.

Так, после присоединения я получил документ PDF с большим количеством дублирующихся страниц. И документ имеет приблизительно 12 000 страниц (!!). Существует ли способ автоматически обнаружить дублирующиеся страницы и удалить их?

Или какие-либо идеи, как сделать это немного легче?

3
задан 26.09.2009, 23:29

2 ответа

Если Ваш "идентичный" рендеринг страниц в точно тот же общий вид на экране, следующий алгоритмический подход мог работать для обнаружения дубликатов:

  1. Преобразуйте каждую страницу в низкий-res TIFF или использование файла JPEG Ghostscript (f.e. использование 72 точек на дюйм).
  2. В случае, если Вы используете TIFF: выполните одну из libtiff утилит командной строки для "нормализования" метаданных TIFF.
  3. Выполните md5sum.exe на каждой странице TIFF или JPEG и помните Md5sum за каждую страницу.
  4. Отсортируйте список MD5sums для нахождения дублирующихся страниц.
  5. Помните все дублирующиеся номера страниц, которые будут удалены.
  6. Выполненный a pdftk.exe командная строка на исходном PDF для удаления дубликатов.

Вы могли кодировать этот алгоритм на любом языке, который Вы любите (даже пакет в Windows или удар на Linux/Unix/MacOSX).

Во-первых: Некоторые примечания по использованию Ghostscript. Создайте свой TIFF 1200 (или 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>

Вот команда для "нормализования" date+time полей (которые отмечены "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 ...) то же....

4
ответ дан 08.12.2019, 00:10

pdftk может разделять/комбинировать/удалять страницы в файлах PDF. Я не знаю функции для нахождения дубликатов.

Вы могли разделить документ на отдельные страницы и затем или использующий просто размер файла или преобразовывающий в простой текст и использующий разность, найти, что смежное соответствие разбивает на страницы удаление их - затем повторно объединяются в единственный документ.

1
ответ дан 08.12.2019, 00:10
  • 1
    , который я знаю его, но это не помогает мне в этом случае. И с этим числом страниц, делая что-либо вручную collosal пустая трата времени. Последний подход не будет работать на многие страницы, то же самое (таблицы), таким образом, они равны по размеру. – Rook 28.09.2009, 01:30

Теги

Похожие вопросы