知识大全 Delphi中票据凭证的精确打印

Posted 单位

篇首语:不担三分险,难练一身胆。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi中票据凭证的精确打印相关的知识,希望对你有一定的参考价值。

Delphi中票据凭证的精确打印  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 概述

  在银行 税务 邮政等行业的实际工作中 经常涉及到在印刷好具有固定格式的汇款单 储蓄凭证 税票等单据上的确定位置打印输出相关的信息 在此类需求中 精确地定位单据并打印相关信息 是解决问题]的关键 一般情况下 开发者都是通过在打印机上通过重复的测试来达到实际需求 那么 有没有简单有效而又灵活的方法实现上述功能呢?

  二 基本思路

  分析上述单据的特征 可以发现 此类打印输出的信息一般比较简短 不涉及到文字过长的折行处理 另外 其打印输出的位置相对固定 因此 我们可以通过用尺子以毫米为单位 测量好每个输出信息位置的横向和纵向坐标 作为信息输出的位置 但由于不同打印机在实际输出效果上 总是存在理论和实际位置的偏差 因此 要求程序具有一定的灵活性 供最终用户根据需要 进行必要的位置调整 因此 可设置一打印配置文件 用于存储横坐标和纵坐标的偏移量 用于用户进行位置校正 从而提供了一定的灵活性

  三 精确打印输出的程序实现

   . 在Delphi中新建一个名为mprint pas的单元文件并编写如下程序 单元引用中加入Printers

//取得字符的高度 function CharHeight: Word; var  Metrics: TTextMetric; begin  GetTextMetrics(Printer Canvas Handle Metrics);  Result := Metrics tmHeight; end;

file://取得字符的平均宽度 function AvgCharWidth: Word; var  Metrics: TTextMetric; begin  GetTextMetrics(Printer Canvas Handle Metrics);  Result := Metrics tmAveCharWidth; end;

file://取得纸张的物理尺寸 单位 点 function GetPhicalPaper: TPoint; var  PageSize : TPoint; begin  file://PageSize X; 纸张物理宽度 单位:点  file://PageSize Y; 纸张物理高度 单位:点  Escape(Printer Handle GETPHYSPAGESIZE nil @PageSize);  Result := PageSize; end;

file:// 取得纸张的逻辑宽度 可打印区域 file://取得纸张的逻辑尺寸 function PaperLogicSize: TPoint; var  APoint: TPoint; begin  APoint X := Printer PageWidth;  APoint Y := Printer PageHeight;  Result := APoint; end;

file://纸张水平对垂直方向的纵横比例 function HVLogincRatio: Extended; var  AP: TPoint; begin  Ap := PaperLogicSize;  Result := Ap y/Ap X; end;

file://取得纸张的横向偏移量 单位 点 function GetOffSetX: Integer; begin  Result := GetDeviceCaps(Printer Handle PhysicalOffSetX); end;

file://取得纸张的纵向偏移量 单位 点 function GetOffSetY: Integer; begin  Result := GetDeviceCaps(Printer Handle PhysicalOffSetY); end;

file://毫米单位转换为英寸单位 function MmToInch(Length: Extended): Extended; begin  Result := Length/ ; end;

file://英寸单位转换为毫米单位 function InchToMm(Length: Extended): Extended; begin  Result := Length* ; end;

file://取得水平方向每英寸打印机的点数 function HPointsPerInch: Integer; begin  Result := GetDeviceCaps(Printer Handle LOGPIXELSX); end;

file://取得纵向方向每英寸打印机的光栅数 function VPointsPerInch: Integer; begin  Result := GetDeviceCaps(Printer Handle LOGPIXELSY) end;

file://横向点单位转换为毫米单位 function XPointToMm(Pos: Integer): Extended; begin  Result := Pos* /HPointsPerInch; end;

file://纵向点单位转换为毫米单位 function YPointToMm(Pos: Integer): Extended; begin  Result := Pos* /VPointsPerInch; end;

file://设置纸张高度 单位 mm procedure SetPaperHeight(Value:integer); var  Device : array[ ] of char;  Driver : array[ ] of char;  Port : array[ ] of char;  hDMode : THandle;  PDMode : PDEVMODE; begin file://自定义纸张最小高度 mm if Value < then Value := ;  file://自定义纸张最大高度 mm  if Value > then Value := ;   Printer PrinterIndex := Printer PrinterIndex;   Printer GetPrinter(Device Driver Port hDMode);   if hDMode <> then    begin     pDMode := GlobalLock(hDMode);     if pDMode <> nil then     begin      pDMode^ dmFields := pDMode^ dmFields or DM_PAPERSIZE or                DM_PAPERLENGTH;      pDMode^ dmPaperSize := DMPAPER_USER;      pDMode^ dmPaperLength := Value * ;      pDMode^ dmFields := pDMode^ dmFields or DMBIN_MANUAL;      pDMode^ dmDefaultSource := DMBIN_MANUAL;      GlobalUnlock(hDMode);     end;    end;    Printer PrinterIndex := Printer PrinterIndex; end;

