Synopse mORMot框架样例学习-05 - Report created from code
例01-例04主要讲了ORM操作相关的基本知识,例05说的是报表,我们写东西最终的目的是要展示,从例05的名字就可以看出来,本例是要为我们展示报表,暂且把它翻译成源码级的报表吧(用代码创建报表).这个例子有3个工程文件,SynPdfFormCanvas\SynPdfLayers\TestSQLite3Pages,逐个学习.
1.SynPdfFormCanvas
这个只有工程源码,我们先运行一下,然后在工程目录会生成SynPdfFormCanvas.pdf文件,打开看看:

源码直接生成pdf文档,对生成的过程源码,继续用备注进行说明:
program SynPdfFormCanvas;
{$APPTYPE CONSOLE}
uses
{$I SynDprUses.inc} // use FastMM4 on older Delphi, or set FPC threads
SysUtils,
Math,
DateUtils,
SynCommons,
SynPDF;
const
// 此单精度浮点数定义的应该PDF的缩放因子,源码约28倍,
// 我们改成14看看有什么变化,再改成7看看其变化
// 其变化是从左下到右上
PDFFactor: Single = 72.0 / 2.54;
// PDFFactor: Single = 14;
var
// PDF引擎的主类,负责处理整个PDF文档
obPDF: TPdfDocument;
// 带有画布的窗体对象,用于绘制界面,你可以根据需要创建XObject对象,
// 然后把它画在页面的任何地方
obFormCanvas: TPdfFormWithCanvas;
begin
// 实例化TPdfDocument对象
obPDF := TPdfDocument.Create(false, 0, false);
// 设置为true以强制pdf 1.5格式,这样会产生较小的文件
obPDF.GeneratePDF15File := true;
// 顾名思义,设置纸张大小为A4
obPDF.DefaultPaperSize := psA4;
// 默认页面及纸张方向,true为横向
obPDF.DefaultPageLandscape := false;
// 压缩方式, TPdfCompressionMethod = (cmNone, cmFlateDecode);
obPDF.CompressionMethod := cmFlateDecode;
// 实例化TPdfFormWithCanvas对象
obFormCanvas := TPdfFormWithCanvas.Create(obPDF, Trunc(5.0 * PDFFactor), Trunc(5.0 * PDFFactor));
// 在TPdfFormWithCanvas上呈现obFormCanvas对象,也就是绘制
obPDF.AddXObject('FORMOBJECT', obFormCanvas);
// 设置文本的呈现方式
obFormCanvas.Canvas.SetTextRenderingMode(trFill);
// 设置字体,大小
obFormCanvas.Canvas.SetFont('Arial', 10.0, []);
// 设置线宽
obFormCanvas.Canvas.SetLineWidth(0.01 * PDFFactor);
// 以左下角为基点,绘制矩形
obFormCanvas.Canvas.Rectangle(0.0 * PDFFactor, 0.0 * PDFFactor, 4.9 * PDFFactor, 4.9 * PDFFactor);
// 描边
obFormCanvas.Canvas.Stroke;
// 在指定的页面位置显示文本
obFormCanvas.Canvas.TextOut(1.0 * PDFFactor, 2.5 * PDFFactor, 'form text');
// 关闭画布
obFormCanvas.CloseCanvas;
// 向当前文档中添加一个页面
obPDF.AddPage;
obPDF.Canvas.SetTextRenderingMode(trFill);
obPDF.Canvas.SetFont('Arial', 10.0, []);
obPDF.Canvas.SetLineWidth(0.01 * PDFFactor);
obPDF.Canvas.Rectangle(1.0 * PDFFactor, 1.0 * PDFFactor, 19.0 * PDFFactor, 27.9 * PDFFactor);
obPDF.Canvas.Stroke;
obPDF.Canvas.TextOut(2.0 * PDFFactor, 27.0 * PDFFactor, 'XObject form canvas sample');
// 拉伸指定的对象(通常是图像)
// obPDF.Canvas.DrawXObject(2.0 * PDFFactor, 5.0 * PDFFactor, 1.0, 1.0, 'FORMOBJECT');
// obPDF.Canvas.DrawXObject(10.0 * PDFFactor, 10.0 * PDFFactor, 1.0, 0.5, 'FORMOBJECT');
// obPDF.Canvas.DrawXObject(8.0 * PDFFactor, 15.0 * PDFFactor, 2.0, 2.0, 'FORMOBJECT');
// obPDF.Canvas.DrawXObject(2.0 * PDFFactor, 20.0 * PDFFactor, 0.5, 1.0, 'FORMOBJECT');
// 将pdf文件内容保存到指定的文件
obPDF.SaveToFile(ChangeFileExt(ExeVersion.ProgramFileName, '.pdf'));
FreeAndNil(obPDF);
end.

浙公网安备 33010602011771号