合同电子化,以方便和规范对合同的管理,实现合同签订、审批的流程化管理,满足管理信息化的要求。
将合同中变化的部分抽取出来,通过系统(用Delphi开发)录入数据库,借助审批流完成对合同的审批,最后转到打印管理员处打印、盖章。
一、实现方法一:WORD方式
用Word排版,将变化的部分用变量代替;在程序中通过COM操作Word,完成对变量的替换。保存成PDF文档,在客户端打印。
优点:对WORD版的合同,梢做改动即可使用,且WORD的普及率很高。
缺点:要求每台电脑上都要有WORD,且是安装版,不是简化版。后来把对WORD的处理和生成PDF放在服务器上完成,这虽然解决了对WORD的依赖,但是却带来效率的低下。由于多人同时生成合同,等待时间可能会较长。好在合同的签订量不大,也不太集中。COM技术操作Word的代码如下。
function TdmSrvr.CreateCompact2018PDF(Cds1:TDataSet; var PDFile: string): Boolean;
var
I:Integer;
imgSample: TImage;
vWord, vDoc: OleVariant;
FileName,CompactBarCode,CompactID: string;
lReturn: Boolean;
procedure DocReplace(sText, sReplace: string);
begin
lReturn := True;
while lReturn do //找到并替代成功则返回 True 共11个参数
lReturn := vDoc.Range.Find.Execute(sText, , , , , , , , , sReplace,True);
end;
function GetFieldValue(aFT: TField): String;
begin
if (aFT.DataType = ftDate) or (aFT.DataType = ftDateTime) then
begin
if aFT.IsNull then Result := ' 年 月 日'
else Result := FormatDateTime('YYYY年MM月DD日', aFT.AsDateTime);
end
else Result := aFT.AsString;
end;
begin
CompactID := Cds1.FieldByName('compactid').AsString;
imgSample := TImage.Create(nil);//生成合同编号的条形码
imgSample.Height := 46;
imgSample.Width := 104;
CompactBarCode := ExePath + CompactID + '.bmp';
FileName := ExePath + 'upload\hetong';
DrawBarCodeEAN13(imgSample, CompactID);
imgSample.Update;
imgSample.Picture.SaveToFile( CompactBarCode );
try
vWord := CreateOleObject('Word.Application'); //创建Word线程
vDoc := vWord.Documents.Open(FileName);
//这就是加放入图片的语句 cell(1,2)表示第一行第2列的地方
vDoc.tables.item(1).cell(2,2).range.InlineShapes.AddPicture(CompactBarCode,False, True);
//通过WORD的条形码控件实现,但是显示效果不好,太小。改为插入图片的方式
//vDoc.BarCodeCtrl1.Value := Cds1.FieldByName('CompactID').AsString;
vDoc.Select; //选取中整个文档
for I := 0 to Cds1.FieldCount - 1 do//用字段名做文档中的变量
DocReplace(Cds1.Fields[i].FieldName, GetFieldValue(cds1.Fields[i]));
PDFile := ExePath + CompactID + '.pdf';
vDoc.ExportAsFixedFormat(PDFile, 17);
Result := True;
finally
imgSample.Free;
vWord.Quit(False); //退出Word,不保存
Sleep(500);
end;
end;
二、实现方法二:网页方式。
利用HTML标签,定义各种格式,作为模板。当作文本文件处理,用程序动态生成网页,通过WebBrower控件显示并打印。这种方式没有尝试。
三、实现方法三:报表方式
用RM7.0可以支持HTML语法,太方便了。之前的版本2、3系列不支持,要实现不同的字体,需要分隔成多个MEMO控件。有了HTML语法的支持,可以直接用<b>来加粗,<h1>来指定字号,或者用font属性。一个页面一个MEMO控件就可以实现了,大大减化了设计的工作量。
这是最理想的实现方式。生成23页的报表不到一秒,而用WORD方式需要7秒,更重要的是这种方式脱离了WORD的依赖。
报表做成了,预览很漂亮,在惊喜之余,却发现好多行头有标点符号,这是不符合文档要求的。就开始摸索RM的功能,后来发现设置属性WordBreak就可以实现,只是有个遗憾。就是如果行尾是标点,则上一行最后一个字跑到下一行的行头了,用这种方式避免行头是标点符号,这样上一行最后就会有一个位置闲置。