Every day is a new day.Hello,technology curtilages.
最近接了几个小项目,也是要备战考试,所以就没写什么大项目了,只是一些功能模块。前几日发现51CTO的下载技术文档区域有了预览功能感觉不错哦,虽然不知道怎么写的,但是感觉很是方便呢。也没怎么留意代码,直到接到“活儿”发现要做一个同样的功能,我当时就感觉傻眼了,这我哪会?但是没办法,接下来的东西不能退!硬着头皮上呗,当天我在网上搜索了近百篇网页,发现现在流行的有三种:Print2Flash,FlexPaper+SWFTools,flash2paper.
首先说flash2paper,这个版本的支持32位系统,不支持64位,但是在以前通用的比较广泛,现在已经是“XP”的阶段了。PASS!然后是Print2Flash,目前用的还是比较多的,但是有个缺点是它会自动在系统中生成以恶搞虚拟的打印机,到时候你办公的时候需要重新修改设置打印机,很是麻烦,如果你是小白的话。PASS!最后我们选择的是FlexPaper+SWFTools,和51CTO的一样。找了一个世界,最终还是回到故乡。很亲切!
在线预览文档原理:把你上传的任何格式的文档统一转换成flash播放器能够识别的格式,也就是swf播放出来,效果就是文档预览了。道理都懂,但是真正去做的话,大牛也未必能一招就可以破敌。后期的调试我深有体会,虽然做这个东西我两天就倒持出来了,但是基本上没吃饭没喝水,过程很艰辛。因为没有接触过这样的东西,所以学习的过程是自己的事儿。
下面开始教程,首先我看了看51CTO的书写格式:
熟悉一下FlexPaper的属性设置,找到传值的url,如下图,
这样我们大概就会明白FlexPaper的配置了,接着来看SWFTools,这个东西呢是统一把pdf文档转换为swf,这样的话,思路就出来了,上传的时候给个判断,
if( fileExt == ".doc" || fileExt == ".docx"){ office2pdf.DOCConvertToPDF(sourcePath, targetPath);}if( fileExt == ".ppt" ||fileExt == ".pptx"){ office2pdf.PPTConvertToPDF(sourcePath, targetPath);}if( fileExt == ".xlsx" || fileExt == ".xls"){ office2pdf.XLSConvertToPDF(sourcePath, targetPath);}if (fileExt == ".pdf"){ //不做处理}
把office的文档格式统一成pdf就可以了,然后利用swftools转换为swf,就可以很好预览文档。 说起来似乎很简单,但是做的话,问题也会出现不少。
接下来我给你介绍office2pdf转换类的写法:你需要引用四个dll,分别是Microsoft.Office.Interop.Excel,Microsoft.Office.Interop.PowerPoint,Microsoft.Office.Interop.Word,office。
using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using Word = Microsoft.Office.Interop.Word;using Excel = Microsoft.Office.Interop.Excel;using PowerPoint = Microsoft.Office.Interop.PowerPoint;using Microsoft.Office.Core;namespace Document_preview.commonClass{ ////// Office2Pdf 将Office文档转化为pdf /// public class Office2Pdf { public Office2Pdf() { // // TODO: 在此处添加构造函数逻辑 // } ////// Word转换成pdf /// /// 源文件路径 /// 目标文件路径 ///true=转换成功 public bool DOCConvertToPDF(string sourcePath, string targetPath) { bool result = false; Word.WdExportFormat exportFormat = Word.WdExportFormat.wdExportFormatPDF; object paramMissing = Type.Missing; Word.ApplicationClass wordApplication = new Word.ApplicationClass(); Word.Document wordDocument = null; try { object paramSourceDocPath = sourcePath; string paramExportFilePath = targetPath; Word.WdExportFormat paramExportFormat = exportFormat; bool paramOpenAfterExport = false; Word.WdExportOptimizeFor paramExportOptimizeFor = Word.WdExportOptimizeFor.wdExportOptimizeForPrint; Word.WdExportRange paramExportRange = Word.WdExportRange.wdExportAllDocument; int paramStartPage = 0; int paramEndPage = 0; Word.WdExportItem paramExportItem = Word.WdExportItem.wdExportDocumentContent; bool paramIncludeDocProps = true; bool paramKeepIRM = true; Word.WdExportCreateBookmarks paramCreateBookmarks = Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks; bool paramDocStructureTags = true; bool paramBitmapMissingFonts = true; bool paramUseISO19005_1 = false; wordDocument = wordApplication.Documents.Open( ref paramSourceDocPath, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing); if (wordDocument != null) wordDocument.ExportAsFixedFormat(paramExportFilePath, paramExportFormat, paramOpenAfterExport, paramExportOptimizeFor, paramExportRange, paramStartPage, paramEndPage, paramExportItem, paramIncludeDocProps, paramKeepIRM, paramCreateBookmarks, paramDocStructureTags, paramBitmapMissingFonts, paramUseISO19005_1, ref paramMissing); result = true; } catch { result = false; } finally { if (wordDocument != null) { wordDocument.Close(ref paramMissing, ref paramMissing, ref paramMissing); wordDocument = null; } if (wordApplication != null) { wordApplication.Quit(ref paramMissing, ref paramMissing, ref paramMissing); wordApplication = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } return result; } ////// 把Excel文件转换成PDF格式文件 /// /// 源文件路径 /// 目标文件路径 ///true=转换成功 public bool XLSConvertToPDF(string sourcePath, string targetPath) { bool result = false; Excel.XlFixedFormatType targetType = Excel.XlFixedFormatType.xlTypePDF; object missing = Type.Missing; Excel.ApplicationClass application = null; Excel.Workbook workBook = null; try { application = new Excel.ApplicationClass(); object target = targetPath; object type = targetType; workBook = application.Workbooks.Open(sourcePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); workBook.ExportAsFixedFormat(targetType, target, Excel.XlFixedFormatQuality.xlQualityStandard, true, false, missing, missing, missing, missing); result = true; } catch { result = false; } finally { if (workBook != null) { workBook.Close(true, missing, missing); workBook = null; } if (application != null) { application.Quit(); application = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } return result; } ////// 把PowerPoint文件转换成PDF格式文件 /// ///源文件路径 ///目标文件路径 ///true=转换成功 public bool PPTConvertToPDF(string sourcePath, string targetPath) { bool result; PowerPoint.PpSaveAsFileType targetFileType = PowerPoint.PpSaveAsFileType.ppSaveAsPDF; object missing = Type.Missing; PowerPoint.ApplicationClass application = null; PowerPoint.Presentation persentation = null; try { application = new PowerPoint.ApplicationClass(); persentation = application.Presentations.Open(sourcePath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse); persentation.SaveAs(targetPath, targetFileType, Microsoft.Office.Core.MsoTriState.msoTrue); result = true; } catch { result = false; } finally { if (persentation != null) { persentation.Close(); persentation = null; } if (application != null) { application.Quit(); application = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } return result; } }}
写法类后就是调用,格式为office2pdf.DOCConvertToPDF(sourcePath, targetPath)。
完成office2pdf的转换,就开始pdf2swf,利用swftools.
string fileName = ViewState["fileName"].ToString(); string cmdStr = HttpContext.Current.Server.MapPath("~/SWFTools/pdf2swf.exe"); string savePath = HttpContext.Current.Server.MapPath("~/WordManage/word/"); //string aa = DateTime.Now.ToString("yyyymmddhhmmss"); string sourcePath = @"""" + savePath + TextBox11.Text.ToString() + ".pdf" + @""""; string targetPath = @"""" + savePath + TextBox11.Text.ToString() + ".swf" + @""""; string argsStr = " -t " + sourcePath + " -s flashversion=9 -o " + targetPath; ExcutedCmd(cmdStr, argsStr);
这样上传完成后,我们会在根目录下找到如下图的文件,
最后结合Bootstrap的弹出层,可以做出如下图的效果,
不知道你感觉如何,反正我倒持了两天,感觉能出来这样的效果,我觉得可以交差了,呵呵。我是一个比较容易满足的人。最后谢谢我的导师每天问我吃喝拉撒的琐事儿,让她操心,亦师亦母啊!可令×××,唯有努力前进才能成为甄嬛,呵呵。(随后我会把项目独立出来把demo给大家上传)
demo下载地址:http://down.51cto.com/data/1052309