22. РАБОТА С PDF ФАЙЛАМИ

В этом разделе описана команда ACL называемая #pdocument или короче #pd. Это супер-сложная команда, которая позволяет создавать документы в файлах в формате pdf. PDF (portable document format) -- это язык программирования полиграфической продукции любой степени сложности для передачи по интернету, то есть главным критерием считается компактность файлов, а не простота их записи, как в языке постскрипт. Этот язык, как и постскрипт, является продуктом фирмы Adobe (http://www.adobe.com). Главной программой этой фирмы для работы с pdf-файлами является Adobe Acrobat, а для чтения таких файлов на указанном выше сайте фирмы бесплатно распространяется интерпретатор Adobe Acrobat Reader. Но pdf-файлы можно создавать и с помощью других программ. В интерпретаторе ACL для нормального функционирования команды #pd я использовал библиотеку Java классов iText-1.3, разработанную Bruno Lowagie, разные версии которой можно скачать на сайте "http://sourceforge.net". Она имеет довольно большой размер. Пока освоена только часть библиотеки, так что возможно команда будет развиваться в последующих версиях. Создание pdf-документа выполняется в помощью серии операций, которые последовательно описаны ниже:

.

 #pd [op=open; file=; twi=; the=; wid=; hei=; xsh=; ysh=; mo=; le=; sav=; sty=; bot=; top=;] FT ...

Эта операция открывает pdf document. Основные ее параметры имеют следующий смысл: [file] -- название файла документа, должно иметь расширение (.pdf), [twi], [the] -- полные размеры листа в единицах pt, [wid], [hei] -- размеры рабочей области (текста) в единицах pt, [xsh], [ysh] -- сдвиг рабочей области из левого нижнего угла листа в единицах pt. Единица pt -- это широко распространенная единица изменения длины в типографии. Так размер листа бумаги формата A4 в единицах pt равен 596*843 pt. В этих же единицах измеряют размеры текстовых фонтов.

Аргументы зависят от значений параметра [mo]. Чаще всего [mo=0;]. В общем случае [mo]=KLMN - четырехразрядное целое число, каждый разряд которого имеет значение 0 или 1. Приоритет справа налево, то есть если N > 0, то страницы pdf документа имеют footer, это отдельный текст, помещаемый в нижней части каждой страницы. В этом случае считывается аргумент FT, состоящий из текста и двух чисел, разделенных вертикальной чертой, например: footer-text|1|0\E. Если первое число больше 0, то на страницы будет автоматически поставлен номер страницы, начиная с номера, равного числу. В противном случае номера страницы не будет. Второе число указывает какие из сторон прямоугольника будут прочерчены. Число должно быть суммой чисел 0 (ничего) 1 (верх) 2 (низ) 4 (лево) 8 (право). Дополнительно используется параметр [bot] = 0 (текст слева) 1 (текст в середине) 2 (текст справа). Если M > 0, то страницы pdf документа имеют header, это отдельный текст, помещаемый в верхней части каждой страницы. В этом случае считывается аргумент FT, состоящий из текста и двух чисел, разделенных вертикальной чертой, например: header-text|1|0\E. Если footer заказан, то этот аргумент будет вторым. Если первое число больше 0, то на страницы будет автоматически поставлен номер страницы, начиная с номера, равного числу. В противном случае номера страницы не будет. Второе число указывает какие из сторон прямоугольника будут прочерчены. Число должно быть суммой чисел 0 (ничего) 1 (верх) 2 (низ) 4 (лево) 8 (право). Дополнительно используется параметр [top] = 0 (текст слева) 1 (текст в середине) 2 (текст справа). Если L > 0, то в документ записываются meta-данные, содержащиеся в отдельном (следующем по порядку за предыдущими) аргументе FT == title|subject|keywords|creator|author\E. Этот аргумент описывает meta-данные, которые не показываются, а включаются в комментарии к файлу, и смысл которых следует из названия разделов, то есть заголовок, тема, ключевые слова, создатель, автор. Если K > 0, то дополнительно еще один аргумент FT == UserpasswOwnerpassw\E определяет пароли. При этом параметр [le] указывает сколько символов в строке относится к Userpassw, остальные образуют Ownerpassw, параметр [sty] обычно = 0, но может быть и = 1, параметр [sav] -- это число, у которого каждый двоичный разряд означает разрешение какой-либо операции, и оно должно быть суммой чисел:

