最近在研究企业文档管理,这个是基本上所有企业都需要的软件,当然也是有很多种解决方案。对于企业文档来说,最基本的需求就是独立存储,共享。这种需求只需要建立一个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转换pdf

HTML中包含的元素较多,比较复杂,主要有两种方法,一种是调用浏览器的接口,让浏览器把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中的代码,根据需求去掉下载,打印等按钮,禁止用户下载和打印文件。

dawei

【声明】:唐山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。