Мельница данных- Разработка отчетов  (раздел целиком)  (18.04.2024)
Разработка отчетов

1. Создание шаблонов PDF-отчетов

1.1. Описание

Portable Document Format (PDF) — кроссплатформенный формат электронных документов, созданный фирмой Adobe Systems с использованием ряда возможностей языка PostScript. В первую очередь предназначен для представления в электронном виде полиграфической продукции, — значительное количество современного профессионального печатного оборудования может обрабатывать PDF непосредственно. Для просмотра можно использовать официальную бесплатную программу Adobe Reader, а также программы сторонних разработчиков. Традиционным способом создания PDF-документов является виртуальный принтер, то есть документ как таковой готовится в своей специализированной программе — графической программе или текстовом редакторе, САПР и т. д., а затем экспортируется в формат PDF для распространения в электронном виде, передачи в типографию и т. п. Формат PDF позволяет внедрять необходимые шрифты (построчный текст), векторные и растровые изображения, формы и мультимедиа-вставки. Поддерживает RGB, CMYK, Grayscale, Lab, Duotone, Bitmap, несколько типов сжатия растровой информации. Имеет собственные технические форматы для полиграфии: PDF/X-1, PDF/X-3. Включает механизм электронных подписей для защиты и проверки подлинности документов. В этом формате распространяется большое количество сопутствующей документации. Чаще всего PDF-файл является комбинацией текста с растровой и векторной графикой, реже — текста с формами, JavaScript'ом, 3D-графикой и другими типами элементов.

В приложениях Платформы "Мельница данных" для создания PDF-документов используется собственная библиотека PDFCreator.dll. С помощью библиотеки возможно прямое создание документов версии 1.3 . Создание PDF-документов осуществляется путем ввода предопределенных в библиотеке команд, которые в дальнейшем интерпретируются на основе языка описания страниц POSTSCRIPT.

Важно!
Все размеры графических объектов, размеры страниц, шрифтов и т.п. по умолчанию заданы в миллиметрах.
Совет
Для удобства построения шаблона PDF-документа создана функция DrawGrid. При ее включении при отладке при создании шаблона будет отображена визуальная сетка с шагом 5 миллиметров.
C гридом

1.2. Методы

1.2.1. Свойства документа

Для создания и описания свойств PDF-документа в библиотеке PDFCreator.dll используется класс IPDFDocument, обладающий следующими свойствами:

  • Title (WideString) - заголовок документа. По умолчанию - пустая строка.
    Пример
    Title = "DOC1"
  • CanEmbedFonts (WordBool) - Признак возможности построения PDF- документа со встроенными шрифтами (Embedded Fonts). В случае включения признака, все объявленные в скрипте шрифты будут включены в сборку документа и будут передаваться целиком вместе с документом. По умолчанию - False.
    Пример
    CanEmbedFonts = True 
    CanEmbedFonts = False 
  • CanCompress (WordBool) - признак сжатия документа при создании по собственным алгоритмам. По умолчанию - True.
    Пример
    CanCompress = False 
    CanCompress = True
  • Author (WideString) - автор документа. По умолчанию - текущий пользователь ОС.
  • Subject (WideString) - описание документа. По умолчанию - пустая строка.
  • Keywords (WideString) - ключевые слова для поиска по документу. По умолчанию - пустая строка.
  • Creator (WideString) - приложение-родитель документа. Указывается в том случае, если документ был сконвертирован из другого формата.
  • PageCount (Integer) - свойство, содержащее общее количество страниц в документе.
  • Pages[Index: Integer]: IPDFPage - свойство документа, предназначенное для перебора страниц документа для совершения над ними однотипных действий.
    Пример

    Пример использования:

    1for I = 0 to PageCount - 1
    2  Pages(I).rectangle 10,10,10,10, false
    3next
    Save "c:\pdf.pdf"

    Результат: На всех страницах документа будут нарисованы квадраты 10х10 мм.
  • procedure Save(Target: OleVariant) - процедура для сохранения документа PDF на жесткий диск сразу после создания.
    Пример
    Save "c:\pdf.pdf"
    - сохранит документ в файл c:\pdf.pdf


1.2.2. Свойства страницы

Для создания страницы используется функция

function CreatePage(Parent: OleVariant): IPDFPage;

Параметр Parent указывает страницу-родителя для данной страницы. Если страницы- родителя быть не должно - формат вызова функции примет вид:

set page = CreatePage(Null)

Параметры страницы:

  • Title - заголовок страницы.
    Пример
    page.Title = "Page name"
          
  • Width - ширина страницы, миллиметры
    Пример
    page.Width = 80
          
  • Height - высота страницы, миллиметры
    Пример
    page.Height = 80
          
  • DrawGrid - процедура, выводящая на страницу сетку с шагом 5 миллиметров для удобства отладки вида документа.
  • Perform - процедура, позволяющая выполнить дополнительные команды PostScript на странице.
    Пример
    page.perform "1 0.7 0 0 k"page.perform "0 0 m"
          

1.2.2.1. Объявление цвета

Для объявления цвета объектов на странице используется цветовая модель R:G:B (Red:Green:Blue). Объявление цвета для выполнения последующих операций (цвет шрифта, цвет линии/фигуры) осуществляется процедурой

procedure SetColor(R: Integer; G: Integer; B: Integer);
Где параметры R, G, B - значения базисных цветов для выбранного цвета (от 0 до 255).

Пример
ЦветRGB
Белый 255 255 255 +++
Черный 0 0 0 +++
Серый 190 190 190 +++
Синий 0 0 255 +++
Красный 255 0 0 +++
Зеленый 0 255 0 +++
Важно!

Если предварительно цвет не был объявлен, используется цвет по умолчанию - черный (0,0,0)


1.2.3. Графика

1.2.3.1. Линии

Для отрисовки линий используется процедура

procedure Line(X1: Double; Y1: Double; X2: Double; Y2: Double);
Здесь:

  • X1 - координата начала линии по горизонтали в миллиметрах от верхнего левого угла листа.
  • Y1 - координата начала линии по вертикали в миллиметрах от верхнего левого угла листа.
  • X2 - координата конца линии по горизонтали в миллиметрах от верхнего левого угла листа.
  • Y2 - координата Конца линии по вертикали в миллиметрах от верхнего левого угла листа.

