文档在线预览的实现
最近在研究企业文档管理,这个是基本上所有企业都需要的软件,当然也是有很多种解决方案。对于企业文档来说,最基本的需求就是独立存储,共享。这种需求只需要建立一个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.WdExportFormat?exportFormat=?Word.WdExportFormat.wdExportFormatPDF;??????paramMissing?=?Type.Missing;?????Word.Application?wordApplication?=??Word.Application();?????Word.Document?wordDocument?=?;??????????{??????????paramSourceDocPath?=?sourcePath;??????????paramExportFilePath?=?targetPath;????????Word.WdExportFormat?paramExportFormat?=?exportFormat;?????????Word.WdExportOptimizeFor?paramExportOptimizeFor?=?????????????????Word.WdExportOptimizeFor.wdExportOptimizeForPrint;?????????Word.WdExportRange?paramExportRange?=?Word.WdExportRange.wdExportAllDocument;??????????paramStartPage?=?;??????????paramEndPage?=?;?????????Word.WdExportItem?paramExportItem?=?Word.WdExportItem.wdExportDocumentContent;?????????Word.WdExportCreateBookmarks?paramCreateBookmarks?=?????????????????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.XlFixedFormatType?targetType=?Excel.XlFixedFormatType.xlTypePDF;?????Excel.Application?application?=?;?????Excel.Workbook?workBook?=?;??????????{?????????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.PpSaveAsFileType?targetFileType=?PowerPoint.PpSaveAsFileType.ppSaveAsPDF;?????PowerPoint.Application?application?=?;?????PowerPoint.Presentation?persentation?=?;??????????{?????????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);????????????Document?document?=??Document(PageSize.A4);???????????????????????{???????????????????????????????PdfWriter.GetInstance(document,??FileStream(targetPath,?FileMode.Create));???????????????????????????????document.Open();????????????????f?=?GetFont();???????????????????????????????document.Add(?Paragraph(text,?f));????????????}?????????????(Exception?ex)????????????{?????????????????;????????????}????????????????????????{?????????????????(document.IsOpen())???????????????????????????????????????document.Close();????????????}?????????????;????????}?????????Font?GetFont()????????{?????????????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);????????????}????????????BaseFont?bfChinese?=?BaseFont.CreateFont(fontPath,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);????????????Font?fontChinese?=??Font(bfChinese,?16f,?Font.NORMAL);?????????????fontChinese;????????}? 1.3 HTML转换pdfHTML中包含的元素较多,比较复杂,主要有两种方法,一种是调用浏览器的接口,让浏览器把HTML打印为PDF,另外就是ITextSharp提供了专门的XML/HTML转换组件:XML Worker,这个已经独立出来,不包含在ITextSharp中,需要单独下载。
???ConvertHtml2Pdf(?text,??pdfPath)?????????{?????????????Document?document?=??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,?);??????????????????????????????????(?element??elements)?????????????????{?????????????????????document.Add(element);?????????????????}????????????}??????????????(DocumentException?de)?????????????{?????????????????Console.Error.WriteLine(de.Message);?????????????}??????????????(IOException?ioe)?????????????{?????????????????Console.Error.WriteLine(ioe.Message);?????????????}?????????????document.Close();??????????????;?????????} 1.4添加水印以上都是转换成pdf的功能,在转换后,我们可以进一步使用ITextSharp对pdf进行加工,比较常见的添加水印功能。其实就是做一个淡淡的背景透明的图片,然后打开pdf文件,在每一页中画上水印图片即可。
???AddWatermark(?inputPath,??outputPath,??watermarkPath,???error)?{??????????{?????????PdfReader?pdfReader?=??PdfReader(inputPath);??????????numberOfPages?=?pdfReader.NumberOfPages;?????????FileStream?outputStream?=??FileStream(outputPath,?FileMode.Create);?????????PdfStamper?pdfStamper?=??PdfStamper(pdfReader,?outputStream);?????????PdfContentByte?waterMarkContent;????????iTextSharp.text.Image?image?=?iTextSharp.text.Image.GetInstance(watermarkPath);????????image.SetAbsolutePosition(,?);??????????(?i?=?;?i?<=?numberOfPages;?i++)?????????{?????????????waterMarkContent?=?pdfStamper.GetUnderContent(i);?????????????waterMarkContent.AddImage(image);?????????}?????????pdfStamper.Close();?????????pdfReader.Close();?????????outputStream.Close();??????????;?????}??????(Exception?ex)?????{?????????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-mvc – ASP.NET MVC – 与使用模型注释相比,使用自
- asp.net-mvc – 在mvc中的所有页面中维护查询字符串
- asp.net – 从虚拟机调试主机上的网站
- asp-classic – 无法在IIS 7.5上运行来自经典ASP脚本的exe
- 如何在ASP.Net中设置TextBox的默认按钮?
- 如何使用ASP.NET获取访问者位置(国家,州和城市)
- asp.net – 错误:SelectedValue无效,因为它在项目列表中不
- 给 asp.net core 写个中间件来记录接口耗时
- asp.net – 如何加速Visual Studio Webserver(Cassini)?
- asp.net – Web部署删除IIS网站自定义配置
- .net – 如何组织资源文件?
- 有没有办法以编程方式设置ASP.NET Universal Pro
- asp.net-mvc – 我可以从HttpContext获取控制器吗
- 什么可以导致ASP.NET工作进程被回收?
- asp.net-mvc-4 – 在ASP.NET MVC中包文件位置
- 实体框架 – EF6 DBContext动态连接字符串
- asp.net – Static WebMethod中的ResolveUrl
- asp.net-mvc-4 – 返回状态代码未经授权在WebAPI
- asp.net-mvc – asp.net mvc windows authentica
- asp.net – 用于.NET(asp mvc)的快速,简单和轻松