Использование psutils - пакета для работы с PostScript файлами

Хотите научиться печатать книги? Не какие-нибудь "документы в формате MS Word", а настоящие? Если да, то эта статья даст вам представление о необходимом инструментарии.

[Артем Носов aka ChiP (chip-set at mail.ru)]

Использование psutils - пакета для работы с PostScript файлами

Оригинал: http://linuxshop.ru/unix4all/?cid=&id=426

Содержание:

  • 1. Предыстория
  • 2. Установка
    • 2.1 в Gentoo
    • 2.2 в FreeBSD
  • 3. Использование
  • 4. Приложение
  • 5. Послесловие

1. Предыстория

Думаю, каждый непротив сэкономить свои честно заработанные деревянные. Во всех новостях пестрят заголовки, что использование *nix экономит компаниям миллионы и они все ватагами, а то и полчищами, перебираются на open-source. На обычного же российского обывателя причины, приводящие к столь сильному ажиотажу в мировых холдингах, не экстраполируются или иначе не распространяются :). Лишь по одной причине - наши привыкли к халяве и воровству в сфере IT технологий. Уже предвижу полеты тухлых помидоров и выкрикы "лестных" высказываний ;-) ... Безусловно, из круга читателей статей подобного юнихово-направленного жанра такие единицы, но оглянитесь вокруг!

Возможно, по этой причине - отсутсвию статей подобного жанра,- но на самом деле совсем по другой :), и появилась заметка, демонстрирующая РЕАЛЬНУЮ экономию тех самых кромных. Идея в ней далеко не нова и легко применима для продуктов других фирм и операционных систем. А именно, речь пойдет об экономии листов чистой бумаги при распечатке электронной литературы: книг, статей, новостей, электронных писем, др. - в виде брошюр. "В нагрузку", на халяву :-), мы получаем дополнительные возможности - простоту навигации по распечатанному набору, схожесть с книжным вариантом (особенно, если дополнить красивой обложкой), приятность демонстрации на публике (в частности, на выставках, в виде проспектов). Нет! Я не собираюсь заставлять Вас дополнять кол-во страниц до числа кратного 4-м, а потом разбивать их на группы. За нас это сделает пакет psutils, речь о котором и пойдет в статье.

Да, последнее - в статье Вы не найдете настройки принтера, так что если эта процедура еще не выполнена на Вашей системе обратитесь к соотвествуюей документации.

2. Установка psutils

Установку я рассмотрю для 2-х наиболее используемых мной систем: Gentoo и FreeBSD. Обе процедуры будут основаны на использвании портов/портажей. Если же Вы используете пакетный дистрибутив, попробуйте поискать пакет с соотвествующим именем для Вашего пакетного менеджера или просто воспользуйтесь архивом исходных текстов, который может быть найден на http://www.tardis.ed.ac.uk/~ajcd/psutils .

2.1 Установка в Gentoo

Для скачки необходимых архивов исходных текстов выполним:
        emerge -f app-text/psutils
и для последующей установки:
        emerge app-text/psutils
Безусловно первый шаг можно опустить. Но предложенный вариант кажется мне более подходящим, т.к. не дает простаивать соединению (помните? мы пытаемся сэкономить :) при компиляции какой-либо зависимости пакета.

2.2 Установка в FreeBSD

Для скачки выполним:
        cd /usr/ports/print/psutils-a4 &&
        make fetch-recursive
Можно выбратьports/print/psutils-letter, но на Российских просторах я не вижу в этом особого смысла. И завершим все сборкой и установкой пакета:
        make install clean

3. Использование

Итак, подошел самый интересный этап - апробирования. Давайте, попробуем распечатать какой-нибудь PDF документ.Первое, что нам потребуется это сконвертировать документ в PostScript формат,на манипулирование которым расчитан ныне установленный нами пакет psutils.Одним из вариантов может быть использование входящей в пакет ghostscriptпрограммы pdf2ps:
        pdf2ps examples.pdf