Для задания толщины линии используется свойство

property LineWidth: Double
Значение толщины задается в миллиметрах. Значение по умолчанию - минимально возможная единица рисования для устройства. Так для монитора - 1 pixel, для принтера - 1 dot (точка)

Для задания стиля отрисовки начала/окончания линии используется свойство property LineCap: TPDFLineCap
Возможные стили:
Значение свойства: Отображение: Описание:
0Линия 0Прямой срез точно по точкам начала и окончания линии (по умолчанию)
1Линия 1С закруглением
2Линия 2Прямой срез с продолжением линии на половину толщины линии

Объявление цвета линии.

Пример
Две линии разной толщины, с разными окончаниями и цветами:
01set page = CreatePage(Null)
02
03page.DrawGrid
04
05page.LineCap = 1
06
07page.LineWidth = 2
08
09page.Line 10, 10, 30, 30
10
11page.LineWidth = 4
12
13page.SetColor 255, 0, 0
14
15page.LineCap = 2
16
page.Line 10, 30, 30, 10."I 


Результат:
2 линии

При необходимости соединения линий под углом в определенной точке можно задать тип соединения. Для объявления типа соединения используется свойство property LineJoin: TPDFLineJoin;
Типы соединения двух линий:
Значение свойстваОтображениеОписание
02 линии 0С острым углом
12 линии 1С закруглением
22 линии 2С обрезанным углом

Пунктир

Для создания пунктира используется процедура отображения линии с предварительно объявленными дополнительными значениями.

Процедура procedure SetDash(DashArray: OleVariant; Phase: Integer); Здесь DashArray - массив значений в миллиметрах, указывающий последовательность чередования штрихов и пропусков на линии, Phase - смещение в миллиметрах по линии.

Пример
Пример 1. Штрих 10 мм, Промежуток 5 мм, Смещения нет
Пример 2. Штрих 10 мм, Промежуток 5 мм, Смещение 5 мм
Пример 3. Различные значения штрихов и промежутков, Смещения нет
01set page = CreatePage(Null)
02
03page.DrawGrid
04
05page.LineWidth = 3
06
07page.SetDash Array(10, 5), 0
08
09page.Line 10, 10, 100, 10
10
11page.SetDash Array(10, 5), 5
12
13page.Line 10, 20, 100, 20
14
15page.SetDash Array(10, 5, 3, 2, 12, 20), 0
16
page.Line 10, 30, 100, 30

Результат:
Пунктир 1

Ломанная линия - здесь непрерывная линия, состоящая из нескольких прямых. Для отображения ломанной используется процедура procedure Poly(Points: OleVariant; Fill: WordBool), где Points - массив координат точек соединяемых прямыми, а Fill - признак заливки полученной замкнутой фигуры (если замкнута).

Пример
Пример Звезда без заливки
1set page = CreatePage(Null)
2
3page.DrawGrid
4
5page.LineWidth = 3
6
page.Poly  Array(10, 45, 100, 45, 27, 103, 55, 10, 82, 103, 10, 45), false

Результат:
Звезда
Пример
Пример Звезда с заливкой
1set page = CreatePage(Null)
2
3page.DrawGrid
4
5page.LineWidth = 3
6
page.Poly  Array(10, 45, 100, 45, 27, 103, 55, 10, 82, 103, 10, 45), true

Результат:
Звезда заливка

1.2.3.2. Прямоугольник

Rectangle (Прямоугольник) - для создания используется процедура:

procedure Rectangle(X1: Double; Y1: Double; Width: Double; Height: Double; Fill: WordBool);
Здесь:

  • X1 - координата верхнего левого угла прямоугольника по горизонтали в миллиметрах от верхнего левого угла листа шаблона.
  • Y1 - координата верхнего левого угла прямоугольника по вертикали в миллиметрах от верхнего левого угла листа шаблона.
  • Width - ширина прямоугольника с миллиметрах.
  • Height - высота прямоугольника с миллиметрах.
  • Fill - признак заливки прямоугольника (True/False). Если значение True то заливка производится объявленным заранее цветом (см. Объявление цвета). Если False - заливка не производится. Прямоугольник отрисовывается линиями с предварительно заданной толщиной. См. Линии
Пример
Пример 1. Создание красного прямоугольника:
1set page = CreatePage(Null)
2
3page.SetColor 255, 0, 0
4
5page.Rectangle 10, 15, 40, 20, True
6
page.DrawGrid
Результат:
Прямоугольник
Пример 2. Пустой прямоугольник без задания цвета:
1set page = CreatePage(Null)
2
3page.DrawGrid
4
5page.Rectangle 12, 17, 42, 25, false
6
page.DrawGrid

Результат:
Прямоугольник false

Также существует возможность изменения стиля отображения углов прямоугольника. Для этого нужно использовать свойство property LineJoin: TPDFLineJoin;

Значение свойстваОтображениеОписание
02 линии 0С острым углом
12 линии 1С закруглением
22 линии 2С обрезанным углом

Пример построения прямоугольников с различными типами соединения сторон:

Пример
01set page = CreatePage(Null)
02
03page.DrawGrid
04
05page.LineWidth = 4
06
07page.LineJoin = 0
08
09page.Rectangle 10, 10, 20, 10, false
10
11page.LineJoin = 1
12
13page.Rectangle 40, 10, 20, 10, false
14
15page.LineJoin = 2
16
page.Rectangle 70, 10, 20, 10, false


Результат:
3 прямоугольника

1.2.3.3. Вставка готовых изображений

Для вставки на создаваемую страницу готового изображения используется процедура procedure Image(const FileName: WideString; X: Double; Y: Double; Width: Double; Height: Double)

Параметры:

  • const FileName - имя файла изображения и путь к нему на жестком диске. Задается в кавычках.
  • X - координата левой верхней точки изображения по отношению к верхнему левому углу страницы по горизонтали в миллиметрах
  • Y - координата левой верхней точки изображения по отношению к верхнему левому углу страницы по вертикали в миллиметрах
  • Width - ширина изображения в миллиметрах
  • Height - высота изображения в миллиметрах.