file://设置纸张宽度 单位 mm Procedure SetPaperWidth(Value:integer); var  Device : array[ ] of char;  Driver : array[ ] of char;  Port : array[ ] of char;  hDMode : THandle;  PDMode : PDEVMODE; begin file://自定义纸张最小宽度 mm if Value < then Value := ;  file://自定义纸张最大宽度 mm  if Value > then Value := ;   Printer PrinterIndex := Printer PrinterIndex;   Printer GetPrinter(Device Driver Port hDMode);   if hDMode <> then   begin    pDMode := GlobalLock(hDMode);    if pDMode <> nil then    begin     pDMode^ dmFields := pDMode^ dmFields or DM_PAPERSIZE or               DM_PAPERWIDTH;     pDMode^ dmPaperSize := DMPAPER_USER;     file://将毫米单位转换为 mm单位     pDMode^ dmPaperWidth := Value * ;     pDMode^ dmFields := pDMode^ dmFields or DMBIN_MANUAL;     pDMode^ dmDefaultSource := DMBIN_MANUAL;     GlobalUnlock(hDMode);    end;   end;   Printer PrinterIndex := Printer PrinterIndex; end;

file://在 (Xmm Ymm)处按指定配置文件信息和字体输出字符串 procedure PrintText(X Y: Extended; Txt: string; ConfigFileName: string; FontSize: Integer= ); var  OrX OrY: Extended;  Px Py: Integer;  AP: TPoint;  Fn: TStrings;  FileName: string;  OffSetX OffSetY: Integer; begin file://打开配置文件 读出横向和纵向偏移量 try  Fn := TStringList Create;  FileName := ExtractFilePath(Application ExeName) + ConfigFileName;  if FileExists(FileName) then  begin   Fn LoadFromFile(FileName);   file://横向偏移量   OffSetX := StrToInt(Fn Values[ X ]);   file://纵向偏移量   OffSetY := StrToInt(Fn Values[ Y ]);  end else begin  file://如果没有配置文件 则生成  Fn Values[ X ] := ;  Fn Values[ Y ] := ;  Fn SaveToFile(FileName); end; finally  Fn Free; end; X := X + OffSetX; Y := Y + OffSetY; Px := Round(Round(X * HPointsPerInch * / ) / ); Py := Round(Round(Y * VPointsPerInch * / ) / ); Py := Py GetOffSetY; file://因为是绝对坐标 因此 不用换算成相对于Y轴坐标 Px := Px + * AvgCharWidth; Printer Canvas Font Name := 宋体 ; Printer Canvas Font Size := FontSize; file://Printer Canvas Font Color := clGreen; Printer Canvas TextOut(Px Py Txt); end;

   . 使用举例

  在主窗体中加入对mprint单元的引用 在一命令钮的OnClick事件中书写如下代码(用于在邮政汇款单上的相应方框内打印邮政编码 )

Printer BeginDoc; PrintText( config txt ); PrintText( config txt ); PrintText( config txt ); PrintText( config txt ); PrintText( config txt ); PrintText( config txt ); Printer EndDoc;

  观察结果 用尺子测量偏移量 在config txt文件中修改X Y的值即可

  其它 设置打印机和纸张类型从略

  四 结束语

cha138/Article/program/Delphi/201311/25061

相关参考

票据和结算凭证的哪些事项更改后,票据和结算凭证无效?

金额、出票或签发日期、收款人名称、银行汇票的实际结算金额。

知识大全 Aisino SK-820财税高清票据打印机打印不了发票是为什么啊

AisinoSK-820财税高清票据打印机打印不了发票是为什么啊?  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

同城交换票据有哪些?

支票、银行汇票、银行本票、特种转账凭证、信汇、进账单、托收凭证、税单等遵循各地人民银行规定的允许参加同城交换业务的各种票据统称为交换票据。

知识大全 利用Delphi建立精确计数器[4]

利用Delphi建立精确计数器[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  proced

知识大全 利用Delphi建立精确计数器[3]

利用Delphi建立精确计数器[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  proced

知识大全 利用Delphi建立精确计数器[2]

利用Delphi建立精确计数器[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  下面是具体的

知识大全 利用Delphi建立精确计数器[1]

利用Delphi建立精确计数器[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Windo

同城票据处理流程是什么?

1、票据和结算凭证是否按中国人民银行统一规定印制。  2、票据和结算凭证的填写是否按规定记载,记载的事项是否齐全,出票金额、出票日期、收款人名称未涂改,其他记载事项更改的是否已由原记载人签章证明。  

知识大全 用Delphi编写打印程序的窍门

用Delphi编写打印程序的窍门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果你想自己用D

知识大全 基于Delphi的条码打印系统设计与实现

基于Delphi的条码打印系统设计与实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  引言