В результате в том же каталоге появится файл examples.ps, который можно использовать для дальнейших манипуляций. Но из-за очень! низкого качества получаемого документа, я этот способ не рекомендую. А предлагаю воспользоваться замечательным пакетом xpdf. Для его установки в Gentoo:
        emerge -f app-text/xpdf &&
        emerge app-text/xpdf
в FreeBSD:
        cd /usr/ports/graphics/xpdf &&
        make fetch-recursive install clean
И запускаем его следующей командой:
        xpdf -ps example.psexample.pdf
После того как он запустится, жмем "Печать документа" (или сочетанием горячих клавиш: Ctrl+p). В окрывшемся диалогом окне выбираем "Печать в файл" (Print to file) и смело жмем кнопку Print. Процедура распечатки (в действительности конвертации) может занять некоторой промежуток времени, особенно если количество страниц в документе переваливает за тысячу, как в предпоследнем стандарте на язык C++ :).

Теперь все готово к получению долгожданного результата:

        psbook example.ps | psnup -l -p4 -2 > book.ps
Давайте разберемся, что же означает эта загадочная команда. Левая ее часть (psbook) дополняет содержащиеся в документе страницы пустыми листами. Так чтобы общее количество страниц стало кратным 4-м, после чего "раскладывает" их в определенном поряке. Так, например, для документа содержащего 6-ть страниц, это будет следующая последовательность:
        [*] [1] [2] [*] [6] [3] [4] [5]
где [*] - добавленные пустые листы. Сказанное легко проверить запустив psbook в отдельности:
        psbook example.ps > output.ps
Для ранее рассматриваемого документа в 6-ть страниц будет выдано на экран:
        [*] [1] [2] [*] [6] [3] [4] [5]
        Wrote 8 pages, 219089 bytes
Следущей стадией обработки нашего PostScript файла является размещение нескольких страниц на одном "физическом" листе. Для этого как раз результат psbook передается по конвейеру (|) на вход psnup,который в свою очередь размещает 2-е последовательные страницы передаемого PostScript файла на одной выходной (на это указывает опция -2, попробуйте заменить ее на -3 и посмотреть на результат :). Назначение других параметровpsnup состоит в:
        -l   # вертикальное размещение листа.
        -pa4 # размер выходного листа.
Допустимыми размерами (форматами) могут быть: a3, a4, a5, b5, letter, legal, tabloid, statement, executive, folio, quarto, 10x14.

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

Итак, давайте же попробуем распечатать полученный нами файл:

        lpr book.ps
Во избежание появления временного файла можно использовать
        psbook example.ps | psnup -l -pa4 -2 | lpr
Думаю, вы сразу заметили некоторое неудобство при использовании данного метода, т.к. приходится постоянно находиться у принтера и последовательно переворачивать/вставлять страницы. Давайте попробуем избавиться от этого недостатка. И в этом нам вновь помогут разработчики psutils, заботливо включившие утилиту pstops в поставку psutils. Итак, для того чтобы распечатать нечетные страницы:
        psbook example.ps | psnup -l -pa4 -2 | pstops "2:0(1in,0in)" | lpr
и, перевернув все листы, распечать четные страницы:
        psbook example.ps | psnup -l -pa4 -2 | pspstops "2:-1(1in,0in)" | lpr
Думаю этого достаточно, чтобы разогреть Ваш интерес к брошюрированию :). Некоторые интересные моменты вы также можете найти в приложении. Я же хочу немного заострить внимание и на других не менее полезных утилитах, поставляемых в пакете psutils.

Так четвертой, по востребованности, выступает команда psselect, позволяющая отбирать отдельные страницы или диапазон страниц из PostScript файла. Для распечатки 47 страницы мы могли бы выполнить:

        psselect -p47 example.ps | lpr
