关于FastReport自定义纸张的打印问题(200分)

  • 主题发起人 主题发起人 小橄榄
  • 开始时间 开始时间

小橄榄

Unregistered / Unconfirmed
GUEST, unregistred user!
开发环境:Delphi 6.0 + pack2, FastReport 2.46中文版
利用FastReport做一个打印模板,打印机类型为虚拟打印机,纸张类型:自定义,大小:185X258真正的打印机类型为激光打印机HP LaserJet 1200 Series PCL 6,打印时不是靠左进纸,而是居中进纸。
现象是这样的:打印预览正确,执行打印操作时,先走一张白纸,再正式打印,打印的效果是预览的效果往左偏移10多毫米,打印结束后的预览图的纸张变为了A4纸.
各位大侠,路过都帮忙看看,给点意见,解决小弟的燃眉之急,在此先谢过了:).
 
你换个针打的打印机就OK了。
原因:HP激光打印机的驱动还没完善(自定义)。
不信你这word中用自定义纸张试试有没有用。
 
没有办法,这是客户的需要,必须要用激光,而且只能居中进纸。
如果我给打印机先做好自定义类型纸张TEST_185X258,跟着做模板不采用虚拟打印机,直接用激光打印机,选择类型TEST_185X258是没有问题,打印的现象跟标准的纸张类型是一样。
 
我以前做套打的时候遇到过这种问题
最好的解决办法是做个页边距调节功能,让用户根据需要自己去调整,这样就能适应各种打印机
 
然后在FASTREPORT控件的Onbegin
Doc事件中动态载入边距就可解决。
例:
procedure TPaintM.GKDJBbegin
Doc;
Var IniFile:TINIFile;
CDir:String;
begin
Cdir:=ExtractFilePath(Application.ExeName);
INIFile:=TINIFile.Create(cdir+'omrdat.ini');
GKDJB.Pages[0].UseMargins := False;
GKDJB.pages[0].pgMargins.Left := INIFile.ReadInteger('Margins','Left',0);
GKDJB.pages[0].pgMargins.Right:=INIFile.ReadInteger('Margins','Right',0);
GKDJB.pages[0].pgMargins.Top:=INIFile.ReadInteger('Margins','Top',0);
GKDJB.pages[0].pgMargins.Bottom:=INIFile.ReadInteger('Margins','Bottom',0);
INIFile.Free;
end;
 
用户需要预览效果跟打印不能相差太多,我可以做到不设页边距调整,打印正确,但预览的效果就偏移了,而且走白纸与打印后的预览图变A4纸,用户不能接受.
 
呵呵
我以前也曾经象你这样想过
但是你知道不,你的用户可能会用多台打印机,你也可能会有不止一个的用户,只要有不同的打印机就会有扁移,你难道每一台都去调一下??
还有玉兰和打印是两回事,因为打印机调整的问题,玉兰效果不等于打印效果
 
我说的偏移不是说不同打印机的偏移,而是因为自定义纸张与A4纸的偏移.
我有一个针对打印机总体的偏移设置,这是对所有模板起作用的.
举例说吧,现在的偏移量,我根据打印效果来算,偏移量=(A4宽-自定义宽) / 2。
 
客户程序中带个desin,在本机上直接调报表设纸张,不用虚拟打印机,保存报表试试。。
应该可以我以前用班马打印机时也遇到这个情况
 
客户根本就不想自己来调整打印模板,连设置整体偏移量都不想,而且终端太多,打印机也不全一样,比较麻烦。
 
1、走白纸可能就是因为你程序中设置了自定义的纸张,而打印机是A4纸张。
你定义的范围对A4来说有一半是空的。以前打印时有发现,FastReport 传送到打印机时
是从后面打起的,所以对程序来说先打了一张空白的,就走了白纸。
2、在打印机的纸型里也设置同样大小的自定义纸张,然后选择它。我以前有碰到过程序里
有自定义,打印机端没有,结果只能打印一部分。
3、偏移的问题,你可以在程序里就往右偏移一点,才10毫米,预览看起来应该没什么
差别的,然后打印出来就正确了。
我也遇见过预览时好好的,打印出来却偏了,不明白怎么回事。不知道有没有大虾会给解释一下。
4、你预览又变回A4纸,可能也是因为刚用A4纸打印过。所以你在打印机里设置一下自定义
 
