优秀的编程知识分享平台

网站首页 > 技术文章 正文

Lazarus 打印 raz打印方法

nanyue 2024-12-28 14:35:49 技术文章 4 ℃

在软件开发中,打印功能是几乎每个企业级应用必须具备的。 在 Lazarus / FreePasca l中打印很容易。 但是,需要遵循一些必需的步骤。

必须执行如下操作才可以正确使用打印机:

  1. 将 Printer4Lazarus 包增加到系统中
  2. 引用打印机单元 【Printers】.
  3. 使用现有打印机

将 Printer4Lazarus 包添加到项目中

Printer4Lazarus 包定义了基本打印机,并提供了独立于系统的打印,因此可在任何系统上打印。

Lazarus IDE 中执行如下操作:

  1. 菜单栏 工程 - 工程查看器. 会弹出工程查看器窗口 需要的包. 默认 需要的包 包含 LCL 包.
  2. 点击工程查看器顶部的加号 添加 按钮。
  3. 打开 新建需要 选项。
  4. 包名 列表框中选择 Printer4Lazarus.
  5. 点击 确定.
  6. Printer4Lazarus 这个包就被添加到 工程查看器

引用打印单元

步骤很简单,看下面的样例,其实就是Uses Printers:

unit MainUnit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Printers;

使用已有打印机对象

加入要点击按钮打印一段文字. 在窗体上放置一个按钮名为 PrintBtnOnClick 事件中使用如下代码实现:

procedure TForm1.PrintBtnClick(Sender: TObject);
const
  LEFTMARGIN = 100;
  HEADLINE = 'I Printed My Very First Text On ';
var
  YPos, LineHeight, VerticalMargin: Integer;
  SuccessString: String;
begin
  with Printer do
  try
    BeginDoc;
    Canvas.Font.Name := 'Courier New';
    Canvas.Font.Size := 10;
    Canvas.Font.Color := clBlack;
    LineHeight := Round(1.2 * Abs(Canvas.TextHeight('I')));
    VerticalMargin := 4 * LineHeight;
    // There we go
    YPos := VerticalMargin;
    SuccessString := HEADLINE + DateTimeToStr(Now);   
    Canvas.TextOut(LEFTMARGIN, YPos, SuccessString);
  finally
    EndDoc;
  end;
end;

beginend; 详细发生如下:

  • Printer.BeginDoc 开始打印,其实是开始修改打印的内容, 直到 Printer.EndDoc; 出现,才真正开始打印。
  • Printer 使用 Canvas 绘制输出内容,页面才最终显示在打印页上, Canvas.Font 是 canvas 的输出字体 ,也就是说,TextOut 将使用我们的设置来输出文本内容。
  • 在画布上绘制的所有内容都必须使用坐标进行定位。 因此,我们计算了 “LineHeight” 以垂直放置文本。 可以对水平位置执行相同的操作,这里我将其命名为 “LEFTMARGIN”。
  • 通过TextOut 调用绘制文本。
  • 这些所有的结果都通过 Printer.EndDoc最终来执行。

示例

实现一个打印文本和打印图片的程序,在 ListBox 中显示系统中所有的打印机,用户选择打印机后在打印机上输出。程序界面如下:

首先,创建一个 Application 应用程序,在窗体上放置一个 ListBox,命名为 PrinterListBox,用于显示系统中所有的打印机,然后放置两个按钮,分别命名为:PrintTextButton 和 PrintPictureButton。

在 Form 的单元文件中 uses 中增加:

Printers, Printer4Lazarus

Form 的 OnCreate 事件代码:

procedure TForm1.FormCreate(Sender: TObject);
begin
  if (Printer = nil) or (Printer.Printers.Count <= 0) then Exit;

  PrinterListBox.Items:=Printer.Printers;
  PrinterListBox.ItemIndex:=Printer.PrinterIndex;
end; 

打印文本按钮的单击事件:

procedure TForm1.PrintTextButtonClick(Sender: TObject);
begin
  if PrinterListBox.ItemIndex < 0 then Exit;

  Printer.SetPrinter(PrinterListBox.Items[PrinterListBox.ItemIndex]);

  Printer.begindoc;
  Printer.Canvas.Font.Name := '微软雅黑';
  Printer.Canvas.Font.Size := 14;
  Printer.Canvas.Font.Color := clBlack;

  Printer.canvas.moveto(0, 0);
  Printer.canvas.lineto(300, 300);
  Printer.canvas.textout(300, 300, '打印文字');
  Printer.enddoc;
end;

打印图片按钮的单击事件:

procedure TForm1.PrintPictureButtonClick(Sender: TObject);
var
  ABitmap: TBitmap;
begin
  if PrinterListBox.ItemIndex < 0 then Exit;

  Printer.SetPrinter(PrinterListBox.Items[PrinterListBox.ItemIndex]);

  Printer.begindoc;
  ABitmap:=TBitmap.Create;
  ABitmap.LoadFromFile('test.bmp');
  // Printer.Canvas.Draw(0, 0, ABitmap);
  Printer.Canvas.StretchDraw(Printer.Canvas.ClipRect, ABitmap);
  Printer.enddoc;
  ABitmap.Free;
end; 

事先准备好图片。

文本打印效果:

图片打印效果:




Tags:

最近发表
标签列表