А следующая команда выбирает первые 12-цать, 103-ую, с 23 по 28 и 3-ую страницу и записывает их в файл output.ps в перечисленной последовательности:
        psselect -p1-12,103,23-28,3 example.ps output.ps
Есть возможность отсчета страниц начиная с конца документа. Для этого номер страницы необходим предварить знаком _ (подчеркивания). Так для выбора 3-х последних страниц можно использовать:
        psselect -p_3-_1 example.ps output.ps
или
        psselect -p_3- example.ps output.ps
Если второй индекс для аргумента -p опущен, как в привиденном выше примере, то подразумевается конец документа, для первого соотвественно начало документа.

Одной из привлекательных возможностей psselect является выборка четных и нечетных страниц. Так ранее описанную команду для распечатки нечетных станиц psbook example.ps | psnup -l -pa4 -2 | pstops "2:0(1in,0in)" | lpr можно заменить более простой:

        psbook example.ps | psnup -l -pa4 -2 | psselect -o | lpr
Для распечатки четных страниц достаточно заменить парамет -o у psselect на -e, т.е. psselect -e.

Редко, но бывают случаи, когда необходимый документ доступен только в letter формате или каком-либо другом отличном от A4. В этом случае незаменимой может стать команда:

        psresize -pa4 letter.ps pa4.ps
Которая преобразует входной файл letter.ps в letter-формате в выходной pa4.ps, изменив размер листа на A4.

Последней из не рассмотренных мною, но не последней поставляемой с пакетом psutils, является psmerge. Ее использование дает нам возможность скливать 2-а и более PostScript файла в один. Правда с одной существенной оговоркой: все входные PostScript файлы должны быть созданы одной программой. Синтаксис ее использования аналогичен описанным ранее утилитам:

        psmerge -o output.ps example1.ps example2.ps example3.ps
Объединит в файл с именем output.ps 3-и входных файла example1.ps, .. , example3.ps.

Все! На этом рассмотрение пакета psutils считаю завершенным. Конечно, некоторые моменты остались не освещенными, но им, без сомнения, уделено внимание на соотвествующих страницах справочных руководств.

4. Приложение

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

Ранее описанный способ конвертации PDF в PostScript может быть осуществлен почти любым просмотровщиком PDF файлов. Так, например, аналогичную процедуру мне успешно удалось произвести на Acrobat'e 5-ой версии и Gpdf.

Распечатка man страниц выливается в красивую последовательность:

        man -t gethostbyname_r | psbook | psnup -l -pa4 -2 | lpr
Для вывода в PostScript файл из многих приложений (например, браузеров, word-редакторов) достаточно выбрать из "диалога печати" контретного приложения пункт - "Печать в файл" (Print to file) и указать имя файла.

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

Все ситуация описать невозможно, но выход всегда есть :) Обычно он располагается там же, где и вход ;)

5. Послесловие

Подводя итоги, хочу сказать, что использование данной утилиты позволило сэкономить мне за 8-мь месяцев ~1000 рублей. Расход у меня получается в районе одной пачки в месяц при печати брошюрами. Произведя элементарные математические операции, и условившись, что пачка бумаги стоит 100 руб., получим:

при использовании брошюр: 8 месяцев*100 руб * 1 пачку = 800 руб.

при 2-х сторонней печати: 8 месяцев * 100 руб * 2 пачки = 1600 руб.

при односторонней печати: 8 месяцев * 100 руб * 4 пачки = 3200 руб.

Результаты говорят сами за себя :).

Однако, некоторые виды бумаг накладывают свои ограничения на "представление" информации, которую они будут содержать. Так, например, описанный метод не подойдет для курсовых/дипломных работ, договоров и других ценных бумаг, деловой переписки.

Источник: OpenNet.

[ опубликовано 23/09/2004 ]

Артем Носов aka ChiP (chip-set at mail.ru) - Использование psutils - пакета для работы с PostScript файлами   Версия для печати