ASP中的打印(100分)

  • 主题发起人 主题发起人 arcore
  • 开始时间 开始时间
A

arcore

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:在ASP中打印报表(有规则的二维表格和不规则的单据)有什么好的方法?在网上
有否此类相关好的控件下载?

请各位大富翁帮帮忙。
 
看看aspnet的东西,可能你可以找到你想要的
 
直接用IE打印不就是了
 
To Delphi_bbs:你是在讲ASP.NET吗?

To dingbaosheng:直接用IE打印的是网页,而非报表。不成的。。
 
是个问题,用delphi可以,我也没试好过
 
寻求中、、、
 
To xp166:你说用D可以,请问是怎么做的?D中的B/S我没有用过,请指点,谢谢!

请各位朋友帮帮忙。
 
基于web的打印是目前一个比较麻烦的问题,解决方法一般是用
active控件或者applet实现,这些方法都依赖于浏览器对安全
的限制。这里提出的方法是直接调用ie的打印接口window.print()
方法,实现客户端的打印。
ie的打印接口功能非常简单,仅仅是将当前页面或者当前帧的内容
简单的打印到打印机上,没用提供任何有用的用于打印控制的api。
要想控制,就只有在html标签上下功夫了。
先讲讲普通的打印,即不需要套打的情况。
首先,整个页面应该是基于frame结构的。一个主要的frame用于显示
给用户,另外后台隐藏一个帧,我将其命名为print_frame,
当用户要求打印时,刷新print_frame,将要打印的内容组织成html传给
print_frame,另外在该html中加入以下脚本:

<SCRIPT FOR=window EVENT=onload LANGUAGE=/"JScript/">
?? parent.print_frame.focus();
??window.print();
</SCRIPT>
当print_frame刷新完成后ie的打印对话框会自动跳出来要求选择打印格式
之类的东西,确定后ie会打印隐藏的打印帧的内容
(就是parent.print_frame.focus();这句确定的);
这时,面临的关键问题就是页面元素的定位了,这没有别的办法,只有一次次的试
了。记住,用象素定位而不要用百分比定位(所有的元素应该在表格中,只需要设定
table的列宽和列高就可以定位了)。一个屏幕象素等于打印机的0.01英寸,如何定
位就靠自己去算了。

关于套打。
其实上面提到的打印的实现方法对于套打是同样的,将不需要打印的部分去掉,只要
处理好定位的问题就可以了。关键可能是预览和套打如何协调。
在前台的主页面上显示预览的画面给客户,当客户打印时将同样的html传到隐藏帧显然
是不能实现套打的。那么维护两段基本相同的代码吗?这似乎太笨拙了,我的处理方法
是专门写了一个修正html标签的函数来处理要传递给打印帧的html。该函数实现的
主要功能是首先,要修正table的线条属性,先搜索到‘border=’的字符串,为保险起见,
我没有删除它,而是将其替换为‘oldborder=’,然后在该位置再加入一个‘border=0’
的属性设置。第二步,是处理有些字符在预览时需要显示而打印时不需要打印的,这需要在
显示预览的html中引入一个特殊的标记<preview></preview>,这个标记是我自己定义的,
ie并不支持,正因为ie不支持,所以,该标记对于预览的显示不会造成任何影响。在需要打印
时,修正函数搜索这两个标记,将它们之间的字符全部替换为等长的&amp;
n b s p ;
.至此,套打
的问题就已经没有什么需要解决的了。
 
两种选择:
1、插件,网上有很多ASP的打印组件。后面的文章也是介绍如何制作组件的。
2、组件本身存在运行注册的问题,发布的时候老是逼着用户改安全属性,总是不爽。
用IE本身的打印功能,虽然功能太简单,但用脚本就能搞定,并非不可取,你可以用
新开页面来显示报表,不就把其他无关的东西给去掉了吗?


用Delphi开发报表打印的ASP组件
--------------------------------------------------------------------------------
作者:zdygis 来源:CSDN 类别:Delphi 日期:2001.08.31 今日/总浏览: 5/505


   ASP在对数据库操作方面提供了很好的内嵌对象。但是,其他方面的功能有所欠缺,如:报表打印。特别是国内的复杂的报表,用ASP很难实现。

不过,ASP支持插件,这就可以根据需要开发ASP插件,笔者用Delphi5.0开发了ASP打印组件。下面笔者将分步来开发一个通用的报表打印的ASP组件。

第一步:新建一个Activex Library,命名为PrintT,然后再新建一个Active Server Object Class,命名为Print,即建立了一个名为Print的ASP组件,文件命名为Unit1.pas。

第二步:打开Type Library,新建一个方法Print1,用于传递报表打印。

