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"; try{ var 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); } |
public 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(); } |
private void button1_Click(object sender, System.EventArgs e) { //定义线程序 Thread thConvert = new Thread(new ThreadStart(StartConvertData)); thConvert.Start(); } |
using System.Diagnostics; using System.Threading; |
using System; using System.Diagnostics; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace Doc2PDF { public class ToPDF { private 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系统,回调函数可以不放在类中,以便在窗体程序中调用结果 } } } |
private void button1_Click(object sender, System.EventArgs e) { ToPDF my2PDF = new ToPDF("test.doc","c:"); ThreadStart thStartConvert = new ThreadStart(my2PDF.StartConvertPDF); //开始异步调用线程 thStartConvert.BeginInvoke(new AsyncCallback(my2PDF.EndConvertPDF),null);//设置异步线程的回调函数 //如果需要转换多个Word,你可以用循环 //如果是B/S系统,可以将本段代码放在ASPX中,并结合客户端的无刷新显示数据的技术,不断访问WEBService程序,以确定PDF是否转换成功或失败 } |
//以下给出,泛代码,用户按照自己的需求,填写完整即可 //bool bStart为全局变量,控制循环的进入与退出 //例:18:30开始检查并转换,那么18:30时,bStart=true;并启动转换线程 //6:30停止转换线程,bStart=fasle; private void CheckData2Convert() { //检查指定目录下的没有转换的Word文档,你同样可以检查数据库中记录的没有转换的Word文档 string sPath = System.Threading.Thread.GetDomain().BaseDirectory; //当前的路径 while(bStart) { int iFileCount = CheckWord(); //CheckWord为一个方法,检查当前没有转换的Word文档,返回没有转换的文件数,该方法的代码由读者自己编写 for(int i=0;i<iFileCount;i++) { string sWord = GetWordFileName(i) //GetWordFileName为一个方法,返回一个不带路径的Word文件名,该方法的代码由读者自己编写 //ToPDF类中的StartConvertPDF()方法使用的是不带路径的Word文件名 ToPDF my2PDF = new ToPDF(sWord ,sPath); my2PDF.StartConvertPDF(); if(my2PDF.sExecResult.IndexOf("isuccess")!=-1) else if(my2PDF.sExecResult.IndexOf("isfail")!=-1) } if(!bStart)break; Thread.Sleep(1000); } } |
protected override void OnStart(string[] args) { //可以使用一个开始定时器,检查是否到开始时间,时间一到,就开始执行线程,此处的开始执行线程可以放在开始定时事件中 //可以使用一个结束定时器,检查是否到结束时间,时间一到,就结束线程,结束线程的代码可以放在结束定时事件中 //注意:应该使用组件中的定时器,而不是Windows的FORMS中的定时器 //该定时器的类名为System.Timers.Timer,千万别搞错,不然执行不会正常的 bStart = true; Thread thConvert = new Thread(new ThreadStart(StartConvertData)); thConvert.Start(); } |
protected override void OnStop() { bStart = false; //为何次处不停止线程呢,因为考虑到,现在线程正在转换Word文档,但没有结束,所以只设置停止标识,转换完成后,线程也执行结束了. } |