Техническая статья

Рисование холста HotPDF

· PDF-программы

Этот пример компонента HotPDF демонстрирует, как создавать векторные графические элементы PDF с использованием той же модели TCanvas, которую разработчики Delphi уже используют в приложениях VCL. Вместо того, чтобы рассматривать вывод PDF как отдельную модель отрисовки, этот пример записывает текст и фигуры через HotPDF.Canvas, а затем сохраняет результат в виде документа PDF.

Этот пример полезен, когда приложение уже имеет код отрисовки графиков, диаграмм, предварительного просмотра или пользовательских элементов управления, основанный на TCanvas. Основной принцип прост: создайте THotPDF, укажите выходной файл, вызовите BeginDoc, настройте состояние холста, отрисуйте содержимое и завершите файл с помощью EndDoc.

В приведенном ниже коде цикл отрисовки отображает три группы цветных фигур. Каждая группа использует одну и ту же систему координат и изменяет только примитив, который отрисовывается: прямоугольник, эллипс или круглый прямоугольник. Это делает его компактным справочником для тестирования цветов холста, поведения заливки, размещения текста и компоновки страниц в сгенерированном PDF-документе.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
program CanvasDraw;
{$APPTYPE CONSOLE}
uses
{$IFDEF VER230} System.SysUtils, System.Classes, Vcl.Graphics, {$ELSE} SysUtils, Classes, Graphics, {$ENDIF} HPDFDoc;
 
var
   I, Y: Integer;
   HotPDF: THotPDF;
 
begin
    HotPDF:= THotPDF.Create(nil);
    try
        Randomize;
        HotPDF.AutoLaunch := true;
        HotPDF.FileName := 'CanvasDraw.pdf';
        HotPDF.BeginDoc;                                          // Create PDF file
        HotPDF.Canvas.Font.Size := 14;                            // Set canvas font size
        I :=20;
        Y := 60;
        HotPDF.Canvas.TextOut(10, 30, 'Canvas Rectangles');      //  Print text
        while I <= 700 do
        begin                                                   //  Draw colour
            HotPDF.Canvas.Brush.Color := random($FFFFFF);         //  rectangles
            HotPDF.Canvas.Rectangle(I, Y, I+90, Y + 160);
            Inc(I, 30);
            Inc( Y, 3 );
        end;
 
        I :=20;
        Y := 350;
        HotPDF.Canvas.TextOut(10, 320, 'Canvas Ellipses');         // Print text
        while I <= 700 do                                       //  Draw colour
        begin                                                   //  ellipses
            HotPDF.Canvas.Brush.Color := random($FFFFFF);
            HotPDF.Canvas.Ellipse(I, Y, I+90, Y + 160);
            Inc(I, 30);
            Inc( Y, 3 );
        end;
 
        I :=20;
        Y := 680;
        HotPDF.Canvas.TextOut(10, 650, 'Canvas RoundRects');      // Print text
        while I <= 700 do
        begin
            HotPDF.Canvas.Brush.Color := random($FFFFFF);         //  Draw colour
            HotPDF.Canvas.RoundRect(I, Y, I+90, Y + 160, 20, 20); //  roundrects
            Inc(I, 30);                                        
            Inc( Y, 3 );
        end;
        HotPDF.EndDoc;                                            // Close PDF file
    finally
        HotPDF.Free;
    end;
end.

Что демонстрирует этот пример.

  • Как инициализировать THotPDF для задачи генерации PDF в консольном стиле в Delphi.
  • Как использовать HotPDF.Canvas для отрисовки текста и базовых геометрических фигур.
  • Как цвета кистей влияют на залитые фигуры в сгенерированном PDF-документе.
  • Как повторяющиеся координаты могут создавать многослойный визуальный вывод без использования снимков экрана.

Замечания по реализации.

Страница PDF-документа завершается только после вызова EndDoc, поэтому в производственном коде следует использовать блок try/finally вокруг жизненного цикла компонента и избегать создания частично записанного файла в случае сбоя отрисовки. Для получения детерминированного результата тестов замените Randomize и случайные цвета на фиксированные значения.

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