AllowDegradedPrinting=4,
AllowModifyContents=8,
AllowCopy=16,
AllowModifyAnnotations=32,
AllowFillIn=256,
AllowScreenReaders=512,
AllowAssembly=1024,
AllowPrinting=2052.

Если разрешить печать и копирование, то получаем число 2052+16=2068. В этом случае на остальные неразрешенные операции запрашивается пароль. Например, если бит AllowScreenReaders не равен 1, то есть числа 512 нет в сумме, то пользователь будет обязан ввести пароль Userpassw для показа файла на экране. Смысл Ownerpassw остался не ясен.

.

 #pd [op=clos;]

Эта операция закрывает pdf document и записывает его в файл.

.

 #pd [op=para; b=; tfo=; tki=; tsi=; col=;] FT

Эта операция помещает параграф текста на страницу документа с новой строки. Сам текст является аргументом. Параметр [tfo] указывает индекс семейства фонтов: Courier = 0 ; Helvetica = 1 ; Times-Roman = 2 ; Symbol = 3 ; ZapfDingbats = 4, параметр [tki] указывает индекс типа фонта: normal = 0 ; bold = 1 ; italic = 2 ; bolditalic = 3 ; underline = 4 ; strikethru = 8, параметр [tsi] указывает размер фонта в единицах pt, параметр [col] указывает номер цвета текста из таблицы цветов, параметр [b] указывает индекс реального массива r(), содержащего вещественные параметры:   Sb   Sa   Al   If   Il   Ir,  где: Sb -- вертикальный отступ перед параграфом, Sa -- вертикальный отступ после параграфа, Al -- горизонтальное положение текста = 0 (слева) 1 (середина) 2 (справа), If -- горизонтальный отступ первой строки (табуляция), Il -- горизонтальное поле слева от текста, Ir -- горизонтальное поле справа от текста.

.

 #pd [op=text; tfo=; b=; col=; sty=;] FT

Эта операция помещает текст на страницу документа. Параметр [tfo] указывает номер текстового фонта из 15 установленных в самой программе, а именно, 1 (Courier) 2 (Courier-Bold) 3 (Courier-Oblique) 4 (Courier-BoldOblique) 5 (Helvetica) 6 (Helvetica-Bold) 7 (Helvetica-Oblique) 8 (Helvetica-BoldOblique) 9 (Times) 10 (Times-Bold) 11 (Times-Italic) 12 (Times-BoldItalic) 13 (Times-Roman) 14 (Symbol) 15 (ZapfDingbats), параметр [col] указывает номер цвета из таблицы цветов, параметр [b] указывает номер реального массива r(), содержащего 4 числа: S,   X,   Y,   R,  где S -- размер текста, X и Y -- абсолютная позиция на странице, все три параметра в единицах pt, R -- угол вращения в радианах. Параметр [sty] указывает положение текста относительно позиции, 0 - левым краем, 1 - серединой, 2 - правым краем, FT - сам текст.

.

 #pd [op=imag; mo=; b=; file=;]

