资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
用 C#.NET 实现生成 PDF 文档和将 WORD 转换为 PDF前序需求分析:客户的项目以 B/S 结构为主,提供一个 WORD 文件在后台自动转换成 PDF,经过实际测试,如果该篇 WORD 文档有 100 多页的话,转换需要 20 分钟左右的时间( 环境:CPU 是奔腾 M 1.6G,512M 内存), 整个 CPU 的占用率近乎 95%100%,此结果告诉客户以后,客户提议:到客户下班后,自动转换 PDF,同时如果使用人确认要查看该 PDF 文档,如果没有转换,提供给客户选择,是现在转换成 PDF,还是由服务器在客户下班后,自动转换。项目功能:按需求分析要写两个功能第一为:B/S 结构后台转换,要提交给客户选择第二为:Windows 服务自动转换 WORD 文档到 PDF这两个分类:核心的转换程序都是采用线程的方式执行 ,只不过第一个功能是针对一个WORD 文件,第二个功能针对所有未转换的 WORD 文档.分析到现在:我们开始实战转换了 !一:必备工具安装必须的工具 MS VS. Net2003, MS Office2003, Adobe Acrobat 7.0 Professional, postscript.exe, gs811w32.exeMS VS.Net2003 的安装不说明MS Office2003 的安装不说明Adobe Acrobat 7.0 Professional 安装说明运行 setup.exe 文件,出现输入序列号,就运行注册机,用鼠标在第一行刷下就可以看见序列号,复制粘贴到 Adobe Acrobat 7.0 Professional 安装程序对话框,安装到最后出现注册时,点击PHONE.将安装程序中显示的第二行序列号(第一行是刚才注册机生成的序列号)复制粘贴到注册机的第二行,点击右边的按钮,再用鼠标刷第三行授权号就出来了,将其复制粘贴到安装程序的最后一行,完成安装注册!postscript.exe 默认安装就可以了 ,它是一个 PDF 转换时所需要的脚本gs811w32.exe 默认安装就可以,它其实是个 PDF 虚拟打印机的驱动二:配置虚拟打印机进入 Windows 的控制面板,进入打印机 ,点击 添加打印机图标.在安装对话框上按一步, 出现选择打印机时,在制造商一栏中选择Generic,在打印机一栏中,选择MS Publisher Color Printer,然后一路按下一步,知道安装结束.三:开始写第一个程序( 脚本程序)为什么要使用脚本程序进行转换呢,其实实际测试过程中,使用 PDF Distiller 的对象引用到C#后,转换成功,但整个 PDF Distiller 对象不能释放,第二次再转换时,就发生了错误,故此处使用脚本程序实现转换.这样我们只要在 C#的程序中调用脚本程序就可以实现 WORD 到 PDF的转换。宿主脚本文件名:ConvertDoc2PDF.js脚本文件内容:var files = WScript.Arguments;var fso = new ActiveXObject(Scripting.FileSystemObject);var word = new ActiveXObject(Word.Application);var PDF = new ActiveXObject(PDFDistiller.PDFDistiller.1);word.ActivePrinter = MS Publisher Color Printer;/files(0) 为 WORD 文档文件名/files(1) 为,转换后需要保存的路径/调用 fso.GetBaseName(files(0)后,为无路径,无扩展名,的文件名/files.length 为文件参数的个数,使用循环可以支持多个 WORD 文档的转换var docfile = files(0);var psfile = files(1) + fso.GetBaseName(files(0) + .ps;var pdffile = files(1) + fso.GetBaseName(files(0) + .pdf;var logfile = files(1) + fso.GetBaseName(files(0) + .log;tryvar doc = word.Documents.Open(docfile);/WORD 文件转成 PS 文件;word.PrintOut(false, false, 0, psfile);doc.Close(0);/PS 文件转成 PDF 文件;PDF.FileToPDF(psfile,pdffile,);fso.GetFile(psfile).Delete();/删除 PS 脚本文件fso.GetFile(logfile).Delete();/删除转换的日志文件word.Quit();WScript.Echo(isuccess);/成功WScript.Quit(0);catch(x)word.Quit();WScript.Echo(isfail);/失败WScript.Quit(0);然后测试该脚本程序启动 MS-DOS,输入如下命令:c:cscript /nologo c:ConvertDoc2PDF.js c:test.doc c:说明:运行成功后将看到 test.pdf 文档了c:test.doc 参数对应的是脚本程序中的 files(0)c:参数对应的是脚本程序中的 files(1)你可以安照该脚本改写成,支持多个参数,使用 FOR 循环,一次转换多个 WORD 文档,此处没有使用多个文件转换功能,是考虑到,该段脚本放在 C#的线程中执行,这样一来也可以转换多个 WORD 文档 .四:使用 C#调用 ConvertDoc2PDF.js 脚本新建一个 C#的 WINDOWS 应用程序 ,添加一个按钮 button1添加一个函数,函数名 StartConvertPDFpublic void StartConvertPDF()Process proc = new Process();proc.StartInfo.FileName = cmd.exe;proc.StartInfo.WorkingDirectory = c:;proc.StartInfo.CreateNoWindow = true;proc.StartInfo.UseShellExecute = false;proc.StartInfo.RedirectStandardInput = true; /输入重定向proc.Start();proc.StandardInput.WriteLine(cscript /nologo c:ConvertDoc2PDF.js c:test.doc c:);proc.StandardInput.WriteLine(exit);proc.WaitForExit();然后在按钮的 CLICK 事件中添加调用线程的代码private void button1_Click(object sender, System.EventArgs e)/定义线程序Thread thConvert = new Thread(new ThreadStart(StartConvertData);thConvert.Start();注意:在测试上面的 C#程序时,必须添加如下命名空间using System.Diagnostics;using System.Threading;五:健壮的 C#调用代码( 实际考虑,可放在 B/S 系统中)完成第 4 步的 C#测试后,细心的读者 ,可能看到一点问题,那就是如何得到脚本运行后输出的结果,如何给线程中调用的 StartConvertData 方法传递参数1:传递参数,此话说来也可用一篇教程告诉大家线程中方法如何来传递参数,现在就讲一个方案,此种方案很多,我采用一个类,初始化这个类,然后调用该类的方法作为线程执行的方法2:得到脚本的输出结果,使用 Process 对象的输出重定向,就是说改变输出方向,使脚本不输出到控制台(MS-DOS 窗口), 而是重定向输出到 C#程序中,并采用线程的异步回调方法,显示脚本运行结果。添加一个新类,类名为 ToPdfusing System;using System.Diagnostics;using System.ComponentModel;using System.Windows.Forms;using System.Data;namespace Doc2Pdfpublic class ToPdfprivate string strWord = ;/此处的 WORD 文件不含路径private string sPath = ;public string sExecResult = ;public bool bSuccess = false;public ToPdf(string sParamWord,string sParamPath)strWord = sParamWord;sPath = sParamPath;public void StartConvertPDF()Process proc = new Process();proc.StartInfo.FileName = cmd.exe;proc.StartInfo.WorkingDirectory = sPath;proc.StartInfo.CreateNoWindow = true;proc.StartInfo.UseShellExecute = false;proc.StartInfo.RedirectStandardInput = true;/标准输入重定向proc.StartInfo.RedirectStandardOutput = true;/标准输出重定向proc.Start();proc.StandardInput.WriteLine(cscript /nologo +sPath+ConvertDoc2PDF.js +sPath+strWord+ +sPath);proc.StandardInput.WriteLine(exit);sExecResult = proc.StandardOutput.ReadToEnd();/返回脚本执行的结果proc.WaitForExit();proc.Close();public void EndConvertPDF(System.IAsyncResult ar)/ar 参数必须写,是线程执行完成后的回调函数if(sExecResult.IndexOf(isuccess)!=-1)bSuccess=true;else if(sExecResult.IndexOf(isfail)!=-1)bSuccess=false;/如果放在 B/S 系统,你可以在此处写数据库,是成功还是失败,并用一个 WEBService程序不断检查数据库,此 WEBService 程序不放在该回调用函数中/如果放在 C/S 系统,回调函数可以不放在类中,以便在窗体程序中调用结果改写原来的 button1_Click 事件中的代码private void button1_Click(object sender, System.EventArgs e)ToPdf my2Pdf = new ToPdf(test.doc,c:);ThreadStart thStartConvert = new ThreadStart(my2Pdf.StartConvertPDF); /
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号