Пример
1set page = CreatePage(Null)
2page.drawgrid
page.Image "c:\mill.bmp", 10,10, 30, 30

Результат:
Картинка

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


1.2.3.4. Векторная графика

Язык PostScript, с помощью которого создаются векторные изображения для PDF-документа, поддерживает создание типичных примитивных объектов, таких как:

  • Прямые и ломанные линии
  • Многоугольники
  • Окружности и эллипсы
  • Кривые Безье
  • Текст

При создании векторного изображения на странице PDF-документа в приложениях Платформы, команды построения примитивных объектов PostScript передаются на исполнение при помощи процедуры Perform. Подробнее об операторах и командах PostScript для создания PDF-документов можно узнать на сайте Adobe


1.2.4. Шрифты

Шрифты, которые должны использоваться в создаваемом документе, должны быть предварительно объявлены. Для объявления используемых шрифтов используется функция
function CreateFont(const FontName: WideString; Size: Double; Bold: WordBool; Italic: WordBool): IPDFFont; где:

  • const FontName - имя шрифта, аналогичное имени объявляемого шрифта в операционной системе. В Функции объявляется в кавычках.
  • Size - размер шрифта в пунктах
  • Bold - признак начертания шрифта "жирный". Значения - True или False
  • Italic - признак начертания шрифта "курсив". Значения - True или False
Пример
Примеры объявления шрифтов:
1set font = page.createFont("Arial", 20, False, False)
2set labelFont = page.createFont("Times New Roman", 16, False, True)
3set dataFont = page.createFont("Tahoma", 18, True, False)
  

Для вывода текстовой информации на страницу используются процедуры:

  • procedure WriteLine(const LineText: WideString; X: Double; Y: Double);
    - используется для вывода текстовой строки
  • function WriteText(const AText: WideString; X: Double; Y: Double; Width: Double; Alignment: TPDFTextAlignment): Double;
    - используется для вывода текстового блока.

Параметры для procedure WriteLine :

  • const LineText - текстовая строка для вывода. Прописывается в кавычках. Будет выведена на страницу одной строкой.
  • X - координата верхней левой точки текстовой строки по горизонтали в миллиметрах.
  • Y - координата верхней левой точки текстовой строки по вертикали в миллиметрах.
Пример
Примеры вывода текстов на страницу:
01set page = CreatePage(Null)
02page.DrawGrid
03set font = page.createFont("Arial", 20, False, False)
04set labelFont = page.createFont("Times New Roman", 16, False, True)
05set dataFont = page.createFont("Tahoma", 18, True, False)
06Font.WriteLine "Фамилия", 5, 2
07Font.WriteLine "Имя", 5, 10
08Font.WriteLine "Отчество", 5, 18
09labelFont.WriteLine "Дата рождения", 5, 26
10dataFont.WriteLine "Национальность", 5, 34
  

Результат:
Разные шрифты

Параметры для function WriteText :

  • const AText - текст для вывода на страницу. Прописывается в кавычках. Будет выведена на страницу в виде текстового блока.
  • X - координата верхней левой точки текстового блока по горизонтали в миллиметрах.
  • Y - координата верхней левой точки текстового блока по вертикали в миллиметрах.
  • Width - ширина текстового блока в миллиметрах
  • Alignment - тип выравнивания текста в текстовом блоке.
    Значение параметраТип выравнивания
    0 По левому краю
    1 По правому краю
    2 По центру
    3 Выравнивание по ширине
Пример
Примеры вывода текстовых блоков на страницу:
1set page = CreatePage(Null)
2page.DrawGrid
3set font = page.createFont("Arial", 14, False, False)
4set labelFont = page.createFont("Times New Roman", 12, False, True)
5set dataFont = page.createFont("Tahoma", 11, True, False)
6Q = font.WriteText ("Тест работы свойства для выравнивания текста в текстовом блоке для документа PDF, создаваемого на Платформе Мельница Данных", 5, 5, 100, 0)
7Q = labelFont.WriteText ("Тест работы свойства для выравнивания текста в текстовом блоке для документа PDF, создаваемого на Платформе Мельница Данных", 5, 35, 100, 1)
8Q = dataFont.WriteText ("Тест работы свойства для выравнивания текста в текстовом блоке для документа PDF, создаваемого на Платформе Мельница Данных", 5, 55, 100, 2)
9Q = dataFont.WriteText ("Тест работы свойства для выравнивания текста в текстовом блоке для документа PDF, создаваемого на Платформе Мельница Данных", 5, 80, 100, 3)
  

Результат:
Выравнивание

Свойства шрифтов:

property Spacing: Double; - свойство, отвечающее за величину промежутка между буквами в слове. Задается в виде отклонения от промежутка между буквами по умолчанию для выбранного шрифта по горизонтальной оси в миллиметрах. Значение свойства равное "0" соответствует значению по умолчанию.

Пример
Пример:
01set page = CreatePage(Null)
02page.DrawGrid
03set font = page.createFont("Arial", 14, False, False)
04set labelFont = page.createFont("Arial", 14, False, False)
05set dataFont = page.createFont("Arial", 14, False, False)
06font.Spacing = 0
07labelFont.Spacing = 1
08dataFont.Spacing = 2
09font.WriteLine "Промежуток по умолчанию (0)", 5, 5
10labelFont.WriteLine "Промежуток с отклонением (1 мм)", 5, 10
11dataFont.WriteLine "Промежуток с отклонением (2 мм)", 5, 15
  

Результат:
Промежуток букв

property WordSpacing: Double; - свойство, отвечающее за величину промежутка между соседними словами. Задается в виде отклонения от промежутка между словами по умолчанию для выбранного шрифта по горизонтальной оси в миллиметрах. Значение свойства равное "0" соответствует значению по умолчанию.

