仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 780|回复: 7
打印 上一主题 下一主题

[学习教程] ASP.NET编程:ASP.Net程序完成将Word转换PDF格局

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:34:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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。
小妖女 该用户已被删除
沙发
发表于 2015-1-19 16:51:24 | 只看该作者
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
若天明 该用户已被删除
板凳
发表于 2015-1-28 08:49:07 | 只看该作者
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
第二个灵魂 该用户已被删除
地板
发表于 2015-2-5 20:16:25 | 只看该作者
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
深爱那片海 该用户已被删除
5#
发表于 2015-2-13 12:09:12 | 只看该作者
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
变相怪杰 该用户已被删除
6#
发表于 2015-3-3 21:16:08 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
不帅 该用户已被删除
7#
发表于 2015-3-11 13:50:12 | 只看该作者
在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的
分手快乐 该用户已被删除
8#
发表于 2015-3-26 19:07:23 | 只看该作者
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-4 19:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表