Помимо программ от Adobe есть много альтернативных специализированных библиотек и утилит для работы с PDF. Что характерно, зачастую опенсорсные инструменты даже удобнее, чем официальный* софт. Альтернативные ридеры/редакторы по функциональности сильно отличаются от Adobe. В свою очередь, программы Adobe сами отличаются от официальных спецификаций PDF.

*Примечание: программы Adobe не «официальные» в прямом смысле слова, потому что PDF является открытым и бесплатным стандартом ИСО.

Налицо как минимум три класса множеств:

  1. функции из спецификаций PDF разных версий (самые большие множества);
  2. функции «официальных» Adobe Acrobat/Acrobat Pro/Reader (ещё несколько множеств);
  3. функции альтернативных ридеров, утилит и библиотек для обработки PDF.

В 2017–2023 гг должно завершиться принятие пакета стандартов PDF 2.0, который пришёл на смену прежним версиям PDF 1.0–1.7. Он требует реализации новых функций при сохранении обратной совместимости. Крайне сложная задача.

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

Библиотека для генерации PDF


В качестве конкретного примера можно взглянуть на маленькую библиотеку CapyPDF от Юсси Пакканена (Jussi Pakkanen). Это библиотека для генерации PDF, в ней реализована малая часть стандарта, а некоторые функции реализованы, но не открыты для использования. Например, в текущем рендеринге PDF функционирует следующее:

  • Основные графические команды для RGB, градаций серого и CMYK
  • Поддержка ICC-профилей
  • Загрузка изображений PNG, JPG и TIFF (включая CMYK TIFF)
  • Вставка файлов JPG напрямую без предварительной распаковки
  • Использование изображений в качестве маски для рисования
  • Работа со встроенными в изображения цветовыми профилями
  • Использование встроенных шрифтов PDF
  • Использование шрифтов TrueType, в том числе с возможностью усечения подмножества шрифтов (font subsetting)
  • Все операторы шрифтов PDF, такие как дополнительная подложка (extra padding), верхний/нижний регистр и установка в качестве обтравочного контура (clipping path)
  • Переходы между страницами

Реализовано, но не открыто (код есть, но не добавлен или оформлен в виде комментариев):

  • Дерево навигации по документу
  • Оверпринт (наложение одного цветного элемента на другой без создания выворотки)
  • Структура и аннотации
  • Дополнительные цветовые каналы (в спецификации PDF они называются сепарациями)
  • Объекты XObjects для форм
  • Встраивание файлов
  • Аннотации (только несколько типов)
  • Поддержка цветового пространства L*a*b*
  • Цвета ICC в примитивных операциях заливки
  • Оттенки Type 2, 3 и 4 (например, градиенты)
  • Цветовые узоры

А есть ещё функции, которые не совсем совпадают со спецификациями. Скажем, навигация внутри страниц. Согласно спецификациям PDF 2.0, раздел 12.4.4.2, на одной странице можно реализовать много пунктов, которые будут открываться один за другим по щелчку мыши. Это сделано для презентаций. Однако почти все генераторы PDF реализуют список не на одной, а на нескольких страницах. То есть список из пяти пунктов занимает не одну, а пять страниц. Единственный ридер, который поддерживает навигацию внутри страниц — это Acrobat Reader. Но сейчас ни один генератор PDF, никакая программа для создания презентаций не экспортирует теги навигации по страницам.

Причина в размытости формулировок официальной спецификации, так что эту функцию трудно реализовать однозначным образом. Там в качестве основных операций используются опциональные контент-группы (optional content groups) и навигационные узлы. Первые поддерживаются всеми ридерами PDF, вторые — нет. Каждый навигационный узел представляет собой состояние (state). Когда пользователь перемещается вперёд и назад, ридер выполняет определённое действие, которое может быть использовано для скрытия или отображения опциональной контент-группы. Согласно спецификации, система работает по сложному двунаправленному алгоритму:



По мнению некоторых разработчиков, внедрение в эту схему корня (root) — излишнее усложнение. С другой стороны, такой вариант позволяет практически любой документ реализовать в виде одностраничного PDF с множеством «состояний».

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

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

Движки для рендеринга PDF в браузерах


Кроме отдельных ридеров/редакторов PDF, особого внимания заслуживают браузерные движки рендеринга и веб-редакторы. Они тоже становятся всё функциональнее с каждой новой версией. Например, в Firefox с версии 106 (октябрь 2022 года) появился встроенный редактор PDF, включающий в себя добавление текста и рисование фигур, в том числе подписей:



Firefox позволяет делать аннотации: печатать или писать от руки прямо в PDF, выбирать цвет, размер, толщину линий, непрозрачность и т.д., а затем сохранять PDF-файл локально с новыми дополнениями.

Недавно мы рассказывали про очень удобный веб-редактор simplePDF, ориентированный на простейшие и быстрые манипуляции с PDF, как то:

  • вписать имя в PDF-форму;
  • проставить галочки;
  • поставить подпись;
  • добавить фото.

Демо:

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

Для цифровой подписи PDF тоже можно использовать отдельные инструменты. Например, простую опенсорсную утилиту open-pdf-sign из командной строки. Подписи невидимы (по умолчанию) или явно демонстрируются:



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

Вообще, стандарт PDF 2.0 настолько сложный и объёмный, что реализовать его целиком согласно спецификациям в одной программе крайне сложно. Например, основной документ ISO 32000-2:2020 — Document management – Portable document format – Part 2: PDF 2.0 содержит 1003 страницы:



К нему принято ещё несколько приложений, в том числе приложение по цифровым подписям ISO/TS 32002:2022, и это только два из шести документов в пакете стандартов PDF 2.0.

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

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


  1. NeoCode
    02.09.2023 22:57
    +4

    Я иногда пользуюсь pdf&djvu bookmarker - утилитой для создания и редактирования оглавлений. Довольно часто документы не содержат отдельного древовидного оглавления - но его можно сгенерировать из текстового оглавления самой книги.


  1. Einherjar
    02.09.2023 22:57
    +4

    Если статья про утилиты, то зачем половина про c++ библиотеку и так мало про собственно утилиты. А тот же foxit где?


    1. NeoCode
      02.09.2023 22:57

      На самом деле да. Наверняка есть масса полезных бесплатно-свободных утилит, ибо платно-малварные уже достали, всю поисковую выдачу забивают. И вообще работа с файлами разных форматов (в том числе и документами pdf) это такая благодатная тема, на которой пытаются срубить бабла огромное количество "шароварщиков", мелких контор, да и просто хакеров. Ведь обычно нужно сделать что-то с документом: сгенерировать оглавление, вставить/удалить страницу, извлечь картинку в высоком разрешении, конвертировать в другой формат, а у человека ничего кроме акробат ридера не установлено.


  1. Solovej
    02.09.2023 22:57

    Друзья, а есть что то готовое что бы через Python или Терминал определенную ссылку в теле PDF заменить на другую?
    Например в файле есть ссылка google.com и мне надо заменить ее на bing.com.
    Хочу в пакетном режиме обработку.
    Ищу функцию Replace и в тех библиотеках что я изучал нет такого.


  1. maxim_zverev
    02.09.2023 22:57
    +3

    1) Небольшой список бесплатных PDF утилит (веб- и десктоп версии, я правда лично пока только установил, не особо тестировал): https://www.pdf24.org

    2) А вот действительно серьёзная вещь: Master PDF Editor. Без ссылки, потому что нужна не последняя версия с сайта производителя, она платная, а последняя бесплатная версия 4.X.XX. Это будет прямо навороченный комбайн, позволяющий редактировать PDF, уникальный в своём роде инструмент. Легко находится версия под Linux (у меня например работает 4.3.89 под CentOS7), но не получается найти дистрибутив 4 версии под винду. Может кто поделится работающей ссылкой в комментариях?


  1. engine9
    02.09.2023 22:57

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


    1. truthseeker
      02.09.2023 22:57
      +2

      Утилита что склеивает PDF из консоли: pdftk или poppler. Могут ли они добавлять в оглавление в Outline ссылки на страницы, не знаю, не проверял.

      Что точно умеет всё вышеперечисленное, это модули Python: fitz и pypdf.


      1. engine9
        02.09.2023 22:57

        Спасибо!


        1. truthseeker
          02.09.2023 22:57

          Не за что :) Сам решал как-то подобную задачу, поэтому ещё помню, что щупал, когда решал.


  1. MiraclePtr
    02.09.2023 22:57
    +2

    Меня в свое время порадовал тот факт, что OpenOffice Draw способен открывать и редактировать PDF. Когда нужно внести небольшие изменения (исправить пару текстовых полей, что-нибудь удалить или наоборот вставить), его более чем достаточно.


  1. MAXInator
    02.09.2023 22:57
    +2

    ИМХО - лучшая "альтернативная утилита для PDF" это MS Word начиная с 2019. Преобразовывает PDF в практически обычный офисный документ.


    1. truthseeker
      02.09.2023 22:57

      Так и LibreOffice Writer умеет открывать PDF как условный odt/docx, и редактировать его можно. Экспорт в PDF потом тоже есть. Одна беда, не всё как было в исходном PDF, так и будет выглядеть в результирующем. Некоторые сложные фичи PDF при импорте частично теряются, и при экспорте уже не экспортируются так, как оно было в исходном файле. Но, в MS Word, ЕМНИП, это примерно так же работает, так что это общая проблема обоих редакторов.


      1. MAXInator
        02.09.2023 22:57
        +1

        LibreOffice Writer умеет открывать PDF как условный odt/docx, и редактировать его можно

        Разве? У меня при попытке открыть PDF Writer'ом принудительно вызывается Draw.
        А уж он делает что-то адовое. Недавно только табличку переводил, так он половину символов мелкого шрифта переврал, слои задвоил, оставив под текстовым слоем слой растровой картинки, и ячейки таблицы в случайном порядке сделал отдельными текстовыми блоками. Ворд же просто сделал обычную табличку.


        1. truthseeker
          02.09.2023 22:57

          Ваша правда. Файлы, на которых я заметил подобное поведение, оказались Hybrid PDF. И как я это проглядел. Только что открыл файл, сформированный скриптом на Python, и его принудительно открыло в Draw, хотя это преимущественно текстовый PDF, там даже картинок мало. А Word открывает этот PDF на ура. Вот так, не проверил на широкой выборке своё утверждение, и сел в лужу... А всего то надо было обратить внимание на то, что файл оказался гибридным, у меня таких несколько было, что подправлял в своё время за кем-то...


  1. wifage
    02.09.2023 22:57
    +1

    По хорошему давно нужно избавиться от этого убогого формата pdf, который даже перевести нельзя нормально не потеряв форматирование.


  1. Mike-M
    02.09.2023 22:57

    основной документ ISO 32000-2:2020 — Document management – Portable document format – Part 2: PDF 2.0 содержит 1003 страницы

    Стандарт USB, описания процессоров и много чего другого содержат на несколько тысяч страниц больше.


    Поэтому дело не в сложности стандарта, а, скорее, в нежелании досконально им заниматься.


  1. Paramparam
    02.09.2023 22:57

    Хочется упомянуть оперсорсный ридер Sioyek (https://sioyek.info/), с навигацией по типу Vim и кучей фишек, которые помогают читать научную и техническую литературу.

    В частности можно выделять строчки цветом, не внося изменений в сам PDF, данные о выделении хранятся в файле sqlite, который можно перетаскивать с компа на комп (книги идентифицируются по контрольной сумме своих файлов).


  1. ByTE1974
    02.09.2023 22:57

    Кто вообще объяснит, зачем этот сложный в реализации формат нужен?
    Вообще не понимаю его преимуществ.
    Не отредактировать толком, сложен в реализации.
    Какой же это portable?
    Я бы назвал его скорее legacy.
    Не понимаю и все....