Пример
Пример:
01set page = CreatePage(Null)
02page.DrawGrid
03set font = page.createFont("Arial", 14, False, False)
04set labelFont = page.createFont("Arial", 14, False, False)
05set dataFont = page.createFont("Arial", 14, False, False)
06font.WordSpacing = 0
07labelFont.WordSpacing = 2
08dataFont.WordSpacing = 5
09font.WriteLine "Промежуток по умолчанию (0)", 5, 5
10labelFont.WriteLine "Промежуток с отклонением (2 мм)", 5, 10
11dataFont.WriteLine "Промежуток с отклонением (5 мм)", 5, 15
  

Результат:
Промежуток слов

property Scaling: Double; - свойство, отвечающее за горизонтальное масштабирование букв используемого шрифта. Устанавливается в процентах. Горизонтальный масштаб по умолчанию - 100%.

Пример
Пример:
01set page = CreatePage(Null)
02page.DrawGrid
03set font = page.createFont("Arial", 14, False, False)
04set labelFont = page.createFont("Arial", 14, False, False)
05set dataFont = page.createFont("Arial", 14, False, False)
06font.Scaling = 50
07labelFont.Scaling = 100
08dataFont.Scaling = 200
09font.WriteLine "Сжатие (50)", 5, 5
10labelFont.WriteLine "По умолчанию (100)", 5, 10
11dataFont.WriteLine "Растягивание (150)", 5, 15
  

Результат:
Scaling

property RenderingMode: TPDFFontRenderingMode; - свойство, отвечающее за заливку букв используемого шрифта.
Типы заливки:
Значение параметра:Отображение:Описание:
0 Font Fill Сплошная заливка (по умолчанию). Буква заливается сплошным цветом,
объявленным на данный момент.
1 Font Stroke Только граница. Прорисовывается граница буквы. Тело остается незалитым.
2 Font FillStroke Сначала заливка, потом граница. Граница прорисовывается всегда черным цветом.
Заливка осуществляется сплошным цветом, объявленным на данный момент.
3 Inv Невидимый шрифт.

Пример
Пример:
01set page = CreatePage(Null)
02set font = page.createFont("Arial", 20, False, False)
03set labelFont = page.createFont("Arial", 20, False, False)
04set dataFont = page.createFont("Arial", 20, False, False)
05font.RenderingMode = 0
06labelFont.RenderingMode = 1
07dataFont.RenderingMode = 2
08page.setColor 255, 0, 0
09Q = font.WriteText ("Олимпиада", 5, 5, 50, 0)
10Q = labelFont.WriteText ("Олимпиада", 5, 15, 50, 0)
11Q = dataFont.WriteText ("Олимпиада", 5, 25, 50, 0)
  

Результат:
Заливка букв

property Rise: Double; - свойство, отвечающее за перемещение текста по вертикали.

Пример
01set page = CreatePage(Null)
02page.DrawGrid
03set font = page.createFont("Arial", 20, False, False)
04set labelFont = page.createFont("Arial", 7, False, False)
05set dataFont = page.createFont("Arial", 7, False, False)
06labelFont.rise = -17
07dataFont.rise = -2
08Q = font.WriteText ("Олимпиада", 5, 5, 50, 0)
09Q = labelFont.WriteText ("Олимпиада", 44, 5, 50, 0)
10Q = dataFont.WriteText ("Олимпиада", 44, 5, 50, 0)
  

Результат:
Rise

Для определения размеров текстовой строки используется процедура MeasureLine(const LineText: WideString; out Width: OleVariant; out Height: OleVariant);

Здесь:

  • LineText - исходный текст для размещения на странице
  • Width - возвращаемый параметр ширины текстового блока на странице
  • Height - возвращаемый параметр высоты текстового блока на странице
Пример
1S = "шифр"
2font.MeasureLine S, W, H
3Q = font.WriteText(S, 139, 244 + ((23 - H) / 2), 40, 2)
  


Здесь для текста "Шифр" замеряется ширина и высота получившегося текстового блока. Затем полученные данные используются для корректного размещения текста на странице.

Для определения высоты текстового блока используется функция MeasureText(const AText: WideString; Width: Double): Double; safecall;

Функция распределит текст по задаваемому значению ширины текстового блока и вернет значение высоты текстового блока в милиметрах.

Здесь:

  • AText - исходный текст для размещения на странице. Прописывается в кавычках.
  • Width - задаваемая ширина текстового блока на странице в милиметрах.
Пример
1S = "Текст для размещения на странице..."
2Q = font.MeasureText(S, 139)
  
Здесь для текста "Текст для размещения на странице..." замеряется высота получившегося текстового блока. Затем полученные данные могут использоваться для корректного размещения текста на странице.

1.3. Порядок создания

Для создания шаблона PDF-документа необходимо в системной форме Платформы выбрать класс, к которому будет строиться документ. В подменю "Подпрограммы" вызвать контекстное меню и выбрать пункт "Создать шаблон отчета PDF". Заполнить необходимые поля и приступить к созданию скрипта в окне "Скрипт шаблона".

Конструктор
  1. Объявляем все переменные.
  2. Создаем страницы
  3. Устанавливаем все свойства документа и страниц
  4. Рисуем простые графические объекты
  5. Объявляем все используемые шрифты
  6. Расставляем постоянный текст на странице
  7. Расставляем переменный текст на странице
  8. Вставляем или создаем сложные графические объекты
