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.

 

posted @ 2020-11-27 11:22  dqi1999  阅读(154)  评论(0)    收藏  举报