第三步:新建一个DataModule,放入Adoconnection组件和AdoTable组件,文件名为Unit2.pas。

第四步:新建一个TQuickRep,设计你要打印的报表,文件名为文件名为Unit23.pas。以下是个文件的详细代码:
{=============Unit1.pas===============}

unit Unit1;


interface

uses
ComObj, ActiveX, AspTlb, PrintT_TLB, StdVcl;


type
TPrint = class(TASPObject, IPrint)
protected
procedure OnEndPage;
safecall;

procedure OnStartPage(const AScriptingContext: IUnknown);
safecall;

procedure Print1;
safecall;

end;



implementation

uses ComServ,unit2,unit23;


procedure TPrint.OnEndPage;

begin

inherited OnEndPage;

end;



procedure TPrint.OnStartPage(const AScriptingContext: IUnknown);

begin

inherited OnStartPage(AScriptingContext);

end;



procedure TPrint.Print1;

begin

IdearRpt.Print;

end;



initialization
TAutoObjectFactory.Create(ComServer, TPrint, Class_Print,
ciMultiInstance, tmApartment);

end.


{===============Unit2.pas===============}

unit Unit2;


interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, DB, ADODB;


type
TCustomerData = class(TDataModule)
ADOConnection1: TADOConnection;

ADOTable1: TADOTable;

DataSource1: TDataSource;

ADOTable1NIANH: TStringField;

ADOTable1XUH: TStringField;

ADOTable1SHENQDW: TStringField;

ADOTable1SHENQRQ: TDateTimeField;

ADOTable1FARDB: TStringField;

ADOTable1FARDH: TStringField;

ADOTable1LIANXR: TStringField;

ADOTable1LIANXRDH: TStringField;

ADOTable1DANWZCDZ: TStringField;

ADOTable1JIANSXZDM: TStringField;

ADOTable1JIANSGM: TBCDField;

ADOTable1ZHIGRS: TBCDField;

ADOTable1YONGDFH: TBCDField;

ADOTable1RIYSL: TBCDField;

ADOTable1RIPSL: TBCDField;

ADOTable1JIANZSJGD: TBCDField;

ADOTable1RANQYL: TBCDField;

ADOTable1YONGDYQ: TStringField;

ADOTable1RELYL: TBCDField;

ADOTable1JIANSXM: TStringField;

ADOTable1PIZWH: TStringField;

ADOTable1JIANSGM2: TBCDField;

ADOTable1YONGDXZDM: TStringField;

ADOTable1YONGDWZ: TStringField;

ADOTable1DONGL: TStringField;

ADOTable1XIL: TStringField;

ADOTable1NANL: TStringField;

ADOTable1BEIL: TStringField;

ADOTable1CHANG: TBCDField;

ADOTable1KUAN: TBCDField;

ADOTable1ZONGMJ1: TBCDField;

ADOTable1ZONGMJ2: TBCDField;

ADOTable1YOUXRQ1: TDateTimeField;

ADOTable1YOUXRQ2: TDateTimeField;

ADOTable1BEIZ: TStringField;

ADOTable1JINGB: TStringField;

ADOTable1SHENH: TStringField;

ADOTable1SHEND: TStringField;

ADOTable1SHENDRQ: TDateTimeField;

ADOTable1PICTURE: TBlobField;


private
{ Private declarations }
public
{ Public declarations }
end;



var
CustomerData: TCustomerData;


implementation

{$R *.DFM}



end.


{===========Unit23.pas===============}

unit Unit23;


interface

uses Windows, SysUtils, Messages, Classes, Graphics, Controls,
StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls;


type
TIdearRpt = class(TQuickRep)
PageFooterBand1: TQRBand;

PageHeaderBand1: TQRBand;

QRLabel1: TQRLabel;

QRLabel2: TQRLabel;

QRLabel3: TQRLabel;

QRDBText15: TQRDBText;

QRDBText17: TQRDBText;

QRDBText19: TQRDBText;

QRDBText13: TQRDBText;

QRLabel46: TQRLabel;

QRLabel47: TQRLabel;

TitleBand1: TQRBand;

QRShape1: TQRShape;

QRShape2: TQRShape;

QRShape3: TQRShape;

QRShape4: TQRShape;

QRShape5: TQRShape;

QRShape6: TQRShape;

QRLabel4: TQRLabel;

QRLabel5: TQRLabel;

QRLabel6: TQRLabel;

QRShape7: TQRShape;

QRShape8: TQRShape;

QRLabel7: TQRLabel;

QRLabel8: TQRLabel;

QRLabel11: TQRLabel;

QRLabel12: TQRLabel;