Пример
Пример документа PDF:
001set LDataSet = createDataSet("TRoundAbiturSt")
002'Объявление переменных
003LDataSet.AddQueryItem 1, "ID", ID
004LDataSet.AddQueryItem 0, "RoundComp$N"
005LDataSet.AddQueryItem 0, "BachRound$N"
006LDataSet.AddQueryItem 0, "LastName"
007LDataSet.AddQueryItem 0, "FirstName"
008LDataSet.AddQueryItem 0, "MiddleName"
009LDataSet.AddQueryItem 0, "BirthDate"
010LDataSet.AddQueryItem 0, "RegNumber"
011LDataSet.AddQueryItem 0, "SecondStageCity$D"
012LDataSet.AddQueryItem 0, "PhoneList"
013
014'Присваивание переменным значений
015OlympName = LDataSet.Field("RoundComp$N")
016OlympClass = LDataSet.Field("BachRound$N")
017LastName = LDataSet.Field("LastName")
018FirstName = LDataSet.Field("FirstName")
019MiddleName = LDataSet.Field("MiddleName")
020if not IsNull(LDataSet.Field("BirthDate")) then
021  BirthDate = LDataSet.Field("BirthDate")
022else
023  BirthDate = "(не задана)"
024end if
025RegNo = LDataSet.Field("RegNumber")
026if not IsNull(LDataSet.Field("SecondStageCity$D")) then
027  OlympCity = LDataSet.Field("SecondStageCity$D")
028else
029  OlympCity = "(не выбран город участия)"
030end if
031if not IsNull(LDataSet.Field("PhoneList")) then
032  Phone = LDataSet.Field("PhoneList")
033else
034  Phone = ""
035end if
036
037'CanCompress = False - признак сжатия файла
038set page = CreatePage(Null) ' создаем страницу
039'Объявляем используемые шрифты
040set font = page.createFont("Arial", 20, False, False)
041set labelFont = page.createFont("Arial", 16, False, False)
042set dataFont = page.createFont("Arial", 18, True, False)
043set bigFont = page.createFont("Arial", 24, False, False)
044
045'page.DrawGrid  - рисуем сетку для удобства отладки
046
047page.LineWidth = 0.5 ' Установка толщины линии
048
049' Рисуем прямоугольники
050page.Rectangle 8, 12, 4, 4, True
051page.Rectangle 190, 12, 4, 4, True
052
053page.Rectangle 8, 273, 4, 4, True
054page.Rectangle 105, 273, 4, 4, True
055page.Rectangle 190, 273, 4, 4, True
056
057'Выводим постоянный и переменный текст
058Q = font.WriteText ("Межрегиональная олимпиада школьников", 12, 20, 178, 2)
059Q = bigFont.WriteText (OlympName, 12, 45, 178, 2)
060Q = bigFont.WriteText (OlympClass, 12, 56, 178, 2)
061
062Q = font.WriteText ("Титульный лист", 12, 72, 178, 2)
063
064labelFont.WriteLine "Фамилия", 25, 115 - 23
065labelFont.WriteLine "Имя", 25, 123 - 23
066labelFont.WriteLine "Отчество", 25, 131 - 23
067labelFont.WriteLine "Дата", 25, 139 - 23
068labelFont.WriteLine "рождения", 25, 145 - 23
069
070labelFont.WriteLine "Регистрационный номер", 25, 169 - 30
071labelFont.WriteLine "Город проведения", 25, 177 - 30
072labelFont.WriteLine "Аудитория", 25, 185 - 30
073
074
075labelFont.WriteLine "Дата", 25, 211
076labelFont.WriteLine "Подпись", 25, 219
077labelFont.WriteLine "Телефон", 25, 227
078
079
080dataFont.WriteLine LastName, 63, 114 - 23
081dataFont.WriteLine FirstName, 63, 122 - 23
082dataFont.WriteLine MiddleName, 63, 130 - 23
083dataFont.WriteLine BirthDate, 63, 141 - 23
084
085dataFont.WriteLine RegNo, 100, 168 - 30
086dataFont.WriteLine OlympCity, 100, 176 - 30
087
088' Рисуем линии
089page.line 100, 192 - 30, 150, 192 - 30
090page.line 58, 218, 108, 218
091page.line 58, 226, 108, 226
092Q = dataFont.WriteText(Phone, 58, 226, 65, 0)
093
094
095
096' Устанавливаем новый цвет
097page.setColor 192, 192, 192
098
099S = "шифр"
100font.MeasureLine S, W, H  ' измеряем текстовый блок
101Q = font.WriteText(S, 139, 244 + ((23 - H) / 2), 40, 2) ' располагаем текстовый
102блок на странице
103
104' Устанавливаем новый цвет
105page.setColor 255, 0, 0
106' Устанавливаем толщину линий в 1 пиксель
107page.LineWidth = 0
108' Рисуем линии по координатам
109X = 139
110Y = 267
111
112page.line X, Y - 3, X, Y + 3
113page.line X - 3, Y, X + 3, Y
114
115X = X + 40
116page.line X, Y - 3, X, Y + 3
117page.line X - 3, Y, X + 3, Y
118
119
120Y = Y - 23
121page.line X, Y - 3, X, Y + 3
122page.line X - 3, Y, X + 3, Y
123
124X = X - 40
125page.line X, Y - 3, X, Y + 3
page.line X - 3, Y, X + 3, Y

Результат:

Титул

2. Справочник по интерфейсам

2.1. Перечисление TPDFFontRenderingMode
1type
2  TPDFFontRenderingMode = (frmFillText, frmStrokeText, frmFillThenStrokeText, 
3    frmInvisible);

Или

1type
2  TPDFFontRenderingMode = TOleEnum;
3const
4  frmFillText = $00000000;
5  frmStrokeText = $00000001;
6  frmFillThenStrokeText = $00000002;
7  frmInvisible = $00000003;

Элементы перечисления:

Имя Значение Назначение
frmFillText 0

frmStrokeText 1

frmFillThenStrokeText 2

frmInvisible 3


2.2. Перечисление TPDFLineCap
1type
2  TPDFLineCap = (lcBuss, lcRound, lcProtecting);

Или

1type
2  TPDFLineCap = TOleEnum;
3const
4  lcBuss = $00000000;
5  lcRound = $00000001;
6  lcProtecting = $00000002;

Элементы перечисления:

Имя Значение Назначение
lcBuss 0

lcRound 1

lcProtecting 2


2.3. Перечисление TPDFLineJoin
1type
2  TPDFLineJoin = (ljMiter, ljRound, ljBevel);

Или

1type
2  TPDFLineJoin = TOleEnum;
3const
4  ljMiter = $00000000;
5  ljRound = $00000001;
6  ljBevel = $00000002;

Элементы перечисления:

Имя Значение Назначение
ljMiter 0

ljRound 1

ljBevel 2


2.4. Перечисление TPDFTextAlignment
1type
2  TPDFTextAlignment = (ptaLeft, ptaRight, ptaCenter, ptaJustified);

Или

1type
2  TPDFTextAlignment = TOleEnum;
3const
4  ptaLeft = $00000000;
5  ptaRight = $00000001;
6  ptaCenter = $00000002;
7  ptaJustified = $00000003;