1.只要是用虚拟打印机时的自定义才会出现,如果直接连着一台打印机来使用自定义,是
一点问题都没有。
2.我现在只能是用虚拟打印机来做模版,因为最终用户的打印机类型有很多种,都支自
定义打印的,如果直接连一台打印机来调试自定义纸张,很有可能拿到客户那就不能
用了。
3.预览是以自定义纸张来显示的,但正式打印时却以A4纸张来输出,如果纸张靠A4边左边
来打印的话,就没有问题了,现在纸张是居中进入,所以偏离了A4宽-自定义宽) / 2,
10MM对一些小的打印模版来说,是很大的,而且客户不接受这种偏移.
4.至于打印后预览变为A4纸,是因为FastReport以A4纸类型刷新了一遍预览。
我现在是不想改FastReport的源代码,在我的应用程序来处理,达到我需要的效果。
如果是改源代码的话,应该是能实现的,但可能会影响dao别的打印。
各位大侠,看看还有没有招!!!

 
呵呵,那么麻烦?
‘而且客户不接受这种偏移’,你借一台A4的打印设置好位置,提供功能让他去微调。
根据经验,你是赶不上客户对打印要求的变化的
 
如何在WINDOWS中控制打印字体的长宽,而不受限于SIZE 的限制

首先为了达到这个功能,可以采用Windows的逻辑字体(LogFont)
可以使用 CreateFont 或 CreateFontIndirect 这两个Windows API
函数来定义任何想要的字体,由于 CreateFont 所需的参数甚多通常
我们使用 CreateFontIndirect 来建立所需的逻辑字体,这个API函数
在Delphi中的声明为
function CreateFontIndirect(const p1: TLogFont): HFONT;
stdcall;
其中只有一个参数 p1: TLogfont
所有有关字体的参数完全通过这个
TLogfont结构来传送,Windows将根据结构中的内容创建出相应的逻辑
字体,在Delphi的Windows.pas中TLogFont是这样定义的

TLogFontA = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
end;

TLogFontW = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of WideChar;
end;

TLogFont = TLogFontA;

其中涉及到很多参数,其中

lfHeight: Longint;
指定以逻辑单位标定的字体高度,取值可为正负或零,对于需要随意
定义字体高度的情况下通常取负值,以保证获得实际尺寸的字体。

lfWidth: Longint;
用于指定字体的平均宽度,由于Windows系统下的大多数字体都是比例
字体因而采用平均宽度这个表示方法。若指定为0,则系统会自动根据
适当的比例自动处理宽度。

lfEscapement: Longint;
指定输出方向与当前坐标系X轴之间的以十分之一度为单位的角度。

lfOrientation: Longint;
指定每个字符与当前坐标系X轴之间的以十分之一度为单位的角度。在
Windows95中这个值等同于lfEscpement。

lfWeight: Longint;
指定范围为从0至1000的字体加重程度,400是标准字体700为加重字体,
0表示采用默认值。

lfItalic: Byte;
不为0表示采用斜体字。

lfUnderline: Byte;
不为0表示带下划线。

lfStrikeOut: Byte;
不为0表示带穿透线。

lfCharSet: Byte;
指定字体集。

lfOutPrecision: Byte;
指定输出精度。用于确定对前面一些设定值的精确程度。

lfClipPrecision: Byte;
指定裁剪精度。裁剪是Windows图形环境下的一种特殊处理,简单说就是
去掉图形中落在视图以外的部分,有助于提高图形的处理速度。

lfQuality: Byte;
指定输出质量。

lfPitchAndFamily: Byte;
指定字体的Pitch和Family。

lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
指定采用的字体名称。

在建立逻辑字体时,我们通常使用

lfHeight和lfWidth来确定字体的尺寸,使用lfEscapement和lfOrientation
来确定字体的输出方向,使用lfWeight
lfItalic
lfUnderline

lfStrikeOut
来确定字体的加重,斜体,下划线和穿透线,使用lfCharSet
来确定字体的字符集,通常采用系统默认的字符集。
对于lfOutPrecision
lfClipPrecision
lfQuality一般应用于对屏幕之外
的输出设备,通常采用默认值。采用lfPitchAndFamily来确定采用定宽或可
变字体和字体的家族。以lfFaceName来通过名称选择采用的字体。
另外应当注意在Windows环境下,每种字体具体输出为何种形式取决于很多
因素,需要对以上这些参数进行有效的组合才能达到所要的效果。
 
后退
顶部