|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)asp.net|pdf|word|程序|转换 媒介:因为一个客户的项目中必要将WORD文档转换成PDF格局,故写了本篇实站教程
需求剖析:客户的项目以B/S布局为主,供应一个WORD文件在背景主动转换成PDF,经由实践测试,假如该篇WORD文档有100多页的话,转换必要20分钟摆布的工夫(情况:CPU是奔跑M1.6G,512M内存),全部CPU的占用率近乎95%~100%,此了局告知客户今后,客户发起:到客户上班后,主动转换PDF,同时假如利用人确认要检察该PDF文档,假如没有转换,供应给客户选择,是如今转换成PDF,仍是由服务器在客户上班后,主动转换。
项目功效:按需求剖析要写两个功效
第一为:B/S布局背景转换,要提交给客户选择
第二为:Windows服务主动转换WORD文档到PDF
这两个分类:中心的转换程序都是接纳线程的体例实行,只不外第一个功效是针对一个WORD文件,第二个功效针对一切未转换的WORD文档.
剖析到如今:我们入手下手实战转换了!
一:必备工具
安装必需的工具MSVS.Net2003,MSOffice2003,AdobeAcrobat7.0Professional,postscript.exe,gs811w32.exe
MSVS.Net2003的安装不申明
MSOffice2003的安装不申明
AdobeAcrobat7.0Professional安装申明
运转setup.exe文件,呈现输出序列号,就运转注册机,用鼠标在第一行刷下就能够瞥见序列号,复制粘贴到AdobeAcrobat7.0Professional安装程序对话框,安装到最初呈现注册时,点击PHONE...将安装程序中显现的第二行序列号(第一行是方才注册机天生的序列号)复制粘贴到注册机的第二行,点击右侧的按钮,再用鼠标刷第三行受权号就出来了,将其复制粘贴到安装程序的最初一行,完成安装注册!
postscript.exe默许安装就能够了,它是一个PDF转换时所必要的剧本
gs811w32.exe默许安装就能够,它实际上是个PDF假造打印机的驱动
二:设置假造打印机
进进Windows的把持面板,进进打印机,点击"增加打印机"图标.在安装对话框上"按一步",呈现选择打印机时,在打造商一栏当选择"Generic",在打印机一栏中,选择"MSPublisherColorPrinter",然后一起按下一步,晓得安装停止.
三:入手下手写第一个程序(剧本程序)
为何要利用剧本程序举行转换呢,实在实践测试过程当中,利用PDFDistiller的工具援用到C#后,转换乐成,但全部PDFDistiller工具不克不及开释,第二次再转换时,就产生了毛病,故此处利用剧本程序完成转换.如许我们只需在C#的程序中挪用剧本程序就能够完成WORD到PDF的转换。
宿主剧本文件名:ConvertDoc2PDF.js
剧本文件内容:
varfiles=WScript.Arguments;
varfso=newActiveXObject("Scripting.FileSystemObject");
varword=newActiveXObject("Word.Application");
varPDF=newActiveXObject("PDFDistiller.PDFDistiller.1");
word.ActivePrinter="MSPublisherColorPrinter";
//files(0)为WORD文档文件名
//files(1)为,转换后必要保留的路径
//挪用fso.GetBaseName(files(0))后,为无路径,无扩大名,的文件名
//files.length为文件参数的个数,利用轮回能够撑持多个WORD文档的转换
vardocfile=files(0);
varpsfile=files(1)+fso.GetBaseName(files(0))+".ps";
varpdffile=files(1)+fso.GetBaseName(files(0))+".pdf";
varlogfile=files(1)+fso.GetBaseName(files(0))+".log";
try{
vardoc=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//nologoc:ConvertDoc2PDF.jsc: est.docc:
申明:
运转乐成后将看到test.pdf文档了
c: est.doc参数对应的是剧本程序中的files(0)
c:参数对应的是剧本程序中的files(1)
你能够安照该剧本改写成,撑持多个参数,利用FOR轮回,一次转换多个WORD文档,此处没有利用多个文件转换功效,是思索到,该段剧本放在C#的线程中实行,如许一来也能够转换多个WORD文档.
四:利用C#挪用ConvertDoc2PDF.js剧本
新建一个C#的WINDOWS使用程序,增加一个按钮button1
增加一个函数,函数名StartConvertPDF
publicvoidStartConvertPDF()
{
Processproc=newProcess();
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//nologoc:ConvertDoc2PDF.jsc: est.docc:");
proc.StandardInput.WriteLine("exit");
proc.WaitForExit();
}
然后在按钮的CLICK事务中增加挪用线程的代码
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
//界说线程序
ThreadthConvert=newThread(newThreadStart(StartConvertData));
thConvert.Start();
}
注重:在测试下面的C#程序时,必需增加以下定名空间
usingSystem.Diagnostics;
usingSystem.Threading;
五:强健的C#挪用代码(实践思索,可放在B/S体系中)
完成第4步的C#测试后,仔细的读者,大概看到一点成绩,那就是怎样失掉剧本运转后输入的了局,怎样给线程中挪用的StartConvertData办法传送参数
1:传送参数,此话说来也可用一篇教程告知人人线程中办法怎样来传送参数,如今就讲一个计划,此种计划良多,我接纳一个类,初始化这个类,然后挪用该类的办法作为线程实行的办法
2:失掉剧本的输入了局,利用Process工具的输入重定向,就是说改动输入偏向,使剧本不输入到把持台(MS-DOS窗口),而是重定向输入到C#程序中,并接纳线程的异步回调办法,显现剧本运转了局。
增加一个新类,类名为ToPdf
usingSystem;
usingSystem.Diagnostics;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
namespaceDoc2Pdf
{
publicclassToPdf
{
privatestringstrWord="";//此处的WORD文件不含路径
privatestringsPath="";
publicstringsExecResult="";
publicboolbSuccess=false;
publicToPdf(stringsParamWord,stringsParamPath)
{
strWord=sParamWord;
sPath=sParamPath;
}
publicvoidStartConvertPDF()
{
Processproc=newProcess();
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();
}
publicvoidEndConvertPDF(System.IAsyncResultar)//ar参数必需写,是线程实行完成后的回调函数
{
if(sExecResult.IndexOf("isuccess")!=-1)bSuccess=true;
elseif(sExecResult.IndexOf("isfail")!=-1)bSuccess=false;
//假如放在B/S体系,你能够在此处写数据库,是乐成仍是失利,并用一个WEBService程序不休反省数据库,此WEBService程序不放在该回挪用函数中
//假如放在C/S体系,回调函数能够不放在类中,以便在窗体程序中挪用了局
}
}
}
改写本来的button1_Click事务中的代码
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
ToPdfmy2Pdf=newToPdf("test.doc","c:");
ThreadStartthStartConvert=newThreadStart(my2Pdf.StartConvertPDF);//入手下手异步伐用线程
thStartConvert.BeginInvoke(newAsyncCallback(my2Pdf.EndConvertPDF),null);//设置异步线程的回调函数
//假如必要转换多个WORD,你能够用轮回
//假如是B/S体系,能够将本段代码放在ASPX中,并分离客户真个无革新显现数据的手艺,不休会见WEBService程序,以断定PDF是不是转换乐成或失利
}
六:编写加倍强健的C#挪用代码(实践思索,可放在WINDOWS的服务程序中)
实践利用时,因为转化PDF时CPU的占用率很高,思索只在统一工夫转换一篇WORD文档,保持异步线程的回调函数的利用,思索一个WINDOWS的服务程序。
写一个函数CheckData2Convert(),不休的反省没有转换的WORD文档,并利用轮回挪用ToPdf类中实行转换办法StartConvertPDF
//以下给出,泛代码,用户依照本人的需求,填写完全便可
//boolbStart为全局变量,把持轮回的进进与加入
//例:18:30入手下手反省并转换,那末18:30时,bStart=true;并启动转换线程
//6:30中断转换线程,bStart=fasle;
privatevoidCheckData2Convert()
{
//反省指定目次下的没有转换的WORD文档,你一样能够反省数据库中纪录的没有转换的WORD文档
stringsPath=System.Threading.Thread.GetDomain().BaseDirectory;//以后的路径
while(bStart)
{
intiFileCount=CheckWord();//CheckWord为一个办法,反省以后没有转换的WORD文档,前往没有转换的文件数,该办法的代码由读者本人编写
for(inti=0;i<iFileCount;i++)
{
stringsWord=GetWordFileName(i)//GetWordFileName为一个办法,前往一个不领路径的WORD文件名,该办法的代码由读者本人编写
//ToPdf类中的StartConvertPDF()办法利用的是不领路径的WORD文件名
ToPdfmy2Pdf=newToPdf(sWord,sPath);
my2Pdf.StartConvertPDF();
if(my2Pdf.sExecResult.IndexOf("isuccess")!=-1)
{
//乐成,写日记,或回写数据库
}
elseif(my2Pdf.sExecResult.IndexOf("isfail")!=-1)
{
//失利,写日记,或回写数据库
}
}
if(!bStart)break;
Thread.Sleep(1000);
}
}
然后在服务的入手下手事务中,启动线程
protectedoverridevoidOnStart(string[]args)
{
//可使用一个入手下手准时器,反省是不是到入手下手工夫,工夫一到,就入手下手实行线程,此处的入手下手实行线程能够放在入手下手准时事务中
//可使用一个停止准时器,反省是不是到停止工夫,工夫一到,就停止线程,停止线程的代码能够放在停止准时事务中
//注重:应当利用组件中的准时器,而不是Windows的FORMS中的准时器
//该准时器的类名为System.Timers.Timer,万万别弄错,否则实行不会一般的
bStart=true;
ThreadthConvert=newThread(newThreadStart(StartConvertData));
thConvert.Start();
}
然后在服务的停止事务中,设置中断线程的标识bStart=false
protectedoverridevoidOnStop()
{
bStart=false;
//为什么次处一直止线程呢,由于思索到,如今线程正在转换WORD文档,但没有停止,以是只设置中断标识,转换完成后,线程也实行停止了.
}
停止语:
AdobeAcrobat7.0Professional,postscript.exe,gs811w32.exe这三个文件能够在itbaby.jss.cn下载,都包括在统一个RAR的紧缩文件中了。
itbaby.jss.cn是静态域名,主机在作者家里,假如网站不克不及会见,申明电脑没有开,请稍后几天再试。
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。 |
|