Эта операция помещает на страницу документа картинку из файла с форматом jpg, gif, png, bmp, tif, wmf, eps. Имя файла определяет параметр [file]. Параметр [b] указывает первый индекс вещественного массива, в котором записаны числовые параметры. Параметр [mo] = KM состоит из двух десятичных разрядов. Разряд M указывает способ масштабирования картинки, а именно, 0 - процент от исходного размера, 1 - заданная ширина в pt, 2 - заданная высота в pt. Аспектное соотношение не меняется. Разряд K указывает способ размещения картинки, а именно, 0 - сразу после предыдущего текста, 1 - по абсолютным координатам левого нижнего угла в единицах pt. Вещественный массив r() должен содержать 5 чисел : X,   Y,   A,   S,   R, где X, Y -- абсолютные координаты (K=1) или вертикальное пространство до и после картинки (K=0) A -- позиция картинки в строке (K=0) При этом A = 0 (слева) 1 (в центре) 2 (справа), S -- масштабирование, равно процентам (M=0), ширине в pt (M=1), высоте в pt (M=2), R -- угол вращения картинки в градусах. Картинки, устанавливаемые позднее закрывают поставленные ранее, так как прозрачности нет. По этой причине картинки по абсолютным координатам надо ставить после потоковых.

.

 #pd [op=page;]

Эта операция принудительно переводит курсор документа на новую страницу. Обычно переход на новую страницу происходит автоматически после заполнения текущей страницы.

.

 #pd [op=rpdf; file=; b=;]

Эта операция прочитывает внешний pdf-файл с полным названием [file]. Параметр s(1) возвращает полное число страниц в файле, [b] указывает первый индекс реального массива r(), в котором будут записаны ширина и высота каждой страницы в порядке w1, h1, w2, h2, . . . Прочитанный pdf-файл может быть впоследствии использован при создании нового документа.

.

 #pd [op=wpdf; num=; b=;]

Эта операция как раз записывает в pdf-файл страницу с номером [n] из прочитанного внешнего pdf-файла. Параметр [b] указывает индекс первого элемента вещественного массива r(), в котором записаны параметры преобразования страницы, всего 5, имеющие смысл : translateX,   translateY,   scaleX,   scaleY,   angle-rotate,   первые 2 в единицах pt, 3 и 4 равны 1 если не надо изменений, 5-й в градусах. Таким образом, страница может быть изменена в размерах (scale), повернута на угол (rotate) и сдвинута относительно начала (translate). Сдвиг отсчитывается от левого нижнего угла страницы документа.

.

 #pd [op=smar; b=;]

Эта операция устанавливает поля на следующую страницу документа. Параметр [b] указывает на первый индекс реального массива r(), где записаны значения полей в единицах pt в порядке: левое, правое, верх, низ.

.

 #pd [op=smmi; mo=;]

Эта операция устанавливает режим зеркального отражения полей от страницы к странице: ДА если [mo]=1 ; НЕТ в остальных случаях.

.

 #pd [op=spgn; num=;]

Эта операция вводит номер страницы и режим нумерации страниц, если таковой до этого отсутствовал. Первым номером является значение параметра [n].

.

 #pd [op=opeg; wid=; hei=; col=;]

Эта операция открывает режим универсальной графики для записи в pdf файл, область графики ограничена параметрами [wid] и [hei]. Первоначально область закрашивается цветом с номером [col] из таблицы цветов. Предполагается, что перед этим открыт pdf документ. После этой команды можно пользоваться всеми операциями универсальной графики, то есть команды #eg , кроме открытия и закрытия, так как результат будет записан только в pdf файл. К сожалению внутренние фонты pdf документов не поддерживают русские буквы, так что русские тексты не показываются. Графику с русскими текстами надо предварительно записывать в картинку командой #eg и затем вставлять картинку в pdf-файл.

.

 #pd [op=cleg; xsh=; ysh=;]

Эта операция записывает универсальную графику в pdf файл, при этом область графики помещается на страницу pdf документа с левым и нижним полями, размер которых определяется координатами [xsh] и [ysh]. Предполагается что перед этим открыт как pdf документ, так и графика.

Лично я наиболее часто пользуюсь этой командой для конвертирования png-картинок в pdf-картинки, которые затем можно вставлять в LaTeX документ. Однако, в принципе, возможностей уже разработанных операций вполне хватает, чтобы приготовить полномасштабную pdf презентацию. Еще одним простым и удобным применением является создание страниц с фотографиями и комментариями для распечатки на принтере.