Вначале PostScript представлял собой язык программирования для принтеров. И хотя PostScript-принтеры всё ещё не потеряли актуальности, существует и множество других форматов, в которых можно отправлять данные на печать. Но благодаря PostScript появился Portable Document Format — PDF, который стал невообразимо популярным. Пожалуй, не проходит и дня, чтобы каждый из нас не просмотрел бы какой-нибудь PDF-документ на своём компьютере. Конечно, есть и форматы, конкурирующие с PDF, но им, в сравнении с PDF, принадлежит лишь небольшая доля рынка. Просмотр PDF-файлов в Linux — это не проблема. А как насчёт их редактирования? Как оказалось, это тоже несложно, правда, только если знать о том, как именно это делается.



Все переводы серии
Кунг-фу стиля Linux: удобная работа с файлами по SSH
Кунг-фу стиля Linux: мониторинг дисковой подсистемы
Кунг-фу стиля Linux: глобальный поиск и замена строк с помощью ripgrep
Кунг-фу стиля Linux: упрощение работы с awk
Кунг-фу стиля Linux: наблюдение за файловой системой
Кунг-фу стиля Linux: наблюдение за файлами
Кунг-фу стиля Linux: удобный доступ к справке при работе с bash
Кунг-фу стиля Linux: великая сила make
Кунг-фу стиля Linux: устранение неполадок в работе incron
Кунг-фу стиля Linux: расшаривание терминала в браузере
Кунг-фу стиля Linux: синхронизация настроек
Кунг-фу стиля Linux: бесплатный VPN по SSH
Кунг-фу стиля Linux: превращение веб-приложений в полноценные программы
Кунг-фу стиля Linux: утилита marker и меню для командной строки
Кунг-фу стиля Linux: sudo и поворот двух ключей
Кунг-фу стиля Linux: программное управление окнами
Кунг-фу стиля Linux: организация работы программ после выхода из системы
Кунг-фу стиля Linux: регулярные выражения
Кунг-фу стиля Linux: запуск команд
Кунг-фу стиля Linux: разбираемся с последовательными портами
Кунг-фу стиля Linux: базы данных — это файловые системы нового уровня
Кунг-фу стиля Linux: о повторении кое-каких событий сетевой истории
Кунг-фу стиля Linux: PDF для пингвинов

Графические инструменты


Существует множество инструментов для редактирования PDF-файлов в Linux. Главная проблема тут — качество получаемого результата. Для редактирования PDF-файлов можно воспользоваться, например, LibreOffice Draw, Inkscape или даже GIMP. Эти инструменты, как правило, отлично справляются с простыми задачами, например — когда нужно лишь убрать что-то из документа, перекрыв это белым прямоугольником, или когда надо сделать в документе какое-то примечание. А вот если речь идёт о более сложных изменениях, или о получении документов, элементы которых выверены до последнего пикселя, то эти инструменты для решения таких задач вполне могут и не подойти.


Редактирование PDF-документа в GIMP

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

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

Неудивительно то, что emacs умеет выводить PDF-файлы при запуске под X. Можно использовать Control+C Control+C для переключения на просмотр текстового представления файла. В конце концов, большинство PDF-файлов представляют собой файлы, содержащие текст, а emacs поддерживает даже работу с бинарными файлами. Поэтому, если вы не против поработать с внутренним содержимым PDF-файлов, которое очень похоже на PostScript, вы можете редактировать PDF-файлы в emacs или в каком-нибудь другом текстовом редакторе.

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

Маскировка текста


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

PDF-файлы можно конвертировать в формат, при использовании которого сжатие не слишком сильно портит текст, но это — тоже не панацея. Например, если открыть следующий фрагмент кода статьи про любительскую радиосвязь и задаться целью изменить слово «convention», то сложно будет понять даже то, где именно находится это слово. Но оно, тем не менее, где-то здесь:

3 0 obj << /Length 14770 /Filter /FlateDecode >> stream