Элементы перечисления:

Имя Значение Назначение
ptaLeft 0

ptaRight 1

ptaCenter 2

ptaJustified 3


2.5. Интерфейс IPDFDocument

Диаграмма

01type
02  IPDFDocument = interface(IDispatch)
03    ['{E57FFE9D-6B85-45E6-A5D0-9DD17950A666}']
04    procedure Save(Target: OleVariant); safecall;
05    function CreatePage(Parent: OleVariant): IPDFPage; safecall;
06    function Get_Title: WideString; safecall;
07    procedure Set_Title(Value: WideString); safecall;
08    function Get_CanEmbedFonts: WordBool; safecall;
09    procedure Set_CanEmbedFonts(Value: WordBool); safecall;
10    function Get_CanCompress: WordBool; safecall;
11    procedure Set_CanCompress(Value: WordBool); safecall;
12    function Get_Author: WideString; safecall;
13    procedure Set_Author(Value: WideString); safecall;
14    function Get_Subject: WideString; safecall;
15    procedure Set_Subject(Value: WideString); safecall;
16    function Get_Keywords: WideString; safecall;
17    procedure Set_Keywords(Value: WideString); safecall;
18    function Get_Creator: WideString; safecall;
19    procedure Set_Creator(Value: WideString); safecall;
20    function Get_Pages(Index: Integer): IPDFPage; safecall;
21    function Get_PageCount: Integer; safecall;
22    procedure Close; safecall;
23    procedure Serialize(const Stream: IUnknown); safecall;
24    function Get_MinCompressSize: Integer; safecall;
25    procedure Set_MinCompressSize(Value: Integer); safecall;
26    function Get_MaxCompressSize: Integer; safecall;
27    procedure Set_MaxCompressSize(Value: Integer); safecall;
28    function CreatePageFromImage(Image: OleVariant; PageWidth: Double; 
29      PageHeight: Double; Margin: Double): WordBool; safecall;
30    procedure SaveToXML(Target: OleVariant); safecall;
31    property Title: WideString read Get_Title write Set_Title;
32    property CanEmbedFonts: WordBool read Get_CanEmbedFonts write Set_CanEmbedFonts;
33    property CanCompress: WordBool read Get_CanCompress write Set_CanCompress;
34    property Author: WideString read Get_Author write Set_Author;
35    property Subject: WideString read Get_Subject write Set_Subject;
36    property Keywords: WideString read Get_Keywords write Set_Keywords;
37    property Creator: WideString read Get_Creator write Set_Creator;
38    property Pages[Index: Integer]: IPDFPage read Get_Pages;
39    property PageCount: Integer read Get_PageCount;
40    property MinCompressSize: Integer read Get_MinCompressSize 
41      write Set_MinCompressSize;
42    property MaxCompressSize: Integer read Get_MaxCompressSize 
43      write Set_MaxCompressSize;
44  end;

2.5.1. Свойства

Свойства интерфейса IPDFDocument:

Имя Тип Доступ Назначение
Author WideString Чтение/Запись

CanCompress WordBool Чтение/Запись

CanEmbedFonts WordBool Чтение/Запись

Creator WideString Чтение/Запись

Keywords WideString Чтение/Запись

MaxCompressSize Integer Чтение/Запись

MinCompressSize Integer Чтение/Запись

PageCount Integer Только для чтения

Pages[Index: Integer]IPDFPage Только для чтения

Subject WideString Чтение/Запись

Title WideString Чтение/Запись


2.5.2. Метод Close

Метод интерфейса IPDFDocument.

procedure IPDFDocument.Close;

Метод не имеет параметров.


2.5.3. Метод CreatePage

Метод интерфейса IPDFDocument.

function IPDFDocument.CreatePage(Parent: OleVariant): IPDFPage;

Параметры:

Имя Тип Обязательно Значение
Parent OleVariant Да

Замечания:

Возвращает значение типа IPDFPage.


2.5.4. Метод CreatePageFromImage

Метод интерфейса IPDFDocument.

1function IPDFDocument.CreatePageFromImage(Image: OleVariant; PageWidth: Double; 
2  PageHeight: Double; Margin: Double): WordBool;

Параметры:

Имя Тип Обязательно Значение
Image OleVariant Да

PageWidth Double Да

PageHeight Double Да

Margin Double Да

Замечания:

Возвращает значение типа WordBool.


2.5.5. Метод Save

Метод интерфейса IPDFDocument.

procedure IPDFDocument.Save(Target: OleVariant);

Параметры:

Имя Тип Обязательно Значение
Target OleVariant Да


2.5.6. Метод SaveToXML

Метод интерфейса IPDFDocument.

procedure IPDFDocument.SaveToXML(Target: OleVariant);

Параметры:

Имя Тип Обязательно Значение
Target OleVariant Да


2.5.7. Метод Serialize

Метод интерфейса IPDFDocument.

procedure IPDFDocument.Serialize(const Stream: IUnknown);

Параметры:

Имя Тип Обязательно Значение
Stream IUnknown Да


2.6. Интерфейс IPDFFont

Диаграмма

01type
02  IPDFFont = interface(IDispatch)
03    ['{43FE399A-A724-4076-BAFA-098639628385}']
04    function Get_Spacing: Double; safecall;
05    procedure Set_Spacing(Value: Double); safecall;
06    function Get_WordSpacing: Double; safecall;
07    procedure Set_WordSpacing(Value: Double); safecall;
08    function Get_Scaling: Double; safecall;
09    procedure Set_Scaling(Value: Double); safecall;
10    function Get_RenderingMode: TPDFFontRenderingMode; safecall;
11    procedure Set_RenderingMode(Value: TPDFFontRenderingMode); safecall;
12    function Get_Rise: Double; safecall;
13    procedure Set_Rise(Value: Double); safecall;
14    procedure WriteLine(const LineText: WideString; X: Double; Y: Double); safecall;
15    procedure MeasureLine(const LineText: WideString; out Width: OleVariant; 
16      out Height: OleVariant); safecall;
17    function WriteText(const AText: WideString; X: Double; Y: Double; 
18      Width: Double; Alignment: TPDFTextAlignment): Double; safecall;
19    function MeasureText(const AText: WideString; Width: Double): Double; safecall;
20    function Get_Angle: Double; safecall;
21    procedure Set_Angle(Value: Double); safecall;
22    function Get_LineSpacing: Double; safecall;
23    procedure Set_LineSpacing(Value: Double); safecall;
24    property Spacing: Double read Get_Spacing write Set_Spacing;
25    property WordSpacing: Double read Get_WordSpacing write Set_WordSpacing;
26    property Scaling: Double read Get_Scaling write Set_Scaling;
27    property RenderingMode: TPDFFontRenderingMode read Get_RenderingMode 
28      write Set_RenderingMode;
29    property Rise: Double read Get_Rise write Set_Rise;
30    property Angle: Double read Get_Angle write Set_Angle;
31    property LineSpacing: Double read Get_LineSpacing write Set_LineSpacing;
32  end;

