天天看点

电子合同的实现 合同套打

合同电子化,以方便和规范对合同的管理,实现合同签订、审批的流程化管理,满足管理信息化的要求。

将合同中变化的部分抽取出来,通过系统(用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就可以实现,只是有个遗憾。就是如果行尾是标点,则上一行最后一个字跑到下一行的行头了,用这种方式避免行头是标点符号,这样上一行最后就会有一个位置闲置。

继续阅读