Спуск полос из word
О Basic’е мощном замолвите слово...
Запись действий пользователя в макрос (программу VBA)
Редактирование записанного макроса
Создание и инициализация переменных
Формирование переменных для подстановки в команду печати
Переменная sListOfPages (список страниц для печати в PostScript-файл)
Переменная sFileNamePS (полный путь для записи PostScript-файла)
В предыдущей части статьи рассказывалось, как с помощью печати на виртуальный принтер можно осуществить спуск полос из Word. Но там же отмечалось, что «ручное» определение диапазона страниц для печати не только довольно трудоемко, но и весьма ненадежно, поскольку ошибка даже в одной цифре способна окончательно завалить всю работу. Чтобы решить эту проблему, следует использовать возможности программирования на языке Visual Basic for Application (VBA), который является неотъемлемой частью офисного пакета Microsoft Office.
О Basic’е мощном замолвите слово...
VBA — весьма мощный объектно-ориентированный язык, позволяющий выполнять самые разнообразные задачи. Естественно, что в одной статье нереально описать все возможности этого великолепного инструмента, да и задача наша иная — показать на конкретном примере возможности и приемы автоматизации допечатной подготовки. Поэтому мы будем описывать только то, что необходимо для понимания работы конкретной программы.
Прежде всего напомним, что уже в ранних версиях офисного пакета присутствовала возможность записи и использования макросов (то есть наборов команд, выполняющих определенные функции). Сейчас макросы заменены полноценным языком программирования, но название осталось и в пункте главного меню Сервис присутствует подменю Макрос. Пусть вас это скромное название не вводит в заблуждение — под ним скрывается целый ряд удивительно эффективных возможностей, которыми просто грех не воспользоваться.
Если вы пока еще не знакомы с языком программирования VBA — не беда, сама «конструкция» офисного пакета дает пользователю прекрасную возможность освоить элементарные приемы работы с ним, записывая макросы и анализируя их. Конечно, таким способом вряд ли можно написать полноценные программы, но подобная задача перед нами и не стоит. Нам всего лишь нужно с помощью VBA автоматизировать рутинные операции подготовки изданий к печати, а с этой задачей нам справиться вполне по силам. Повторимся: VBA — полноценный и очень мощный язык программирования, для полного описания которого потребуется многотомное издание, поэтому в статье будем говорить только о тех возможностях и особенностях языка, которые нам пригодятся.
Начнем с самого простого: запишем макрос и посмотрим на его структуру (чуть позже мы эту структуру будем редактировать; кстати, запись макроса и его последующий анализ — лучший способ первоначального изучения VBA).
Необходимо отметить, что программа, которая сейчас будет описана, довольно проста и потому требует некоторого «ручного» контроля, в частности нужно тщательно следить, чтобы количество страниц в документе было кратно четырем и нумерация начиналась с первой страницы. Если эти условия не будут соблюдены, то порядок страниц в выходном файле будет неправильным. Когда читатели ознакомятся с общей концепцией построения такой программы, они смогут самостоятельно дописать необходимые модули контроля (у автора они написаны). Пока что — основы.
Запись действий пользователя в макрос (программу VBA)
Поскольку нам предстоит написать программу для печати на виртуальный принтер, давайте с этого и начнем.
Начать запись макроса можно как минимум двумя способами.
- выбрав «Сервис» => Макрос => Начать запись
- нажав кнопку «ЗАП» в строке состояния Word (рис. 1).
И в том, и в другом случае появится диалоговое окно запись макроса (рис. 2).
Назовем макрос Спуск_полос. При именовании макроса очень важно помнить, что имя макроса можно записывать и кириллицей, но в нем не должно быть пробелов: все пробелы следует заменить нижней черточкой «_», иначе при попытке исполнения будет выдана ошибка и программа остановится. Укажем, что этот макрос будет доступен для всех документов (шаблон Normal.dot), и нажмем кнопку Ok. На экране появится маленькая панель инструментов, указывающая, что программа находится в состоянии записи макроса. На ней всего две кнопки: Остановить запись и Пауза. Теперь до того момента, пока пользователь не нажмет кнопку Остановить запись, практически все наши действия с документом будут записываться.
Отправим на виртуальный принтер наш документ (как установить виртуальный принтер и как настроить систему для корректной подготовки и обработки PostScript-файлов, описано в предыдущей части статьи).
настройки меню печати должны выглядеть вот так:
- Принтер ... имя: Linotronic 330
- Масштаб ... число страниц на листе: 2
- Масштаб … по размеру страницы: Текущий или А4
- Страницы … номера: «16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9» (это в случае, если печатаем 16-страничную брошюру).
Нажимаем Ok — и программа просит указать папку, куда следует поместить создаваемый PostScript-файл. Укажем подкаталог In папки наблюдения (Watched Folder), которую мы определили ранее для Acrobat Distiller (см. предыдущую часть статьи). Это означает, что при активном Acrobat Distiller любой корректно созданный PostScript-файл, помещенный в эту папку, будет автоматически преобразовываться в PDF-файл и помещаться в подкаталог Out той же папки. Папка наблюдения может находиться где угодно, хотя, чтобы не путаться, я, как правило, создаю ее в корневом каталоге системного диска и помещаю туда все создаваемые PostScript-файлы.
Теперь еще раз Оk — и будет создан PostScript-файл, а команда печати запишется в виде макроса. Нажмем кнопку Остановить запись (рис. 3) — макрос печати записан, и можно его редактировать, дописывая необходимые команды.
Вызовем окно макросов (либо нажав Alt-F8, либо через главное меню Сервис –> Макрос –> Макросы). Появится диалоговое окно Макрос (рис. 4). Поскольку наш макрос мы записали в общий шаблон Word (Normal.dot), то в списке Макросы из: укажем именно этот шаблон.
Откроем макрос Спуск_полос, нажав кнопку Изменить. Тем самым мы запускаем редактор программ VBA, где и будем редактировать нашу программу. Пока что она имеет такой вид, как в листинге 1.
Обратите внимание, что программа начинается строкой Sub с именем макроса и скобками после этого имени, а завершается строкой End Sub. Это — обязательное условие для работы программы на VBA. Отметим также, что некоторые строки начинаются со знака апострофа. Это — комментарии, которые служат для пояснения как работы программы в целом, так и ее отдельных элементов. Как правило, в редакторе VBA строки комментариев отображаются зеленым цветом.
Редактирование записанного макроса
Имея записанный макрос, можем приступить к его редактированию. Но сначала определимся, что в нем должно быть для успешной работы.
Структурно наш макрос будет состоять из следующих частей:
- Создание и инициализация переменных.
- Формирование переменных для печати.
- Исполняемая часть (печать документа).
Исполняемая часть уже готова — это две последние команды (определение активного принтера и собственно печать). А вот первые две части мы будем дописывать.
При этом в первой части мы создадим и инициализируем все необходимые нам переменные, а во второй — присвоим этим переменным необходимые значения. Начнем редактировать наш макрос с последней, самой простой команды печати. Это — третья часть нашей программы.
Редактирование команды печати
В этой части (да и пока что во всей нашей программе) всего две команды: первая определяет активный принтер, на котором будет печататься документ; вторая устанавливает параметры печати и печатает документ. Вторая команда довольно длинная, поэтому разбита на несколько строк с помощью символа подчеркивания (нижний дефис) «_». Этот знак говорит о том, что команда не завершена и продолжается в следующей строке.
Первую команду мы оставим неизменной, а некоторые части второй будем модифицировать.
Сразу же удалим часть команды, выделенную красным цветом (FileName:=””,), — она нам не нужна.
Для выполнения поставленной задачи нам следует изменить только два элемента в команде печати на виртуальный принтер (прочие части этой команды уже содержат необходимую информацию для печати двух страниц на листе А4, и мы их трогать не будем).
Пока что эти элементы, которые нужно изменить в команде печати, выглядят вот так:
а) список страниц для печати (Pages:= ”16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9”) и
б) полное имя создаваемого PostScript-файла, который затем будет преобразован в PDF (OutputFileName:=””).
Сначала вместо строк, определяющих параметры этих элементов, подставим имена переменных: sListOfPages — список страниц для печати и sFileNamePS — полное имя создаваемого PostScript-файла.
После первоначальной правки наш макрос примет такой вид (первые две части пока что пусты), как в листинге 2.
Синим цветом выделены те строки команды в исполняемой части, куда мы подставим значения сформированных переменных.
Создание и инициализация переменных
Вообще-то по строгим правилам программирования следовало бы сначала определить все переменные, используемые в программе, и указать их тип. Но поскольку у нас всего один небольшой модуль и вопросы экономии памяти и быстродействия программы для нас не критичны, предоставим VBA самостоятельно определять переменные при их создании и инициализации, то есть в момент первого присвоения значения.
В листинге 3 приведен список всех переменных, которые понадобятся нам для корректной работы программы. Обратите внимание, что все переменные в программе имеют префиксы, которые указывают на тип переменной: символьный (s) или численный (n). Это хотя и не обязательно, но весьма полезно, чтобы не путаться в идентификации переменных.
Большая часть этих переменных нужна нам для расчетов, а в исполняемую часть программы подставим всего две «финишные» переменные: sListOfPages — диапазон страниц для печати и sFileNamePS — полное имя PostScript-файла.
Уже здесь мы укажем значения для численных переменных nPageStart и nPageFinish (1 и 16 соответственно). Эти переменные созданы в начале списка не случайно, поскольку, пока не написан модуль контроля количества страниц в документе, эти параметры нужно будет задавать явно. То есть если в документе не 16 страниц, а больше или меньше, то нужно просто открыть макрос для изменения (Alt-F8 => выбрать макрос Спуск_полос =>) и ввести вместо числа 16 реальное количество страниц вашего документа. Сразу же после этого на основе переменных nPageStart и nPageFinish созданы переменные sPageStart и sPageFinish, содержащие те же данные, только преобразованные в символьный вид с помощью функции Str().
Формирование переменных для подстановки в команду печати
Переменная sListOfPages (список страниц для печати в PostScript-файл)
Содержимое переменной sListOfPages мы уже вводили вручную, осталось только придумать, как ее рассчитать автоматически.
В сущности, все очень просто: нужно, начиная с первой и последней страниц документа, идти от «краев» к «середине», формируя строку, состоящую из пар страниц; причем в каждой паре первой (левой страницей разворота) всегда должна стоять четная страница. Для этого в переменную sListOfPages будем последовательно добавлять пары страниц, присвоенные переменной sPagesPrint.
Начнем цикл For ... Next, который будет «идти» по номерам страниц от первой (определенной в переменной nPageStart) до середины списка (номер последней страницы, деленный на два: nPageFinish / 2).
Таким образом цикл последовательно «переберет» номера страниц от 1 до 8, каждый раз присваивая переменной счетчика nCounter текущее значение:
For nCounter = nPageStart To nPageFinish / 2
... (сюда нужно вставить все нижеописанные в этом разделе команды)
Next
Для создания этой части программы выполним следующее:
- Определим номера пар страниц для каждого печатного листа. Очевидно, что
меньший из номеров в каждой паре — просто текущее значение счетчика. Для подстановки
в строковую переменную номера страницы необходимо преобразовать численное
значение счетчика в символьную строку, что мы и сделаем с помощью функции
Str():
sPageMin = Str(nCounter)
А вот для определения большей страницы в текущей паре нужно от номера конечной страницы отнять текущее значение счетчика и прибавить единицу. Ну и конечно, тоже преобразовать результат в символьную строку с помощью функции Str():
sPageMax = Str(nPageFinish — nCounter + 1)
Кроме того, необходимо убрать лишние пробелы из символьных переменных с помощью функции Trim(), после чего эти две строки приобретут следующий вид:
sPageMin = Trim(Str(nCounter))
sPageMax = Trim(Str(nPageFinish – nCounter + 1))
- Составим пары страниц для каждого печатного разворота так, чтобы четная
страница всегда была первой в паре, и запишем результат в переменную sPagesPrint.
Для этого используем структуру ветвления (оператор условия) If … Then … <Else>
… End If.
Если значение счетчика nCounter — нечетное число (остаток от деления значения счетчика на два, вычисляемый оператором Mod, больше нуля), то в паре страниц первой ставится большая по номеру страница, если значение четное — меньшая:
If nCounter Mod 2 > 0 Then
‘ если первая нечетная
sPagesPrint = sPageMax + ”,” + sPageMin
Else
‘ если первая четная
sPagesPrint = sPageMin + ”,” + sPageMax
End If
- Последний шаг в подготовке списка страниц для печати — формирование переменной, содержащей все номера страниц для печати. Это делается просто добавлением уже готовых пар страниц в переменную sListOfPages. Один нюанс: перед первой парой страниц (когда значение счетчика nCounter равно единице) запятая не нужна, поэтому снова используем оператор условия:
If nCounter = 1 ThensListOfPages = sListOfPages + sPagesPrintElsesListOfPages = sListOfPages + ”,” + sPagesPrintEnd If
На этом часть программы, формирующая список страниц для печати, завершена. В результате ее выполнения создана символьная переменная sListOfPages, содержащая следующую строку ”16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9”.
Переменная sFileNamePS (полный путь для записи PostScript-файла)
Переменная sFileNamePS (полное имя файла) должна выглядеть так: «C:\_Image\In\<Имя_документа>_спуск_1-16.ps».
Чтобы создать ее, необходимо сделать следующее:
- Запишем в переменную sFileNameDOC «короткое» (без указания каталога) имя
файла активного документа. При этом все символы имени будут преобразованы
в строчные (маленькие) буквы с помощью функции LCase(). Это преобразование
хотя и не обязательно, но желательно, потому что при большом количестве файлов
в папке проще находить нужный файл, когда все имена набраны в одном регистре:
sFileNameDOC = LCase(ActiveDocument.Name)
- Заменим в «коротком» имени файла все точки на знак «_»с помощью функции
Replace(). Это необходимо во избежание путаницы с определением места, где
заканчивается файл и начинается его расширение. Из имени файла можно было
бы удалить и само расширение, но делать этого не стоит, поскольку приходится
работать с файлами разных типов (как *.doc, так и *.rft). А для надежной идентификации
источника PDF-файла лучше видеть имя исходного файла полностью, с расширением:
sFileNameDOC = Replace(sFileNameDOC, ”,”, ”_”)
- Дополним «короткое» имя словом «_спуск_» и диапазоном страниц, которые
выводятся на печать (эти данные, как вы помните, мы уже рассчитали в первой
части программы, создав переменные sPageStart и sPageFinish):
sFileNameDOC = sFileNameDOC + ”_спуск_” + sPageStart + ”-” + sPageFinish
- Укажем каталог для записи файлов печати PostScript. Это подпапка In той
самой папки наблюдения, которую мы определили в установках Acrobat Distiller
Я назвал ее _Images, но можно использовать любое другое имя, например _Output
или _Watched Folder. Обратите внимание, что имена таких папок начинаются с
подчеркивания. Это сделано для того, чтобы наша папка наблюдения находилась
в начале списке папок на диске и ее не нужно было долго искать (а заглядывать
в нее придется часто).
sDirIn = ”C:\_Images\In\”
- И наконец, «соберем» полное (то есть — с указанием каталога) имя файла
для печати и запишем его в переменную sFileNamePS. Для этого просто соединим
имя каталога для записи PostScript-файла и «короткое» имя файла, добавив к
ним расширение ”.ps”:
sFileNamePS = sDirIn + sFileNameDOC + ”.ps”
В результате выполнения этой части программы создана символьная переменная sFileNamePS, содержащая следующую строку: ”<Имя_документа>_спуск_1-16.ps”.
Вот, собственно, и все. В конечном итоге наша программа должна выглядеть, как в листинге 4.
Теперь откройте в Word файл, который нужно вывести на печать, нажмите Alt-F8, найдите в списке макросов Спуск_полос и кликните Выполнить. PostScript-файл будет автоматически записан в указанный вами каталог. Если при этом Acrobat Distiller активен, то PDF-файл с именем <Имя_документа>_спуск_1-16.pdf. будет сразу же создан и помещен в подпапку Out папки наблюдения.
Запускайте Adobe Acrobat, открывайте созданный PDF — и печатайте готовый спуск полос на любой принтер. Напомним, что драйвер виртуального принтера Linotronic 330 можно настроить так, чтобы сразу же делать «зеркальные» файлы для вывода пленок на обычном принтере.
Рекомендуем перед печатью всего документа внимательно просмотреть его и напечатать на пробу парочку разворотов со страницами, где есть графические элементы, особенно векторные. Очень редко, но бывают случаи, когда при печати таких элементов вокруг рисунка появляется тонкая линия. Решить эту проблему можно, подобрав другой виртуальный принтер (например, Agfa или CreatePDF из нового и очень удачного пакета Adobe PressReady).
В общем, как и при использовании любого программного продукта в реальных (чуть не сказал «боевых») условиях, необходимо экспериментировать. Очень скоро вы подберете нужные режимы и будете успешно готовить издания к печати, экономя свое время.
Вместо заключения
Представленная здесь программа, написанная на VBA, — минимально необходимый набор команд для успешной печати спуска полос из Word. На самом деле написанная автором этой статьи программа значительно больше и включает в себя также модули контроля количества страниц в документе (это количество должно быть кратно 4), экранные диалоговые окна для ввода начальных параметров (определение диапазона разворотов на вывод, например), настроенные панели инструментов для быстрого запуска макроса и т.д. Но описание всего этого заняло бы слишком много места, да и задача статьи, в общем-то, иная: показать коллегам потенциальные возможности автоматизации работы путем программирования на VBA для офисных приложений.
Кроме того, данная программа, если внимательный читатель заметил, предназначена для печати документов с небольшим количеством страниц. Дело в том, что внакидку (то есть одной тетрадкой) можно печатать издания объемом до 80 страниц. Большее количество листов сложно сшивать, к тому же такое издание будет выглядеть несуразно и его неудобно читать. Для изданий с большим количеством страниц применяется либо сборка на термобиндер, либо ниткошвейное соединение. Соответственно и спуск полос в таком случае следует делать не одной тетрадкой, а несколькими, в каждой из которых может быть от 4 до 32 страниц.
Естественно, автором написаны соответствующие программы. Однако, повторюсь, их описание заняло бы слишком много места. Предлагаю читателям самостоятельно решить эту задачу, тем более что принцип построения такой программы здесь уже описан.
В следующей статье — описание приемов коррекции полей и масштаба подготовленных в Word публикаций без переверстки. Эта проблема хотя и является чрезвычайно болезненной для реальной практики фирм оперативной полиграфии, но вполне успешно решается с помощью VBA и программы Adobe Acrobat.
КомпьюАрт 9'2002