Ключевые слова:pdf, postscript, print, (найти похожие документы)
From: Артем Носов aka ChiP <chip-set at mail.ru>
Date: Mon, 28 Aug 2004 14:31:37 +0000 (UTC)
Subject: Использование 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 руб.
Результаты говорят сами за себя :).
Однако, некоторые виды бумаг накладывают свои ограничения на
"представление" информации, которую они будут содержать. Так,
например, описанный метод не подойдет для курсовых/дипломных работ,
договоров и других ценных бумаг, деловой переписки.
Если установлен app-text/poppler-utils, то можно воспользоваться утилитой pdftops, которая конвертирует pdf в ps из командной строки и с приемлемым качеством (в отличии от pdf2ps)
PS: а также у неё присутствует гораздо больше опций, чем в pdf2ps