Артем Носов aka ChiP
2004, весна
Думаю, каждый не против сэкономить свои честно заработанные деревянные. Во всех новостях пестрят заголовки, что использование *nix экономит компаниям миллионы и они все ватагами, а то и полчищами, перебираются на open-source. На обычного же российского обывателя причины, приводящие к столь сильному ажиотажу в мировых холдингах, не экстраполируются или иначе нераспространяются :). Лишь по одной причине - наши привыкли к халяве и воровству в сфере IT. Уже предвижу полеты тухлых помидоров и выкрики "лестных" высказываний ;-) ... Безусловно, из круга читателей статей подобного юнихово-направленного жанра таких единицы, но оглянитесь вокруг!
Возможно, по этой причине - отсутсвию статей подобного жанра,- но на самом деле совсем по другой :), и появилась заметка, демонстрирующая реальную экономию тех самых кромных. Идея в ней далеко не нова и легко применима для продуктов других фирм и операционных систем. А именно, речь пойдет об экономии листов чистой бумаги при распечатке электронной литературы: книг, статей, новостей, электронных писем, др. - в виде брошюр. "В нагрузку", на халяву :-), мы получаем дополнительные возможности - простоту навигации по распечатанному набору, схожесть с книжным вариантом (особенно, если дополнить красивой обложкой), приятность демонстрации на публике (в частности, на выставках, в виде проспектов). Нет! Я не собираюсь заставлять вас дополнять кол-во страниц до числа кратного 4-м, а потом разбивать их на группы. За нас это сделает пакет psutils, речь о котором и пойдет в статье.
Да, последнее - в статье вы не найдете настройки принтера, так что если эта процедура еще не выполнена на вашей системе обратитесь к соотвествующей документации.
Установку я рассмотрю для 2-х наиболее используемых мной систем: Gentoo и FreeBSD. Обе процедуры будут основаны на использвании портов/портажей. Если же вы используете пакетный дистрибутив, попробуйте поискать пакет с соотвествующим именем для вашего пакетного менеджера или просто воспользуйтесь архивом исходных текстов, который может быть найден на http://www.tardis.ed.ac.uk/~ajcd/psutils.
Для скачки необходимых архивов исходных текстов выполним:
emerge -f app-text/psutils
и для последующей установки:
emerge app-text/psutils
Безусловно первый шаг можно опустить. Но предложенный вариант кажется мне более подходящим, т.к. не дает простаивать соединению (помните? мы пытаемся сэкономить :) при компиляции какой-либо зависимости пакета.
Для скачки выполним:
cd /usr/ports/print/psutils-a4 && make fetch-recursive
Можно выбрать ports/print/psutils-letter, но на Российских просторах я не вижу в этом особого смысла. И завершим все сборкой и установкой пакета:
make install clean
Итак, подошел самый интересный этап - апробирования. Давайте, попробуем распечатать какой-нибудь 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 считаю завершенным. Конечно, некоторые моменты остались не освещенными, но им, без сомнения, уделено внимание на соотвествующих страницах справочных руководств.
Вкратце опишу ситуации, с которыми мне приходилось встречаться при распечатке брошюр из различных приложений.
Ранее описанный способ конвертации PDF в PostScript может быть осуществлен почти любым просмотровщиком PDF файлов. Так, например, аналогичную процедуру мне успешно удалось произвести на Acrobat'e 5-ой версии и Gpdf.
Распечатка man-страниц выливается в красивую последовательность:
man -t gethostbyname_r | psbook | psnup -l -pa4 -2 | lpr
Для вывода в PostScript файл из многих приложений (например, браузеров, word-редакторов) достаточно выбрать из "диалога печати" контретного приложения пункт - "Печать в файл" (Print to file) и указать имя файла.
При использовании замечательного "редактора" LyX, помимо "Печати в файл", можно воспользоваться возможностью экспорта в различные форматы.
Все ситуация описать невозможно, но выход всегда есть :) Обычно он располагается там же, где и вход ;)
Подводя итоги, хочу сказать, что использование данной утилиты позволило сэкономить мне за 8-мь месяцев ~1000 рублей. Расход у меня получается в районе одной пачки в месяц при печати брошюрами. Произведя элементарные математические операции, и условившись, что пачка бумаги стоит 100 руб., получим:
при использовании брошюр: 8 месяцев*100 руб * 1 пачку = 800 руб. при 2-х сторонней печати: 8 месяцев * 100 руб * 2 пачки = 1600 руб. при односторонней печати: 8 месяцев * 100 руб * 4 пачки = 3200 руб.
Результаты говорят сами за себя :).
Однако, некоторые виды бумаг накладывают свои ограничения на "представление" информации, которую они будут содержать. Так, например, описанный метод не подойдет для курсовых/дипломных работ, договоров и других ценных бумаг, деловой переписки.