delphi 怎样利用打印机画布来做水印

delphi 怎样利用打印机画布来做水印,第1张

最新Delphi 精确打印Image画布

以下是三零网为大家整理的最新Delphi 精确打印Image画布的文章,希望大家能够喜欢!

最近在做一个打印报告的小软件,里面需要将Image上显示的东西,按照“所见即所得”的原则打印出来。

好吧,最直接的方法当然是把Image的画布以图片的形式输出,这样既不用考虑画布上信息之间的相对位置,操作又简单。不过这样操作有个硬伤:图片失真。因为打印机分辨率的关系,需要在打印时将画布上的信息放大,才能匹配打印机的画布,这样难免会造成文字信息的拉伸变形。而且,使用图片打印的话,需要传输到打印机的数据就会几何倍增多,影响打印效率(这里还有一个问题,Delphi的Printer打印图形时,如果直接使用 canvas.stretchdraw 函数的话,在有的机器或者打印机上运行时会出错,很不稳定。需要处理后才能正常打印,网上有一段直接打印位图的代码,可以参考下)。考虑到这些因素,在完成最初的版本之后,又重新选择直接在打印机画布上“作画”的方式。

最初的原则不变,那么从效果上来说还是一样,还是需要放大的过程。打开VCL,我们发现 Printer单元封装了大量的有关打印机操作的API函数(这句是废话..), 我们在需要获得打印机画布信息时,可以很方便的直接调用属性。

首先,需要一个放大比例:

lMultiple:= Min(Printer.PageWidth div Image.Width,

(Printer.PageHeight div Image.Height)

为了居中显示,还需要长宽各方向的偏差:

lLeft:= (Printer.PageWidth - Image.Width * lMultiple) div 2

lTop := (Printer.PageHeight - Image.Height* lMultiple) div 2

先来讲一下线段、矩形框之类的图形输出,这一类比较简单,只要定位好坐标就可以。

以线段为例:

Pen.Width:=PenSize*lMultiple// 线宽放大

Pen.Style:= psSolid

MoveTo(PointA.X*lMultiple+lLeft, PointA.Y*lMultiple+lTop)

LineTo(PointB.X*lMultiple+lLeft, PointB.Y*lMultiple+lTop)

遇到文字信息时,首先,其坐标设置与线段相同,不过在字体大小设置时,为了像原画布上那样,与线段、矩形框这些元素保持相对位置不变,势必不能使用原始大小。但是像线宽那样Font.Size:= FontSize * lMultiple的话,打印出来的就是大字报了。那么该如何设置呢?

这里,我们需要迂回一下,先设置Printer.Canvas.Font.Height 属性,方法是:

Image.Canvas.Font.Size:= TextSize // 原始字体尺寸

Image.Canvas.Font.Name:= Trim(StrPas(@.TextStyle))// 原始字体样式

Font.Height:= Image.Canvas.TextHeight('|')* lcMultiple// 比例放大Height属性

Font.Size:= Round( - Font.Height * 72 / Font.PixelsPerInch)

// 这里的 Font.PixelsPerInch 等效于

// GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) // 打印机Y方向分辨率

Api函数列表

--与打印相关

Api函数名 函数说明 适用范围

W3.x W95 NT

AddPrinterConnection 为当前用户建立与打印机的联系 否 是 是

StartPagePrinter 开始打印机 否 是 是

StartDoc 开始打印作业 是 是 是

StartDocPrinter 开始打印作业 否 是 是

AddPrintProvidor 加入一个打印机支持器 否 是 是

AddForm 加入一个打印机窗体 否 是 是

AddPort 加入一个打印机端口 否 是 是

AddMonitor 加入一个打印机管理器 否 是 是

ShellExecute 打开或打印指定文件 否 是 是

ClosePrinter 关闭打开的打印机 否 是 是

WritePrinter 向打印机输出数据 否 是 是

AddPrinter 在打印机服务器上建立一个打印机 否 是 是

SetAbortProc 设备打印作业的放弃函数 否 是 是

SetPrinter 设置打印机信息 否 是 是

SetPrinterData 设置打印机配置 否 是 是

SetJob 设置打印作业信息 否 是 是

ResetPrinter 设置打印数据类型和设备模式值 否 是 是

DeletePrinterConnection 删除与打印机的连接 否 是 是

DeletePrintProcessor 删除打印机处理器 否 是 是

DeletePrinterDriver 删除打印机驱动程序 否 是 是

DeletePrinter 删除打印机服务器上的打印机 否 是 是

DeleteMonitor 删除打印机监视器 否 是 是

DeletePrintProvidor 删除打印机提供者 否 是 是

DeleteForm 删除打印机窗体层差 否 是 是

AbortPrinter 删除打印机缓冲文件 否 是 是

DeletePort 删除打印机端口 否 是 是

AddJob 启动一个打印作业 否 是 是

AdvancedDocumentProperties 进行打印机高级设置 否 是 是

PrintDlg 建立打印文本对话框 否 是 是

EnumPrintProcessors 枚举已安装的打印机处理器 否 是 是

EnumPrinterDrivers 枚举已安装的打印机驱动程序 否 是 是

EnumPorts 枚举可用打印机端口 否 是 是

EnumPrintProcessorDatatypes 枚举打印机所支持的数据类型 否 是 是

EnumForms 枚举所支持的打印机窗体 否 是 是

AbortDoc 终止一项打印作业 是 是 是

PrinterProperties 修改打印机属性 否 是 是

AddPrintProcessor 将打印处理器复制到打印机服务器中 否 是 是

AddPrinterDriver 将打印机驱动程序复制到打印机服务器中 否 是 是

PrinterMessageBox 显示打印作业出错信息 否 是 是

ConnectToPrinterDlg 显示浏览对话并连接网络打印机 否 是 是

EndPagePrinter 结束打印页 否 是 是

EndDoc 结束打印作业 是 是 是

EndDocPrinter 结束打印作业 否 是 是

StartPage 准备打印机接收数据 是 是 是

WaitForPrinterChange 监测打印机或打印机服务器变化 否 是 是

GetPrintProcessorDirectory 获取打印机驱动处理器路径 否 是 是

GetPrinterDriver 获取打印机驱动程序信息 否 是 是

GetPrinterDriverDirectory 获取打印机驱动程序路径 否 是 是

GetPrinter 获取打印机信息 否 是 是


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/61151.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-27
下一篇2023-02-27

发表评论

登录后才能评论

评论列表(0条)

    保存