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

Графические инструменты
Существует множество инструментов для редактирования 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, cvcSҌcJ$\ZV\0 CTRr[}7}|I5u`M>/? l.8@gBzqr!#% AE ᥉x!$X8^%$ADB (b[H >#{ae0$^H&|/U1$^#/GUs/»/\
bQjaQ i GRn\0g;LxZܿ㌳n2R& : «xrky[JPK/Si]rFpk |
QImx>1\1Qy)ХǺZU.^](pNdx; ֬; d_{˪cYa\.ts}ْ{<\0ZW:ȄOɴcSUzluP֨o}ިUqfoVbT%mj|t;v{sRj˺
Удачных поисков! Но этот беспорядок можно конвертировать в несжатый текст:
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?
