技术文章

HotPDF 画布绘制

· PDF 软件

此 HotPDF 组件示例演示了如何使用与 VCL 应用程序中 Delphi 开发人员已经使用的相同 TCanvas 工作流程,创建矢量风格的 PDF 图形。该示例不将 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,以执行基于控制台的 Delphi PDF 生成任务。
  • 如何使用 HotPDF.Canvas 进行文本和基本的几何图形绘制。
  • 笔刷颜色如何影响生成的 PDF 中填充形状的外观。
  • 如何通过重复坐标构建分层视觉输出,而无需位图屏幕截图。

实现说明

PDF 页面的最终化仅在调用 EndDoc 后完成,因此生产代码应在组件的生命周期周围保留 try/finally 块,以避免在绘图失败时留下部分写入的文件。为了获得可预测的测试输出,将 Randomize 和随机颜色替换为固定颜色值。

基于 Canvas 的 PDF 绘图最适合于报告、叠加层、图表和生成的表单,这些输出应在任何缩放级别下保持清晰。如果源绘图依赖于屏幕 DPI 或设备特定的字体,请在发布之前,在干净的系统上验证最终的 PDF 文件。