2.6.1. Свойства

Свойства интерфейса IPDFFont:

Имя Тип Доступ Назначение
Angle Double Чтение/Запись

LineSpacing Double Чтение/Запись

RenderingModeTPDFFontRenderingMode Чтение/Запись

Rise Double Чтение/Запись

Scaling Double Чтение/Запись

Spacing Double Чтение/Запись

WordSpacing Double Чтение/Запись


2.6.2. Метод MeasureLine

Метод интерфейса IPDFFont.

1procedure IPDFFont.MeasureLine(const LineText: WideString; 
2  out Width: OleVariant; out Height: OleVariant);

Параметры:

Имя Тип Обязательно Значение
LineText WideString Да

Width OleVariant Да

Height OleVariant Да


2.6.3. Метод MeasureText

Метод интерфейса IPDFFont.

function IPDFFont.MeasureText(const AText: WideString; Width: Double): Double;

Параметры:

Имя Тип Обязательно Значение
AText WideString Да

Width Double Да

Замечания:

Возвращает значение типа Double.


2.6.4. Метод WriteLine

Метод интерфейса IPDFFont.

procedure IPDFFont.WriteLine(const LineText: WideString; X: Double; Y: Double);

Параметры:

Имя Тип Обязательно Значение
LineText WideString Да

X Double Да

Y Double Да


2.6.5. Метод WriteText

Метод интерфейса IPDFFont.

1function IPDFFont.WriteText(const AText: WideString; X: Double; Y: Double; 
2  Width: Double; Alignment: TPDFTextAlignment): Double;

Параметры:

Имя Тип Обязательно Значение
AText WideString Да

X Double Да

Y Double Да

Width Double Да

AlignmentTPDFTextAlignment Да

Замечания:

Возвращает значение типа Double.


2.7. Интерфейс IPDFPage

Диаграмма

01type
02  IPDFPage = interface(IDispatch)
03    ['{749FB131-80FE-46E9-8330-22C1DC346FE7}']
04    function Get_Parent: IPDFPage; safecall;
05    function Get_Title: WideString; safecall;
06    procedure Set_Title(Value: WideString); safecall;
07    function Get_Width: Double; safecall;
08    procedure Set_Width(Value: Double); safecall;
09    function Get_Height: Double; safecall;
10    procedure Set_Height(Value: Double); safecall;
11    function CreateFont(const FontName: WideString; Size: Double; Bold: WordBool; 
12      Italic: WordBool): IPDFFont; safecall;
13    procedure Perform(const Command: WideString); safecall;
14    function Get_LineWidth: Double; safecall;
15    procedure Set_LineWidth(Value: Double); safecall;
16    procedure Line(X1: Double; Y1: Double; X2: Double; Y2: Double); safecall;
17    procedure Rectangle(X1: Double; Y1: Double; Width: Double; Height: Double; 
18      Fill: WordBool); safecall;
19    function Get_LineCap: TPDFLineCap; safecall;
20    procedure Set_LineCap(Value: TPDFLineCap); safecall;
21    function Get_LineJoin: TPDFLineJoin; safecall;
22    procedure Set_LineJoin(Value: TPDFLineJoin); safecall;
23    procedure SetDash(DashArray: OleVariant; Phase: Integer); safecall;
24    procedure SetColor(R: Integer; G: Integer; B: Integer); safecall;
25    procedure PerformColor(const Command: WideString); safecall;
26    procedure Poly(Points: OleVariant; Fill: WordBool); safecall;
27    procedure Image(Image: OleVariant; X: Double; Y: Double; Width: Double; 
28      Height: Double; Transparent: WordBool); safecall;
29    procedure DrawGrid; safecall;
30    procedure Arc(X: Double; Y: Double; Radius: Double; StartAngle: Double; 
31      EndAngle: Double; FillSegment: WordBool; FillSector: WordBool); safecall;
32    procedure Curve(Points: OleVariant; Fill: WordBool); safecall;
33    procedure HyperLink(const URI: WideString; X: Double; Y: Double; Width: Double; 
34      Height: Double); safecall;
35    procedure Pattern(X1: Double; Y1: Double; Width: Double; Height: Double; 
36      PatternPointSize: Double; Percentage: Integer); safecall;
37    procedure Bezier(Points: OleVariant; Fill: WordBool); safecall;
38    procedure XObject(Data: OleVariant); safecall;
39    procedure SetColorCMYK(C: Double; M: Double; Y: Double; K: Double); safecall;
40    procedure LocalLink(const Page: IDispatch; DestinationX: Double; 
41      DestinationY: Double; DestinationWidth: Double; DestinationHeight: Double; 
42      X: Double; Y: Double; Width: Double; Height: Double); safecall;
43    property Parent: IPDFPage read Get_Parent;
44    property Title: WideString read Get_Title write Set_Title;
45    property Width: Double read Get_Width write Set_Width;
46    property Height: Double read Get_Height write Set_Height;
47    property LineWidth: Double read Get_LineWidth write Set_LineWidth;
48    property LineCap: TPDFLineCap read Get_LineCap write Set_LineCap;
49    property LineJoin: TPDFLineJoin read Get_LineJoin write Set_LineJoin;
50  end;

