文档在线预览的实现
最近在研究企业文档管理,这个是基本上所有企业都需要的软件,当然也是有很多种解决方案。对于企业文档来说,最基本的需求就是独立存储,共享。这种需求只需要建立一个Windows共享文件夹或者架一个Samba服务器即可实现,无法做复杂的权限管理,统计等。另一种方案就是架一个Web应用,比如SharePoint,就可以实现。 既然是WEB应用,进一步的需求是能够在线查看文档,根据用户需求可能不允许下载,不允许打印文档。这一点微软的高级解决方案是使用RMS,能够设置每个用户的打开权限,是否打印等,要求必须是域内,而且只管理Office文件的权限,对txt,pdf就没办法了。另外一个解决方案是在线文档预览,用户在网页中查看文档内容,用户无需拿到原始文档,如果有权限的话,可以允许用户下载文档。这就就是百度文库,豆丁之类的网站的功能。下面来说说怎么实现。 1.文档统一转换为pdf这里的文档我们要看是什么格式,不同的格式有不同的转换方法。 1.1 Office文档转换pdf对于Office文档(Word,Excel,PowerPoint),那么可以调用Office提供的COM接口,把文档另存为PDF。这个要求服务器上必须安装Office,同时要注意权限,不然很容易导致在本地调试时可以转换为PDF,但是一旦部署到服务器上去就不行。另外还需要注意的是,如果Office转换pdf时发生异常,可能导致Office的进程驻留在服务器,不断驻留Office进程会导致服务器资源耗尽。 这是Office文档转换为pdf的代码: ConvertWord2Pdf(sourcePath,targetPath){result;Word.WdExportFormatexportFormat=Word.WdExportFormat.wdExportFormatPDF;paramMissing=Type.Missing;Word.ApplicationwordApplication=Word.Application();Word.DocumentwordDocument=;{paramSourceDocPath=sourcePath;paramExportFilePath=targetPath;Word.WdExportFormatparamExportFormat=exportFormat;Word.WdExportOptimizeForparamExportOptimizeFor=Word.WdExportOptimizeFor.wdExportOptimizeForPrint;Word.WdExportRangeparamExportRange=Word.WdExportRange.wdExportAllDocument;paramStartPage=;paramEndPage=;Word.WdExportItemparamExportItem=Word.WdExportItem.wdExportDocumentContent;Word.WdExportCreateBookmarksparamCreateBookmarks=Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks;wordDocument=wordApplication.Documents.Open(paramSourceDocPath,paramMissing,paramMissing,paramMissing);(wordDocument!=)wordDocument.ExportAsFixedFormat(paramExportFilePath,paramExportFormat,,paramExportOptimizeFor,paramExportRange,paramStartPage,paramEndPage,paramExportItem,,,paramCreateBookmarks,paramMissing);result=;}{(wordDocument!=){wordDocument.Close(paramMissing,paramMissing);wordDocument=;}(wordApplication!=){wordApplication.Quit(paramMissing,paramMissing);wordApplication=;}GC.Collect();GC.WaitForPendingFinalizers();GC.Collect();GC.WaitForPendingFinalizers();}result;}ConvertExcel2Pdf(sourcePath,targetPath){result;missing=Type.Missing;Excel.XlFixedFormatTypetargetType=Excel.XlFixedFormatType.xlTypePDF;Excel.Applicationapplication=;Excel.WorkbookworkBook=;{application=Excel.Application();target=targetPath;workBook=application.Workbooks.Open(sourcePath,missing,missing,missing);workBook.ExportAsFixedFormat(targetType,target,Excel.XlFixedFormatQuality.xlQualityStandard,missing);result=;}{result=;}{(workBook!=){workBook.Close(,missing);workBook=;}(application!=){application.Quit();application=;}GC.Collect();GC.WaitForPendingFinalizers();GC.Collect();GC.WaitForPendingFinalizers();}result;}ConvertPowerPoint2Pdf(sourcePath,targetPath){result;PowerPoint.PpSaveAsFileTypetargetFileType=PowerPoint.PpSaveAsFileType.ppSaveAsPDF;PowerPoint.Applicationapplication=;PowerPoint.Presentationpersentation=;{application=PowerPoint.Application();persentation=application.Presentations.Open(sourcePath,MsoTriState.msoTrue,MsoTriState.msoFalse,MsoTriState.msoFalse);persentation.SaveAs(targetPath,targetFileType,MsoTriState.msoTrue);result=;}{result=;}{(persentation!=){persentation.Close();persentation=;}(application!=){application.Quit();application=;}GC.Collect();GC.WaitForPendingFinalizers();GC.Collect();GC.WaitForPendingFinalizers();}result;}1.2 纯文本转换pdf如果是文本需要转换为PDF,我们可以使用iTextSharp这个组件,对于纯文本,注意的是源文件中没有设置字体之类的,需要在转换成PDF时指定字体,否则对于中文可能由于没有设置字体而转换不出来。 ConvertText2Pdf(sourcePath,targetPath){text=FileHelper.ReadTextFile(sourcePath);Documentdocument=Document(PageSize.A4);{PdfWriter.GetInstance(document,FileStream(targetPath,FileMode.Create));document.Open();f=GetFont();document.Add(Paragraph(text,f));}(Exceptionex){;}{(document.IsOpen())document.Close();};}FontGetFont(){fontPath=()ConfigurationManager.AppSettings[];(.IsNullOrEmpty(fontPath)){fontName=;(!FontFactory.IsRegistered(fontName)){fontPath=Environment.GetFolderPath(Environment.SpecialFolder.Windows)+;FontFactory.Register(fontPath);}FontFactory.GetFont(fontName,BaseFont.IDENTITY_H,BaseFont.EMBEDDED);}BaseFontbfChinese=BaseFont.CreateFont(fontPath,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);FontfontChinese=Font(bfChinese,16f,Font.NORMAL);fontChinese;}1.3 HTML转换pdfHTML中包含的元素较多,比较复杂,主要有两种方法,一种是调用浏览器的接口,让浏览器把HTML打印为PDF,另外就是ITextSharp提供了专门的XML/HTML转换组件:XML Worker,这个已经独立出来,不包含在ITextSharp中,需要单独下载。 ConvertHtml2Pdf(text,pdfPath){Documentdocument=Document(PageSize.A4);{PdfWriter.GetInstance(document,FileStream(pdfPath,FileMode.Create));document.Open();fontName=;(!FontFactory.IsRegistered(fontName)){fontPath=Environment.GetFolderPath(Environment.SpecialFolder.Windows)+;FontFactory.Register(fontPath);}elements=iTextSharp.tool.xml.XMLWorkerHelper.ParseToElementList(text,);(elementelements){document.Add(element);}}(DocumentExceptionde){Console.Error.WriteLine(de.Message);}(IOExceptionioe){Console.Error.WriteLine(ioe.Message);}document.Close();;}1.4添加水印以上都是转换成pdf的功能,在转换后,我们可以进一步使用ITextSharp对pdf进行加工,比较常见的添加水印功能。其实就是做一个淡淡的背景透明的图片,然后打开pdf文件,在每一页中画上水印图片即可。 AddWatermark(inputPath,outputPath,watermarkPath,error){{PdfReaderpdfReader=PdfReader(inputPath);numberOfPages=pdfReader.NumberOfPages;FileStreamoutputStream=FileStream(outputPath,FileMode.Create);PdfStamperpdfStamper=PdfStamper(pdfReader,outputStream);PdfContentBytewaterMarkContent;iTextSharp.text.Imageimage=iTextSharp.text.Image.GetInstance(watermarkPath);image.SetAbsolutePosition(,);(i=;i<=numberOfPages;i++){waterMarkContent=pdfStamper.GetUnderContent(i);waterMarkContent.AddImage(image);}pdfStamper.Close();pdfReader.Close();outputStream.Close();;}(Exceptionex){error=ex.StackTrace;;}}2.在线预览pdf文档前面已经统一转换为pdf文档,接下来就是对pdf的在线预览。这个在以前是不现实的,现在有了HTML5,只要浏览器支持HTML5就可以使用pdf.js库,将服务器上的pdf文件转换成HTML5代码展示在浏览器上。另外还有一个解决方案是使用Flash,需要把pdf文件进一步转换为swf文件,然后由Flash播放器来播放这个文档。可惜Flash已经是一个过时即将淘汰的技术了,像iPad,iPhone就不支持Flash,所以使用HTML5才是更明智的选择。 pdf.js网站已经提供了库和示例,浏览页面是,我们要打开我们转换的文件,只需要在URL中添加参数即可: /web/viewer.html?file=yourpdf.pdf 我们可以进一步修改viewer.html中的代码,根据需求去掉下载,打印等按钮,禁止用户下载和打印文件。 (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在ASP.NET RadioButtonList ListItem上设置CSS类
- 手动把asp.net的类生成dll文件的方法
- ASP.NET MVC AJAX文档在哪里?
- asp.net-mvc – 缩小ASP.NET MVC中的Action Filter属性
- iCalendar格式中关于RRule的解析和生成
- asp.net-mvc – ASP.Net [HiddenInput]数据属性在Razor中用
- asp.net – 将url参数添加到asp主题文件夹中的css文件中
- asp.net-mvc – asp.net MVC antiorgerytoken异常RedirectT
- asp.net中让Repeater和GridView支持DataPager分页
- asp.net-mvc – MVC“添加控制器”是“无法检索元数据…配置
- asp.net-mvc – 可以浏览DataAnnotations的自定义
- asp.net-mvc – 在EditorFor for child对象中使用
- asp.net-mvc – 应用程序服务层作为静态类
- asp.net-mvc – 使用Razor视图引擎 – 如何格式化
- asp.net-mvc-3 – 剃刀引擎 – 如何根据不同的条
- asp.net – IIS Web Garden中的Singleton对象
- 将ASP.NET身份与核心域模型分离 – 洋葱架构
- ASP.NET 根据汉字获取汉字拼音的首字母(含多音字
- asp.net-mvc-3 – MVC3视图继承不可能?
- asp.net – 在网站上放置广告的最佳做法?