Существует несколько фундаментальных задач, которые встречаются при работе с большинством, а то и со всеми документами. Одна из них — сравнить две версии одного и того же документа. Это могут быть юридические соглашения или исправления в отчёте, которые, скорее всего, в наши дни будут представлены в формате PDF. В этой статье рассказывается, как можно сравнить содержимое двух файлов PDF или почему у вас не получится этого сделать.

Сравнение PDF-файлов не является функцией, которую вы, вероятно, найдёте в приложениях, имеющих широкую поддержку формата обычного документа. Скорее всего, они предложат некоторую форму редактирования, но не смогут провести какое-либо сравнение между двумя файлами. Попробуйте Adobe Acrobat Reader, в нём этот инструмент обязательно будет, но единственный способ его получить — обновиться до полной версии Adobe Acrobat DC по ежемесячной подписке. Это предложение, от которого большинство вполне разумно откажется.

Сравнить текст


Бесплатное решение — экспортировать каждый из документов в виде текста и использовать мощный текстовый редактор, такой как BBEdit, для сравнения этих текстовых документов. Если у вас установлен бесплатный Xcode SDK от Apple, вы можете использовать его приложение FileMerge, которое скрыто внутри пакета приложений и доступно с помощью команды Open Developer Tool в меню Xcode, я же предпочитаю команду Find Differences в меню поиска BBEdit.



Затем вы узнаете, насколько разнообразным может быть текст, экспортированный из файлов PDF. Один из экспериментов, который стоит попробовать, — это сделать копию документа PDF со сложно форматированным текстом, открыть и сохранить его несколько раз с помощью разных приложений, но без изменения его содержимого. Это может перемещать фрагменты текста, даже если при просмотре PDF-файла будет казаться, что он вообще не изменился. Таким образом, хотя вы сможете найти весь контент. У вас, вероятно, будет много ложных срабатываний, в тех случаях, когда есть различия между экспортированным текстом, но не в том, что вы видите в самих документах.

Заплатить за Acrobat


Насколько я понимаю, единственная «серьезная» функция, с помощью которой можно сравнивать файлы PDF — это функция в платной версии Adobe Acrobat DC. Получив свою копию, я испытал её и обнаружил, что она также имеет ограниченное применение для таких задач. Помимо стандартного интерфейса The Martian, который, к счастью, свойственен Acrobat, небольшие различия между PDF-файлами часто вызывают сотни различий, о которых сообщает Acrobat. Если у вас есть целый день, чтобы проработать каждую страницу, это может быть простой работой, но если вам нужен чистый и простой список различий, вам, скорее всего, не повезёт.

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



Поскольку Acrobat не понимает никакой базовой структуры, в которой незначительные изменения в тексте вызвали перенумерацию строк, Acrobat пометил каждую строку как отличающуюся. Он также уловил все изменения в макете страницы, которые не повлекли за собой никаких изменений в содержании: удаление единственной строки на первой странице документа, фактически сделало остальную часть документа длинной и утомительной серией изменений.

Однако одним из преимуществ является то, что Acrobat точно сообщает, когда документы не изменились, даже если текст, экспортированный из них, изменился в своей структуре. Кроме этого, я не получил от Acrobat особой помощи, поскольку он был просто переполнен несущественными различиями.

Есть куда расти?


Учитывая популярность PDF-документов, можно предположить, что существует большой спрос на лучшие инструменты для сравнения. Однако любое решение обречено на провал, если оно не может преодолеть фундаментальное ограничение дизайна формата PDF: оно не хранит контент в какой-либо форме семантической структуры, только то, что необходимо для того, чтобы каждая страница выглядела корректно. Вы можете изменить это, вручную объединяя каждый блок текста вместе. А такая процедура, необходима для некоторых типов PDF, которые, например, должны быть совместимы с программами чтения текста. Но вряд ли кто-то потрудится сделать это. И будет большим исключением, если вы обнаружите документы, которые были так структурированы.

