Outlet locations & store hours
最近写一个程序,涉及到了把Word转换成PDF,开始的时候对这样的应用不熟悉,通过上网搜索最后选择了免费的PDFCreator,它能够把Word,图片,ps等文件转换PDF(支持PDF1.3到PDF1.5),其中的转换过程为(1)把文件通过驱动转换成ps文件(2)ps文件通过GhostScript(v8.54 一款postscript语言的解析器)转换成PDF。
下面详细讲述一下如何通过编程接口控制PDFCreator:
(1) 首先是安装,PDFCreator没有中文版本,当然你要汉化也没有问题J,首先如果把这个安装程序直接放到你自己的安装程序中,在安装的时候直接调用起来,我认为不太合适,并且用户看了很难接受!有两种方法解决问题:静默安装,由于PDFCreator的安装程序是由InnoSetup制作的,所以参数为/VERYSILENT /SP- /NORESTART;第二种方法就是你找到PDFCreator制作安装程序的脚本文件(*.iss),如果你熟悉InnoSetup的脚本的话,可以自己改的,把不要的全部去掉,还可以自己汉化
(2) 安装以后,你就可以使用你的IDE把类型库文件导出(跟其他的不一样,PDFCreator直接从exe导出),这样的话,你就可以针对这个接口进行编程了。主要的两个接口是clsPDFCreator和clsPDFCreatorOptions。
2.1:启动PDFCreator虚拟打印机:
//创建代理类
FPdfCreator := TclsPDFCreator.Create(nil);
//挂接OneReady事件(事件的作用后面说)
FPdfCreator.OneReady := DoeReady;
//启动虚拟打印机 Parameters= ‘/NoProcessingAtStartup’
if not FPdfCreator.cStart(Parameters, False) then
begin
ShowMessage('虚拟打印机启动不成功,请重新启动电脑后再次尝试!');
Exit;
end;
//把虚拟打印机设置成默认打印机
FPdfCreator.cDefaultPrinter := cPDFCreatorPrintName;
2.2:设置PDFCreator的Options参数
procedure SetPDFCreatorOption;
var
l_Option: _clsPDFCreatorOptions;
begin
l_OPtion := FPdfCreator.cOptions;
//是否自动保存(0为False,非0为True),自动保存,打印才不会弹出对话框
l_OPtion.UseAutosave := 1;
//是否使用自动保存的路径
l_OPtion.UseAutosaveDirectory := 1;
//自动保存的文件格式(0表示PDF,因为还有其他格式,这里只关注PDF)
l_OPtion.AutosaveFormat := 0;
//指定自动保存的文件路径
l_OPtion.AutosaveDirectory := GetExePath + cTempDir;
//指定自动保存的文件名称
l_OPtion.AutosaveFilename := cTempFileNameOnly;
//优先级设置为高,转换更快(1表示低级,2表示高级,3表示实时)
l_Option.Processpriority := 2;
FPdfCreator.cOptions := l_Option;
//一定要SaveOptions
FPdfCreator.cSaveOptions;
FPdfCreator.cClearCache;
end;
2.3:虚拟打印
//在开始打印之前必须指定cPrinterStop为False,表示不是停止状态
FPdfCreator.cPrinterStop := False;
//打印(关于这个,你会发现在打印的过程中,它会把文档先打开,我感觉不好,//所以我在实际中并没有调用它,而是调用文档的打印,比如word接口,默认打印机改成这个,所以也会成功的,并且不会把文档打开,非常好)
FPdfCreator.cPrintFile(FileName);
oTime.Interval := CMaxTime * 1000;
oTime.Enabled := True;
oTime.OnTimer := DoTimer;
FReadyState := False;
//监视打印状态是否为已经完成,再加上一个时限
//比如2分钟还没有完成,认为打印失败
//注意当打印完成时,会调用OneReady事件,改变FReadyState状态
while (not FReadyState) and oTime.Enabled do
Application.ProcessMessages;
oTime.Enabled := False;
if not FReadyState then
begin
Result := False;
ShowMessage(CPrintError);
Exit;
end;
FPdfCreator.cPrinterStop := True;
//事件DoeReady,用来挂接PDFCreator的OneReady事件
//如果运行到这个事情,表示已经打印完成。
procedure TWordToPDF.DoeReady(Sender: TObject);
begin
FPdfCreator.cPrinterStop := True;
FReadyState := True;
end;