Сравнить PDF-контент с Ruby - PullRequest
       31

Сравнить PDF-контент с Ruby

3 голосов
/ 25 января 2011

Я нахожусь в процессе написания Ruby-скрипта / приложения, которое помогает мне компилировать LaTeX в (как минимум) PDF.Одна особенность, которую я хочу иметь, состоит в том, что он должен запускаться pdflatex итеративно, пока PDF не сойдется (как и следовало ожидать, я думаю).

Идея состоит в том, чтобы сравнить PDF-файл, созданный за одну итерацию, с файлом из предыдущей итерации, используя их отпечатки пальцев.В частности, в настоящее время я использую Digest::MD5.file(.).

. Проблема в том, что это никогда не сходится.(Надеюсь) виновник - это временная метка PDF, которая установлена ​​в секундах как минимум на pdflatex.Поскольку прогоны pdflatex обычно занимают больше одной секунды, результат постоянно меняется.То есть, я ожидаю, что PDF будут равны отметке времени после некоторой точки.Это предположение может быть неверным;Подсказки приветствуются.

Что я могу с этим сделать?Мои основные идеи на данный момент:

  • Использовать библиотеку, способную выполнять эту работу
  • Удалять метаданные и извлекать только хеш-содержимое PDF
  • Перезаписывать временные метки фиксированным значениемперед сравнением

У вас есть больше идей или даже решений?Решения должны использовать только бесплатное программное обеспечение, работающее на Linux.Такие, которые используют только Ruby, предпочтительнее, но использование внешнего программного обеспечения вполне приемлемо.

Кстати, я точно не знаю, как кодируется PDF, но я подозреваю, что простое сравнение содержимого текста не будет работать для менятак как только более поздние итерации могут изменить только графику или ссылки.

Возможно, связано:

Ответы [ 4 ]

5 голосов
/ 19 февраля 2012

Это, вероятно, не самое пуленепробиваемое решение, но оно работает для меня:

cat file.pdf | grep -a -v "/CreationDate\|/ModDate\|/ID" | md5sum

или из Ruby

`cat file.pdf | grep -a -v "/CreationDate\\|/ModDate\\|/ID" | md5sum`.strip

Это вычисляет хэш PDF после удаления строккоторые приводят к тому, что предположительно идентичные PDF-файлы различаются.

YMMW, в зависимости от создателя PDF-файла.Используйте diff -a file1.pdf file2.pdf, чтобы узнать, какие еще строки вам нужно отбросить.

1 голос
/ 09 июля 2019

[Отказ от ответственности: я автор Identikal]

Для проекта у нас было требование сравнить два PDF-файла в чистом Ruby. Закончилось написание камня под названием identikal . Этот гем сравнивает два незашифрованных файла PDF и возвращает true, если они идентичны, и false в противном случае.

После установки гема вы можете сравнить два файла PDF, как показано ниже:

$ identikal file_a.pdf file_b.pdf
true
0 голосов
/ 06 марта 2011

Поскольку прогон латекса не имеет доступа к своим предыдущим прогонам и зависит только (помимо системных параметров, таких как текущее время) от сгенерированных текстовых файлов (таких как tex, aux, bib, ...)полученный PDF-файл сходится, как только сходятся все эти текстовые файлы (независимо от зависимости системных параметров sudh от времени).

Короче говоря, вы должны проверить сходимость текстовых файлов (tex, aux, bib, ...) вместо конвергенции файла pdf.

  1. Создайте каталог A, в котором вы запускаете латекс.
  2. Создайте каталог B, где вы храните копию текстовых файлов, полученных в результатепредыдущий запуск латекса.
  3. Запуск латекса в A
  4. Если содержимое всех файлов в B совпадает с содержимым соответствующих файлов в A, остановите.В противном случае скопируйте все текстовые файлы, сгенерированные в A (aux, bib, ...), в B, исключая оригинальный текстовый файл, если вы знаете, что он не изменился.Вы также можете исключить журнал из списка копий.А затем вернитесь к 3.
0 голосов
/ 25 января 2011

Это не ответ на ваш вопрос, но вы знакомы с latexmk? Это Perl-скрипт, который делает именно то, что вам нужно, но делает это совсем по-другому. Он делает это, проверяя все различные файлы .log и .aux, оставшиеся после каждого запуска tex, и затем получает эвристические данные о том, что должно происходить в каждом случае (что может быть сложнее, чем просто повторный запуск tex - mkindex или xindy также может потребоваться запустить).

Вы можете либо имитировать его использование (хотя с 3546 sloc, я не особо рекомендую его), либо просто вызывать его из скрипта / приложения Ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...