精确打印(100分)

  • 主题发起人 主题发起人 dlmn
  • 开始时间 开始时间
D

dlmn

Unregistered / Unconfirmed
GUEST, unregistred user!
我作的身份证管理系统,打印身份证卡片时,要求按照印刷好的身份证卡片精确打印,如何实现?那位
大虾可以帮忙?100分送上,不够的话可以再加
身份证格式如下
姓名
性别 民族
出生 年 月 日
住址
年 月 日签发 有效期限 年
编号
 
uses printers
ppix, ppiy: Integer;
procedure Getppi(DC: HDC);
begin
ppix := GetDeviceCaps(DC, logPixelsX);
ppiy := GetDeviceCaps(DC, logPixelsY);
end;

function CmToPixelX(cm: Real): Integer;
begin
Result := Trunc(Cm * ppix / 2.54);
end;

function CmToPixelY(cm: Real): integer;
begin
Result := Trunc(Cm * ppiy /2.54);
end;

Cm to Pixel change!!
 
我的也是打印卡片的程序就是用的QR,只要你在设计程序的
时候把QRDBTEXT的位置都设好,到时候打印前放卡片的时候
放好,打印是没问题的.
 
那不够精确
 
你给了我几个过程,那么打印时如何打印?
如何使用这几个过程?这几个函数(过程)的作用是
什么?
 
用 print.canvas.textout(x,y ,edit.text);
精确打印
 
x,y是什么含义?老兄,我急用,你能不能把你的设计思路说一下
 
确切的是在自己的单元里USES PRINTER
然后象使用图象的画布一样使用PRINTER的画布,X,Y代表画布上的坐标点
 
就是only you说的东东了.
 
你用Report Build报表控件来做,这个控件在http://51delphi.toplinux.org
上有下载,在报表中你按身份证上的尺寸将控件放在报表中就可实现,我做发票打印程序
就用它来做。
 
print.canvas.textout(x,y ,edit.text);中的x,y表示以点为单位的坐标。
print.canvas.textout(100,500 ,edit.text);就表示在打印纸从左边算起100个点,
顶部算起500个点的地方打印edit1.text内容。这里的点含义就是打印机分辨率DPI
中的每英寸多少点的这个点。比如600DPI的分辨率就表示一英寸有600个点,那么上
面那个打印命令就是在坐标为(1/6英寸,5/6英寸)的地方打印了edit1.text的内容。
所以你只要先用尺精确量好你每行文字最左上角的坐标,然后将这个坐标换算成英
寸值,然后在程序中动态取得打印机的分辨率,乘你获得的英寸坐标值,就得到实
际打印的点位置,这样打出来的才是精确定位了,并且不会因为打印机不同而产生
不同效果。
ppix := GetDeviceCaps(DC, logPixelsX);
ppiy := GetDeviceCaps(DC, logPixelsY);
是分别取打印机横向与纵向分辨率的语句,注意打印机横向分辨率与纵向分辨率
不同,所以X坐标与Y坐标要分别计算。
 
我打印的时候可以精确定位了,可是打印万打印内容后,打印纸走到一半就不走了.我的代码非常简单,如下:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y:integer;
begin
getppi(printer.handle);
x:=CmToPixelX(5);
y:=cmtopixely(4);
printer.begin
Doc;
printer.Canvas.Font.Size:=12;
printer.Canvas.TextOut(x,y,'你好');
printer.EndDoc;
end;
我估计是走纸走到一半的时候,作业已经停止.能不能判断出纸走完后再停止打印作业?
 
printer.NewPage;
强制它换页就可以了
 
问题解决了吗?
 
后退
顶部