QRDBText1: TQRDBText;

QRDBText2: TQRDBText;

QRDBText4: TQRDBText;

QRDBText6: TQRDBText;

QRDBText3: TQRDBText;

QRShape9: TQRShape;

QRLabel9: TQRLabel;

QRDBText5: TQRDBText;

QRShape17: TQRShape;

QRShape22: TQRShape;

QRShape23: TQRShape;

QRShape24: TQRShape;

QRShape25: TQRShape;

QRShape26: TQRShape;

QRShape27: TQRShape;

QRShape10: TQRShape;

QRShape11: TQRShape;

QRShape12: TQRShape;

QRShape13: TQRShape;

QRShape18: TQRShape;

QRShape19: TQRShape;

QRLabel10: TQRLabel;

QRLabel13: TQRLabel;

QRLabel14: TQRLabel;

QRLabel15: TQRLabel;

QRLabel16: TQRLabel;

QRLabel17: TQRLabel;

QRLabel18: TQRLabel;

QRLabel19: TQRLabel;

QRLabel20: TQRLabel;

QRLabel21: TQRLabel;

QRLabel22: TQRLabel;

QRLabel23: TQRLabel;

QRLabel24: TQRLabel;

QRLabel32: TQRLabel;

QRLabel33: TQRLabel;

QRLabel34: TQRLabel;

QRLabel35: TQRLabel;

QRLabel36: TQRLabel;

QRShape20: TQRShape;

QRLabel37: TQRLabel;

QRLabel38: TQRLabel;

QRLabel41: TQRLabel;

QRLabel42: TQRLabel;

QRLabel43: TQRLabel;

QRLabel44: TQRLabel;

QRLabel45: TQRLabel;

QRLabel48: TQRLabel;

QRLabel49: TQRLabel;

QRLabel50: TQRLabel;

QRLabel51: TQRLabel;

QRLabel52: TQRLabel;

QRLabel53: TQRLabel;

QRLabel54: TQRLabel;

QRLabel55: TQRLabel;

QRLabel56: TQRLabel;

QRLabel57: TQRLabel;

QRLabel58: TQRLabel;

QRLabel59: TQRLabel;

QRLabel60: TQRLabel;

QRLabel61: TQRLabel;

QRShape28: TQRShape;

QRLabel62: TQRLabel;

QRLabel63: TQRLabel;

QRDBText7: TQRDBText;

QRDBText8: TQRDBText;

QRDBText9: TQRDBText;

QRDBText10: TQRDBText;

QRDBText11: TQRDBText;

QRDBText12: TQRDBText;

QRDBText14: TQRDBText;

QRDBText16: TQRDBText;

QRDBText18: TQRDBText;

QRDBText20: TQRDBText;

QRDBText21: TQRDBText;

QRDBText22: TQRDBText;

QRDBText23: TQRDBText;

QRDBText24: TQRDBText;

QRDBText25: TQRDBText;

QRDBText26: TQRDBText;

QRDBText27: TQRDBText;

QRDBText28: TQRDBText;

QRDBText29: TQRDBText;

QRDBText30: TQRDBText;

QRDBText31: TQRDBText;

QRDBText32: TQRDBText;

QRDBText33: TQRDBText;

QRDBText34: TQRDBText;

QRDBText35: TQRDBText;

QRMemo4: TQRMemo;

QRDBText36: TQRDBText;

QRDBText37: TQRDBText;

QRDBText38: TQRDBText;

private

public

end;



var
IdearRpt: TIdearRpt;


implementation
uses unit2;

{$R *.DFM}

end.


{=========PrintT.dpr============}

library PrintT;


{%File 'Print.asp'}

uses
ComServ,
PrintT_TLB in 'PrintT_TLB.pas',
Unit1 in 'Unit1.pas' {Print: CoClass},
Unit2 in 'Unit2.pas' {CustomerData: TDataModule},
Unit23 in 'Unit23.pas' {IdearRpt: TQuickRep};


exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;


{$R *.TLB}

{$R *.RES}

begin

IdearRpt := TIdearRPt.Create(NiL);{必不可少}
end.


第五步:编译并注册PrintT组件,即可在ASP代码中调用,调用示例如下:


<% Set DelphiASPObj = Server.CreateObject("PrintT.Print")
DelphiASPObj.Print1

%>

通过以上步骤,我们就顺利地利用Delphi开发出了具有报表功能的ASP组件了。当然,笔者只是介绍了一个简单的思路,希望能起到抛砖引玉之功效。





作者: zdygis
来源: CSDN
 
多谢[j_shen2000]和[小猪]两位,我想,我知道怎么做了。
 
后退
顶部