H�|Wɒ�8��+p$gJ,�c��v�cS�Ҍc��J�$���\ZV�����\0�� �CTR�������r��[�}�7}����|��������I5u���`M�>�/��?l�.8�@��gBzq�r!#�%� AE�� �˜ ᥉��x!$��X8^%$��A�D�B���(���b�[H �>����#��{a���e0$^H&|/����U1$^��#��/�G�Us��/»/��\ <i�'qC���$xe�«X�x22�������G��F�Lp]Mnm�$] #TI��G�q�l��'3;!���!+�ȷ�{䕀���

��b��Qja����Q i� GRn�\0�g;L����x�Zܿ㌳�n�2�R& :«x�r�ky�[JPK��/���S��i��������]r�F�p����k�� |���

QI�mx>1�\�1�Q��y)ХǺ�Z�U.^�](pN��dx����;�֬;d�_�{˪�cYa�\�.t�s�}�ْ{<\0ZW�:�Ȅ�Oɴ��cS�UzluP�֨o}ި��Uqf��o��V��bT%mj|��t����;v�{s�Rj˺���

Удачных поисков! Но этот беспорядок можно конвертировать в несжатый текст:

qpdf -qdf input.pdf output.txt

Выходной файл, на самом деле, несмотря на то, что я дал ему расширение .txt, будет PDF-файлом. Но в нём текст распакован. И хотя то, что получится, тоже далеко от идеала, теперь мы, по крайней мере, сможем найти в тексте то, что нужно изменить:

1.2632 -1.1242 TD
0.0739 Tc
0.1263 Tw
(One potentially confusing Stamp)Tj
-1.2632 -1.1368 TD
0.026 Tc
0.1248 Tw
[(con)38.6(v)20.7(ention is that the I/O pin numbers)]TJ
0 -1.1242 TD
0.0262 Tc
0.0072 Tw
[<646f6e90>13.6(t correspond to the IC pin numbers.)]TJ
T*

И, опять же, желаю удачи в поиске, например, того же слова «convention». Но то, что получилось теперь, всё же, лучше, чем первый вариант. А метаданные можно найти даже в необработанном файле, где имеются строки вроде /Author и /Title.

Волшебство командной строки


Существует такой инструмент — qpdf, который умеет конвертировать PDF-файлы в другие PDF-файлы. Он может оптимизировать эти файлы в расчёте на их размещение в интернете или в расчёте на редактирование текста. Он умеет выполнять простые операции вроде удаления страниц или объединения фрагментов нескольких файлов. Вы можете взглянуть на документацию по нему. В вышеприведённом примере мы воспользовались режимом QDF для создания совершенно нормального PDF-файла, все объекты которого размещены в соответствии с их порядковыми номерами, в котором используется обычный для Unix способ завершения строк. Такие свойства выходных файлов упрощают их редактирование в обычных текстовых редакторах, но, как мы уже видели, это, всё равно, не такая уж и простая задача. Например, довольно-таки сложно удалить объект целиком, но если избавиться ото всех его упоминаний, то можно, воспользовавшись fix-qdf, воссоздать нормальный QDF-файл.

Ещё один способ выполнения простых правок PDF-документов предусматривает использование PDFtk Server (PDFtk, без «Server», это графический набор инструментов для Windows). С помощью PDFtk можно объединять или разделять документы, поворачивать страницы и решать много других распространённых задач. Например — вот как объединить все материалы двух файлов:

pdftk in1.pdf in2.pdf cat output output.pdf

Можно сделать то же самое, но пропустив, скажем, страницу №9:

pdftk in1.pdf in2.pdf cat 1-8 10-end output output.pdf

Ещё можно перемешивать страницы объединённых документов, располагая их в нужном порядке:

pdftk A=in1.pdf B=in2.pdf shuffle A B output output.pdf

Путешествие из текста в PDF и обратно


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

Ещё можно использовать различные комбинации ps2pdf (вместе с инструментом для генерирования PostScript-данных), pdf2text (этот инструмент входит в состав пакета poppler-utils) или Ghostscript для создания PDF-файлов или для извлечения из них текстовых данных. Надо сказать, что Ghostscript — это весьма мощный инструмент, среди возможностей которого можно отметить преобразование PDF-файлов в различные графические форматы. Это может пригодиться, если нужно, например, выводить их на веб-страницах в виде изображений.

Инструменты для решения особых задач печати документов и другие инструменты


Иногда нужно модифицировать PDF-файл в расчёте на то, что он будет определённым образом выведен на печать. Мы уже говорили, например, о том, как совмещать нечётные и чётные страницы документов, но есть и другие способы подготовки документов к печати:

  • pdfxup — инструмент, задействующий возможности pdflatex и Ghostscript для размещения нескольких PDF-страниц (например — двух) на одной печатной странице.
  • pdfjam — использует LaTeX для размещения документов на страницах разных размеров или для вывода нескольких страниц документа на одной печатной странице.
  • pdfposter — умеет создавать печатные изображения огромных размеров на нескольких страницах, беря за основу одну страницу.

Если вы предпочитаете инструменты с графическим интерфейсом — можете взглянуть на PDFsam Basic. А если вас интересует ПО для работы с PDF, написанное на Java — обратите внимание на Multivalent.

Итоги


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

Чем вы пользуетесь для редактирования PDF-файлов в Linux?

Все переводы серии
Кунг-фу стиля Linux: удобная работа с файлами по SSH
Кунг-фу стиля Linux: мониторинг дисковой подсистемы
Кунг-фу стиля Linux: глобальный поиск и замена строк с помощью ripgrep
Кунг-фу стиля Linux: упрощение работы с awk
Кунг-фу стиля Linux: наблюдение за файловой системой
Кунг-фу стиля Linux: наблюдение за файлами
Кунг-фу стиля Linux: удобный доступ к справке при работе с bash
Кунг-фу стиля Linux: великая сила make
Кунг-фу стиля Linux: устранение неполадок в работе incron
Кунг-фу стиля Linux: расшаривание терминала в браузере
Кунг-фу стиля Linux: синхронизация настроек
Кунг-фу стиля Linux: бесплатный VPN по SSH
Кунг-фу стиля Linux: превращение веб-приложений в полноценные программы
Кунг-фу стиля Linux: утилита marker и меню для командной строки
Кунг-фу стиля Linux: sudo и поворот двух ключей
Кунг-фу стиля Linux: программное управление окнами
Кунг-фу стиля Linux: организация работы программ после выхода из системы
Кунг-фу стиля Linux: регулярные выражения
Кунг-фу стиля Linux: запуск команд
Кунг-фу стиля Linux: разбираемся с последовательными портами
Кунг-фу стиля Linux: базы данных — это файловые системы нового уровня
Кунг-фу стиля Linux: о повторении кое-каких событий сетевой истории
Кунг-фу стиля Linux: PDF для пингвинов

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


  1. dlinyj
    02.08.2021 16:17

    Спасибо за перевод, очень актуальная информация. Достаточно часто приходится работать с PDF в Linux.


    1. igor_carenko
      03.08.2021 15:32

      Да, очень актуально. Что-то мелкое поправить в чертеже, или перевести пару страниц datasheet'а / инструкции. В основном пользуюсь Inkscape или LibreOffice Draw.

      Из "проблемных" случаев:

      • иногда оба редактора вместо текстовых надписей при импорте вообще ничего не отображают;

      • попадаются файлы со странной кодировкой (привет 1251).

      Пробовал для упомянутых случаев средства из статьи - не помогают :'(

      pdfedit не удалось собрать (хочет qt3, который тоже не собрался)

      В виде растра Inkscape всегда нормально импортирует (как и GIMP). Но хотелось бы вектор...

      И тут случайно попался на глаза pdf2svg - ну хоть как-то! Мой файл pdf преобразовался в svg корректно. По сути делает то же, что и "pdftocairo input.pdf -svg"

      Заметил 2 специфических момента:

      • в векторную графику (в контуры, не текст!) преобразовывает всё (в т.ч. и текст);

      • иногда пропускает растровые картинки, оставляет пустое место;

      P.S. Спасибо автору перевода за подталкивание к очередному поиску :)

      P.P.S. из статьи пригодился pdftk - очень удобно вырезать отдельную страницу.


      1. igor_carenko
        03.08.2021 16:43

        Ошибся. Inkscape при "Импорте Poppler/Cairo" делает то же самое, импортирует весь pdf в векторные элементы.

        Я не додумался их разгруппировать после импорта, думал, что импортируется растровая картинка, как в GIMP


  1. baldr
    02.08.2021 17:09
    +7

    Работаю на фрилансе. У меня не так уж много каких-то своих правил, но есть одно важное: если в задаче нужно парсить pdf - БЕГИ!

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

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

    Но открывается везде, да.


    1. tmin10
      03.08.2021 12:50

      Для текста и таблиц, наверное, OCR использовать проще. Пытался парсить банковские выписки в pdf, на выходе какая-то каша обычными методами.


    1. yurybx
      03.08.2021 15:44
      -1

      Пропарсите, пожалуйста документы по ссылке. Спасибо.


      1. baldr
        03.08.2021 20:17

        Во-первых, насколько я помню, документы для IRS (да, с ними я тоже работал) изначально идут в виде форм. Из PDF форм данные можно вытащить хоть через `PyPDF`. Ну и вообще хоть какие-то решения для "IRS PDF parse" но гуглятся.

        А во-вторых - не буду.


        1. yurybx
          04.08.2021 16:46

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


          1. baldr
            04.08.2021 19:49

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

            Google translate уже давно переводит на лету с камеры, всяких AR-приложений тоже полно..


  1. ciubotaru
    02.08.2021 17:47

    Чем вы пользуетесь для редактирования PDF-файлов в Linux?

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


    1. OnYourLips
      02.08.2021 19:37

      А каким образом? Мне при открытии PDF он на выбор предлагает два вида импорта, а как файл просто на редактирование открыть — я не понял.


      1. kudar
        02.08.2021 20:47

        Естественным образом — никак. Inkscape конвертирует pdf в вектор (может быть даже не весь pdf, а отдельную страничку), его можно изменить, а потом сохранить как pdf, или еще что-то. Потом надо склеивать отдельные странички.


      1. ciubotaru
        03.08.2021 03:45

        Насколько я понимаю, формат pdf вообще не предназначен для редактирования и нативных редакторов не существует по определению. Так что да, Inkscape импортирует pdf (причём по странице за раз) и пытается представить его в удобном для редактирования виде. Векторную графику конвертирует на ура, растровые изображения оставляет как есть, а вот с текстовыми блоками беда...


        1. OnYourLips
          03.08.2021 03:46

          Да, не предназначен для нормального редактирования, но умеренно это можно делать в акробате. Для многих задач этого вполне хватает.


        1. dzok
          04.08.2021 14:36

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


  1. red_andr
    02.08.2021 21:06

    задаться целью изменить слово «convention»

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


    1. Taraflex
      03.08.2021 01:14

      Для слов короче, наверное можно использовать пробелы нулевой ширины.


  1. thegriglat
    03.08.2021 01:00

    Мораль -- не делайте бинарных форматов


    1. unsignedchar
      03.08.2021 07:29
      +3

      Мораль: если вам нужно редактировать write only бинарный формат - значит, ваша жизнь в какой то момент свернула не туда.


    1. quwy
      04.08.2021 21:37

      Ну да, ну да. И видео/аудио давайте тоже в текстовых файалах хранить, а то вдруг нужно будет подредактировать, а ничего кроме vim нет.


  1. remzalp
    03.08.2021 07:31

    Inkscape вполне успешно импортит страницу из PDF в вектор и даже может сохранять в PDF.

    Правда при правке некоторых текстовых блоков начинается магия, но для штучного удаления фрагментов - чудесно.


  1. be9em0t
    03.08.2021 12:02
    +3

    "Редактировать PDF несложно". Ну, по статье видно что 'редактировать' - понятие широкое.

    Кстати, я все еще не уверен который из адобовских уродов причинил больше вреда - флэш или PDF. А вы как думаете?


    1. ProgMiner
      05.08.2021 19:47

      Тем не менее, в вопросах печати и передачи форматированного текста (когда важно то, как свёрстан документ) – ему нет равных.

      Да и тот же флеш сильно двинул веб вперёд, хотя, может, и не в том направлении, в котором некоторым хотелось бы. Печально только то, что теперь мало чем можно его открыть, при том, что иногда попадаются старые SWF, созданные ещё во времена величия флеша.


  1. Savevur
    03.08.2021 15:32

    Чем вы пользуетесь для редактирования PDF-файлов в Linux?

    Qoppa PDF Studio - Редактирование одной строки, блоками не видит.

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


  1. speakingfish
    03.08.2021 18:00
    +2

    Очень странно. В статье про PDF ни разу не упомянут самый интенсивно развивающийся проект, связанный с PDF: Apache PDFBox


  1. 027
    04.08.2021 14:16
    +2

    В ответ на набившую оскомину мантру «PDF не предназначен для редактирования, в вашей консерватории что-то не так!»
    Для меня основная проблема этого чудовищного формата для распечатки на бумажку не редактирование, а банальное копирование текста. Зачастую в буфере рваный перемешанный текст.
    Вторая проблема — чтение на смартфоне. Немасштабируемый текст, приходится елозить по увеличенной картинке, сплошное мучение, а не чтение.