发布网友 发布时间:2022-04-22 09:59
共2个回答
热心网友 时间:2023-10-31 12:47
ASP实现将WORD等文档生成成PDF文档方法如下:
一、添加引用
using Microsoft.Office.Interop.Word;
二、转换方法
1、方法
C# 代码
/// <summary>
/// 把Word文件转换成pdf文件
/// </summary>
/// <param name="sourcePath">需要转换的文件路径和文件名称</param>
/// <param name="targetPath">转换完成后的文件的路径和文件名名称</param>
/// <returns>成功返回true,失败返回false</returns>
public static bool WordToPdf(string sourcePath, string targetPath)
{
bool result = false;
WdExportFormat wdExportFormatPDF = WdExportFormat.wdExportFormatPDF;//转换格式
1.wdExportFormatPDF转换成pdf格式 2.wdExportFormatXPS转换成xps格式
object missing = Type.Missing;
Microsoft.Office.Interop.Word.ApplicationClass applicationClass = null;
Document document = null;
try
{
applicationClass = new Microsoft.Office.Interop.Word.ApplicationClass();
object inputfileName = sourcePath;//需要转格式的文件路径
string outputFileName = targetPath;//转换完成后PDF或XPS文件的路径和文件名名称
WdExportFormat exportFormat = wdExportFormatPDF;//导出文件所使用的格式
bool openAfterExport = false;//转换完成后是否打开
WdExportOptimizeFor wdExportOptimizeForPrint =
WdExportOptimizeFor.wdExportOptimizeForPrint;//导出方式1.wdExportOptimizeForPrint针对打印进
行导出,质量较高,生成的文件大小较大。2.wdExportOptimizeForOnScreen 针对屏幕显示进行导出,
质量较差,生成的文件大小较小。
WdExportRange wdExportAllDocument = WdExportRange.wdExportAllDocument;//导出全
部内容(枚举)
int from = 0;//起始页码
int to = 0;//结束页码
WdExportItem wdExportDocumentContent = WdExportItem.wdExportDocumentContent;//
指定导出过程中是否只包含文本或包含文本的标记.1.wdExportDocumentContent:导出文件没有标记,2.
导出文件有标记
bool includeDocProps = true;//指定是否包含新导出的文件在文档属性
bool keepIRM = true;//
WdExportCreateBookmarks wdExportCreateWordBookmarks =
WdExportCreateBookmarks.wdExportCreateWordBookmarks;
//1.wdExportCreateNoBookmarks:不要在导出文件中创建书签
//2.wdExportCreateHeadingBookmarks:标题和文本框导出的文件中创建一个书签,
//3.wdExportCreateWordBookmarks每个字的书签,其中包括除包含页眉和页脚中的所有书签导出的文件中创建一个书签。
bool docStructureTags = true;
bool bitmapMissingFonts = true;
bool UseISO19005_1 = false;//生成的文档是否符合 ISO 19005-1 (PDF/A)
document = applicationClass.Documents.Open(ref inputfileName, ref missing, ref
missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref
missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
if (document != null)
{
document.ExportAsFixedFormat(outputFileName, exportFormat, openAfterExport,
wdExportOptimizeForPrint, wdExportAllDocument, from, to, wdExportDocumentContent,
includeDocProps, keepIRM, wdExportCreateWordBookmarks, docStructureTags,
bitmapMissingFonts, UseISO19005_1, ref missing);
}
result = true;
}
catch
{
result = false;
}
finally
{
if (document != null)
{
document.Close(ref missing, ref missing, ref missing);
document = null;
}
if (applicationClass != null)
{
applicationClass.Quit(ref missing, ref missing, ref missing);
applicationClass = null;
}
}
return result;
}
热心网友 时间:2023-10-31 12:47
实际使用时,由于转化PDF时CPU的占用率很高,考虑只在同一时间转换一篇WORD文档,放弃异步线程的回调函数的使用,考虑一个WINDOWS的服务程序。
写一个函数CheckData2Convert(),不断的检查没有转换的WORD文档,并使用循环调用ToPdf类中执行转换方法StartConvertPDF
//以下给出,泛代码,用户按照自己的需求,填写完整即可
//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();
}
然后在服务的结束事件中,设置停止线程的标识bStart= false
protected override void OnStop()
{
bStart = false;
//为何次处不停止线程呢,因为考虑到,现在线程正在转换WORD文档,但没有结束,所以只设置停止标识,转换完成后,线程也执行结束了.
}
结束语:
Adobe Acrobat 7.0 Professional,postscript.exe,gs811w32.exe这三个文件可以在itbaby.jss.cn下载,都包含在同一个RAR的压缩文件中了。
itbaby.jss.cn是动态域名,主机在作者家里,如果网站不能访问,说明电脑没有开,请稍后几天再试。