2.7.1. Свойства

Свойства интерфейса IPDFPage:

Имя Тип Доступ Назначение
Height Double Чтение/Запись

LineCapTPDFLineCap Чтение/Запись

LineJoinTPDFLineJoin Чтение/Запись

LineWidth Double Чтение/Запись

ParentIPDFPage Только для чтения

Title WideString Чтение/Запись

Width Double Чтение/Запись


2.7.2. Метод Arc

Метод интерфейса IPDFPage.

1procedure IPDFPage.Arc(X: Double; Y: Double; Radius: Double; 
2  StartAngle: Double; EndAngle: Double; FillSegment: WordBool; 
3  FillSector: WordBool);

Параметры:

Имя Тип Обязательно Значение
X Double Да

Y Double Да

Radius Double Да

StartAngle Double Да

EndAngle Double Да

FillSegment WordBool Да

FillSector WordBool Да


2.7.3. Метод Bezier

Метод интерфейса IPDFPage.

procedure IPDFPage.Bezier(Points: OleVariant; Fill: WordBool);

Параметры:

Имя Тип Обязательно Значение
Points OleVariant Да

Fill WordBool Да


2.7.4. Метод CreateFont

Метод интерфейса IPDFPage.

1function IPDFPage.CreateFont(const FontName: WideString; Size: Double; 
2  Bold: WordBool; Italic: WordBool): IPDFFont;

Параметры:

Имя Тип Обязательно Значение
FontName WideString Да

Size Double Да

Bold WordBool Да

Italic WordBool Да

Замечания:

Возвращает значение типа IPDFFont.


2.7.5. Метод Curve

Метод интерфейса IPDFPage.

procedure IPDFPage.Curve(Points: OleVariant; Fill: WordBool);

Параметры:

Имя Тип Обязательно Значение
Points OleVariant Да

Fill WordBool Да


2.7.6. Метод DrawGrid

Метод интерфейса IPDFPage.

procedure IPDFPage.DrawGrid;

Метод не имеет параметров.


2.7.7. Метод HyperLink

Метод интерфейса IPDFPage.

1procedure IPDFPage.HyperLink(const URI: WideString; X: Double; Y: Double; 
2  Width: Double; Height: Double);

Параметры:

Имя Тип Обязательно Значение
URI WideString Да

X Double Да

Y Double Да

Width Double Да

Height Double Да


2.7.8. Метод Image

Метод интерфейса IPDFPage.

1procedure IPDFPage.Image(Image: OleVariant; X: Double; Y: Double; 
2  Width: Double; Height: Double; Transparent: WordBool);

Параметры:

Имя Тип Обязательно Значение
Image OleVariant Да

X Double Да

Y Double Да

Width Double Да

Height Double Да

Transparent WordBool Нет


2.7.9. Метод Line

Метод интерфейса IPDFPage.

procedure IPDFPage.Line(X1: Double; Y1: Double; X2: Double; Y2: Double);

Параметры:

Имя Тип Обязательно Значение
X1 Double Да

Y1 Double Да

X2 Double Да

Y2 Double Да


2.7.10. Метод LocalLink

Метод интерфейса IPDFPage.

1procedure IPDFPage.LocalLink(const Page: IDispatch; DestinationX: Double; 
2  DestinationY: Double; DestinationWidth: Double; DestinationHeight: Double; 
3  X: Double; Y: Double; Width: Double; Height: Double);

Параметры:

Имя Тип Обязательно Значение
Page IDispatch Да

DestinationX Double Да

DestinationY Double Да

DestinationWidth Double Да

DestinationHeight Double Да

X Double Да

Y Double Да

Width Double Да

Height Double Да


2.7.11. Метод Pattern

Метод интерфейса IPDFPage.

1procedure IPDFPage.Pattern(X1: Double; Y1: Double; Width: Double; 
2  Height: Double; PatternPointSize: Double; Percentage: Integer);

Параметры:

Имя Тип Обязательно Значение
X1 Double Да

Y1 Double Да

Width Double Да

Height Double Да

PatternPointSize Double Да

Percentage Integer Да


2.7.12. Метод Perform

Метод интерфейса IPDFPage.

procedure IPDFPage.Perform(const Command: WideString);

Параметры:

Имя Тип Обязательно Значение
Command WideString Да


2.7.13. Метод PerformColor

Метод интерфейса IPDFPage.

procedure IPDFPage.PerformColor(const Command: WideString);

Параметры:

Имя Тип Обязательно Значение
Command WideString Да


2.7.14. Метод Poly

Метод интерфейса IPDFPage.

procedure IPDFPage.Poly(Points: OleVariant; Fill: WordBool);

Параметры:

Имя Тип Обязательно Значение
Points OleVariant Да

Fill WordBool Да


2.7.15. Метод Rectangle

Метод интерфейса IPDFPage.

1procedure IPDFPage.Rectangle(X1: Double; Y1: Double; Width: Double; 
2  Height: Double; Fill: WordBool);

Параметры:

Имя Тип Обязательно Значение
X1 Double Да

Y1 Double Да

Width Double Да

Height Double Да

Fill WordBool Да


2.7.16. Метод SetColor

Метод интерфейса IPDFPage.

procedure IPDFPage.SetColor(R: Integer; G: Integer; B: Integer);

Параметры:

Имя Тип Обязательно Значение
R Integer Да

G Integer Да

B Integer Да


2.7.17. Метод SetColorCMYK

Метод интерфейса IPDFPage.

procedure IPDFPage.SetColorCMYK(C: Double; M: Double; Y: Double; K: Double);

Параметры:

Имя Тип Обязательно Значение
C Double Да

M Double Да

Y Double Да

K Double Да


2.7.18. Метод SetDash

Метод интерфейса IPDFPage.

procedure IPDFPage.SetDash(DashArray: OleVariant; Phase: Integer);

Параметры:

Имя Тип Обязательно Значение
DashArray OleVariant Да

Phase Integer Да


2.7.19. Метод XObject

Метод интерфейса IPDFPage.

procedure IPDFPage.XObject(Data: OleVariant);

Параметры:

Имя Тип Обязательно Значение
Data OleVariant Да