Внутри файла PDF находятся десятки тысяч объектов, каждый из которых содержит код для создания части страницы. Если вы зададите одно слово в абзаце и зададите для него другой шрифт и толщину, механизм PDF может решить разделить его как другой объект для размещения на этой странице. Но между этими объектами нет семантической связи, и отдельные авторы PDF могут даже размещать каждое слово на странице независимо, как отдельный объект. Тогда выяснение того, как эти слова объединяются в текст, было бы очень сложной задачей даже для AI.

Из-за того, что формат файла такой старый, но и не только из-за этого, он позволяет редакторам прикреплять объекты в конце файла, чтобы избавиться от необходимости снова записывать весь файл. Иногда механизм PDF «сглаживает» все эти добавленные изменения, что может полностью реструктурировать объекты.
Печальная правда заключается в том, что формат PDF никогда не был предназначен для обеспечения доступа к его содержимому, кроме как, для правильного отображения его на экране или в изображении страницы для печати. Несмотря на это, весь мир ежедневно хранит миллионы своих самых важных документов в формате PDF. Вам не кажется это немного странным?..

Какими инструментами для сравнения пользуетесь вы?

Комментарии (28)


  1. Foveator
    22.08.2021 13:54
    +1

    Задача , описаная автором, может быть расширена до сравнения одного и того же документа, полученного например сканированием в планшетном сканере и изображения, полученного при помощи камеры,при съёмки из папки судебного дела.

    В российском суде часто участники судебного заседания останавливаются для того, чтобы сличить документ с его фотографией. Но ещё чаще судья просто отказывается это делать.

    Или например вывешивая судебное дело на сайте, размещаешь постраничные фотографии дела, при этом часто параллельно даёшь ссылку на скан того-же документа полученного на сканере ( или полученного тобой же из файла Word).

    Было бы очень полезно, если бы была разработана и продавалась утилита (лучше программа) или в сети действовал on-line сервис, который бы подтверждал, своей электронной подписью степень идентичности фотографии и качественного скана.

    Задача , описаненая автором, при этом несколько расширится, но польза вырастит неимоверно.


    1. tyomitch
      22.08.2021 14:03
      +1

      Стандартное решение — оба документа постранично рендерятся в картинки бесплатным GhostScript, картинки попарно сравниваются бесплатным ImageMagick.
      Сравнение картинок гибко настраивается: imagemagick.org/script/compare.php

      Можете к этому приделать GUI и коммерциализировать; а мне хватит скрипта на десять строк.


      1. lamerAlex
        22.08.2021 16:10
        +3

        Если в документ будет добавлена, или удалена как у автора теста, строка, то различными будут признаны остаток текущей страницы и все последующие


      1. pavelpromin
        22.08.2021 21:26

        +1

        Примерно так и делал на чертежах проектной документации.


      1. Fragster
        23.08.2021 13:45

        Есть реальная задача сравнивать подписанный скан с изначальным оригиналом. При этом сам скан может быть весьма разного качества (не говоря уже об поворотах, сгибах и прочем, если он получен с помощью камеры смартфона)..


  1. FForth
    22.08.2021 14:41

    Задача сравнения 2-ух PDF в общем своём понимании не решаема в связи с форматом самих PDF файлов, Даже больше, нет уверенности в возможности правильного сравнения и, например, прошедших через FineReader распознование. И, даже больше, «нет» готовых инструментов для сравнения даже файлов в текстовом варианте по причинам и описанным в статье, как простая перенумерация строк рушит весь алгоритм сравнения, хотя как казалось бы какая «мелочь», но разработчики таких программ не мыслят «мелочами» и удобством пользователей создавая свои программы.

    P.S. Для сравнения текстовых файлов пользуюсь программой Winmerge, и она, в целом соответствующая своему предназначению, тоже далека от совершенства от потребностей пользователей. Для сравнения текстовых файлов есть, среди разных программ, и программа Windiff

    А, у кого и какие предпочтения и почему при использовании каких программ сравнения текстовых файлов?


    1. rvt
      27.08.2021 16:13

      Для сравнения текстовых файлов (и не только текстовых) еще можно пользоваться встроенным инструментарием Total Commander.


      1. tyomitch
        30.08.2021 13:35

        Да чем угодно, от стандартного со времён MS-DOS fc, до модных онлайн-платформ типа editor.mergely.com


  1. belch84
    22.08.2021 16:39

    Мне кажется, что PDF — слабо подходящий для сравнения формат. Сравнивать документы в PDF — это почти то же самое, что сравнивать документы в JPG. Для корректного сравнения в конце концов нужно будет производить распознавание документов системой OCR со всеми вытекающими отсюда проблемами и сложностями. Следствие из этого — PDF-документы не очень подходят для (электронного) обмена между пользователями и организациями, лучше использовать документы с выраженной структурой, что-то типа XML (упакованного для экономии трафика), такие документы сравнивать будет легко. В общем, согласен с выводами автора


  1. maxzh83
    22.08.2021 16:51
    +1

    Несмотря на это, весь мир ежедневно хранит миллионы своих самых важных документов в формате PDF

    Нормальные люди PDF используют только для того, что нужно "дать почитать" человеку. Зачастую, это результат экспорта из какого-то другого формата. И вот этот формат в зависимости от задачи должен уметь все, что требуется. Например, в PDF выгружают всякие отчеты, где мастер-данные хранятся в БД, xml или где-то еще.

    Это могут быть юридические соглашения или исправления в отчёте, которые, скорее всего, в наши дни будут представлены в формате PDF

    Использовать PDF там, где что-то будет редактироваться себе дороже. Это примерно как слать текст картинкой и потом жаловаться, что с ним ничего нельзя сделать.


    1. belch84
      22.08.2021 16:58
      -1

      Уже приходилсь писАть на эту тему на Хабре — формат PDF дает автору документа некоторую иллюзию, что получатель не станет корректировать документ. Корректировать PDF можно, но это требует каких-то усилий, появляется надежда, что получатель эти усилия прилагать не станет


    1. lizardus
      22.08.2021 17:05
      +3

      PDF идеальный формат для публикации документа, не подразумевающей его последующее редактирование. PDF позволяет избежать практически любых проблем форматирования, графики, формул, отсутствующих приложений с уникальными форматами которые работают на редких ОС, и т.д. плюс цифровая подпись. PDF это то же самое что и распечатка на бумаге. Никому же не приходит в голову жаловаться, что невозможно редактировать текст после печати на принтере. Можно всего лишь добавить заметки на полях, подчеркнуть или зачеркнуть что что-либо карандашиком.


      1. belch84
        23.08.2021 09:02

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

        Но зато имеющий один существенный недостаток — в таком документе нельзя производить поиск (в общем случае). Для настоящего электронного документооборота его использовать нельзя, и дело не в возможности редактирования


        1. releyshic
          23.08.2021 11:51

          с каких пор в PDF нет поиска?

          скачайте даташит https://static.chipdip.ru/lib/059/DOC000059747.pdf и там поиск работает, и перемещение по ссылкам как во вне, так и внутри документа

          Поиска (и других функций) не будет, если PDF сделан из картинок


          1. belch84
            23.08.2021 13:01

            Я же написАл насчет общего случая. При построении документа PDF в общем случае неизвестно, будет ли текст сохранён как текст или как картинка. Файлы PDF стоятся с помощью различных программ и приложений, и результат может быть различным даже для почти одинаково отформатированных документов


            1. lizardus
              23.08.2021 21:24

              Я не совсем уверен, что "общий случай" сильно важен практически. В общем случае нельзя вообще использовать файлы для поиска, всегда может подвернуться jpg или bin. В общем случае может не существовать решения, или в общем случае можно доказать NP-completeness. PDF достаточно удобен на практике, для довольно большого множества задач. Но да, он переусложнен и возможно предоставляет слишком много свободы. Но тут, так сказать, trade-off, иногда эти возможности - killer фича.


              1. belch84
                23.08.2021 22:35
                +1

                Я ничего не имею против формата PDF, но у него есть своя область применения, а у этой области есть свои границы. Действительно, для пересылки файла, который нужно только просматривать или распечатывать, PDF очень удобен и универсален. Но при этом задачи сравнения файлов PDF или их редактирования выглядят совершенно неестественными. Если кому-то нужны поиск текста в документах, сравнение или редактирование документов, то PDF, как и любые форматы картинок и фото (типа JPG, BMP, PNG) не подходит совершенно (хотя и может возникнуть искушение его использовать — ведь в отдельных документах поиск возможен, а программы для редактирования PDF'ов существуют). Если кому-то таки нужен поиск во всех получаемых от партнеров документах, боюсь, что единственный выход — это конвертация PDF в какой-нибудь структурированный формат для документов. Если нужно будет выбирать формат для универсального документооборота (пересылки и хранения документов) — лучше PDF сразу исключить из рассмотрения


  1. lizardus
    22.08.2021 16:59
    +1

    Нет большой проблемы. Есть diffpdf в репозиториях Linux. Для Windows бинарное приложение платное (https://www.qtrac.eu/diffpdf.html), но оно open source, можно собрать самому. Но это для обычных текстовых PDF, сравнение текста на сканированных растровых изображениях - совершенно отдельная и более сложная задача.


    1. tyomitch
      22.08.2021 22:42

      Между «обычными текстовыми PDF» и «сканированными растровыми изображениями» есть целый спектр вариантов:

      • текстовый слой есть, но последовательность строк в нём отличается от фактически видимой на странице (чаще всего в таблицах и негоризонтальных строках);
      • текстовый слой есть, но в уникальной одноразовой кодировке, включающей только глифы, задействованные в конкретном документе;
      • текстовый слой есть, но редко используемые глифы выводятся не как текст, а как кривые — т.е. удалены из шрифта и заинлайнены в страницу...

      Это всё не считая комбинаций из текста-текстом и текста-картинкой.

      Рендерить и OCR-ить документы в итоге оказывается проще, чем парсить.


  1. Tab10id
    22.08.2021 18:13

    https://github.com/vslavik/diff-pdf


  1. Kirikekeks
    22.08.2021 21:31

    pdftotext certificate_covid.pdf 1.txt

    pdftotext certificate_covid.pdf 2.txt

    sed -n '46p' 2.txt

    >17.04.2021

    sed -i '46s/04/08/' 2.txt

    diff 1.txt 2.txt 
    
    46c46 < 17.04.2021
    
    17.08.2021


  1. akimovpro
    22.08.2021 22:31

    В Abbyy FineReader же сравнение документов уже лет 5 как, в том числе скана с цифровой версией.


  1. alan008
    22.08.2021 23:02
    +1

    Распознать оба PDF в нечто Rtf-подобное, а потом сравнить любым инструментом сравнения RTF (т. е. сравнивающим не только текст, но и форматирование, таблицы итд) или хотя бы Word'ом (инструмент сравнения есть на вкладке Рецензирование) .

    У ABBYY есть приложение PDF Comparator (платное), которое поступает описанным выше способом.


  1. posledny
    23.08.2021 11:35

    Юристы и бухгалтерия у нас пользуют ABBYY Comparator, вполне устраивает. Ценник на лицензию терпимый. Единственная на моей памяти проблема была с подписанным pdf файлом, что то там не получалось у него открыть. В остальном - весьма удобен для сравнения документов, работает через распознавание текста, поэтому удобно с одной стороны скормить ему скан, с другой - оригинал в Word.


    1. alexkirs
      23.08.2021 12:04

      Тоже первым делом на ум пришло Abby comparator. Когда заключали договора по переписке, всегда сравнивали утверждённые сканированные pdf с оригиналами и word исходниками. Сначала картинки распознаются, затем тексты сравниваются показывая где и какой абзац добавили/вычеркнули. И инструмент очень качественный и проработанный. Странно что автор не знаком и что представители Abby ещё не здесь


    1. Fragster
      23.08.2021 13:48

      А у него есть cli-интерфейс?


  1. kivicode
    23.08.2021 11:35

    *На правах бреда*

    Можно попробовать подключить компьютерное зрение, выравнивать картинки и искать различия. А потом на основе этих различий искать разницу в тексте документа?


  1. Myclass
    23.08.2021 15:23

    Не совсем понятно, что под сравнением должно быть понято. Есть текст, есть, форматы (цвета, шрифты, размер букв, ориентация итд.), графики, таблицы, комментарии, форматирование чусел, видимые и невидимые аттрибуты итд… Если ориентироваться на что-то определённое, то и можно будет «выбрать» стратегию для реализации…