文档在线预览软件项目解决方案文档哪家好?

最近在研究企业文档管理,这个是基本上所有企业都需要的软件,当然也是有很多种解决方案。对于企业文档来说,最基本的需求就是独立存储,共享。这种需求只需要建立一个Windows共享文件夹或者架一个Samba服务器即可实现,无法做复杂的权限管理,统计等。
最近在研究企业文档管理,这个是基本上所有企业都需要的软件,当然也是有很多种解决方案。对于企业文档来说,最基本的需求就是独立存储,共享。这种需求只需要建立一个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的代码:
/// &summary& /// 将word文档转换成PDF格式 /// &/summary& /// &param name="sourcePath"&&/param& /// &param name="targetPath"&&/param& /// &returns&&/returns& public static bool ConvertWord2Pdf(string sourcePath, string targetPath)
Word.WdExportFormat exportFormat= Word.WdExportFormat.wdExportFormatPDF;
object paramMissing = Type.M
Word.Application wordApplication = new Word.Application();
Word.Document wordDocument = null;
object paramSourceDocPath = sourceP
string paramExportFilePath = targetP
Word.WdExportFormat paramExportFormat = exportF
Word.WdExportOptimizeFor paramExportOptimizeFor =
Word.WdExportOptimizeFor.wdExportOptimizeForP
Word.WdExportRange paramExportRange = Word.WdExportRange.wdExportAllD
int paramStartPage = 0;
int paramEndPage = 0;
Word.WdExportItem paramExportItem = Word.WdExportItem.wdExportDocumentC
Word.WdExportCreateBookmarks paramCreateBookmarks =
Word.WdExportCreateBookmarks.wdExportCreateWordB
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, false,
paramExportOptimizeFor, paramExportRange, paramStartPage,
paramEndPage, paramExportItem, true,
true, paramCreateBookmarks, true,
true, false,
ref paramMissing);
result = true;
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();
}/// &summary& /// 将excel文档转换成PDF格式 /// &/summary& /// &param name="sourcePath"&&/param& /// &param name="targetPath"&&/param& /// &returns&&/returns& public static bool ConvertExcel2Pdf(string sourcePath, string targetPath)
object missing = Type.M
Excel.XlFixedFormatType targetType= Excel.XlFixedFormatType.xlTypePDF;
Excel.Application application = null;
Excel.Workbook workBook = null;
application = new Excel.Application();
object target = targetP
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;
result = false;
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();
}/// &summary& /// 将ppt文档转换成PDF格式 /// &/summary& /// &param name="sourcePath"&&/param& /// &param name="targetPath"&&/param& /// &returns&&/returns& public static bool ConvertPowerPoint2Pdf(string sourcePath, string targetPath)
PowerPoint.PpSaveAsFileType targetFileType= PowerPoint.PpSaveAsFileType.ppSaveAsPDF;
PowerPoint.Application application = null;
PowerPoint.Presentation persentation = null;
application = new PowerPoint.Application();
persentation = application.Presentations.Open(sourcePath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);
persentation.SaveAs(targetPath, targetFileType, MsoTriState.msoTrue);
result = true;
result = false;
if (persentation != null)
persentation.Close();
persentation = null;
if (application != null)
application.Quit();
application = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
1.2 纯文本转换pdf
如果是文本需要转换为PDF,我们可以使用iTextSharp这个组件,对于纯文本,注意的是源文件中没有设置字体之类的,需要在转换成PDF时指定字体,否则对于中文可能由于没有设置字体而转换不出来。
/// &summary&
/// 将Txt转换为PDF
/// &/summary&
/// &param name="sourcePath"&&/param&
/// &param name="targetPath"&&/param&
/// &returns&&/returns&
public static bool ConvertText2Pdf(string sourcePath, string targetPath)
var text = FileHelper.ReadTextFile(sourcePath);
Document document = new Document(PageSize.A4);
//step 2:创建一个writer用于监听Document以及通过PDF-stream指向一个文件
PdfWriter.GetInstance(document, new FileStream(targetPath, FileMode.Create));
// step 3: 打开document
document.Open();
var f = GetFont();
// step 4: 添加一段话到document中
document.Add(new Paragraph(text, f));
catch (Exception ex)
return false;
if (document.IsOpen())
// step 5: 关闭document
document.Close();
return true;
private static Font GetFont()
var fontPath = (string) ConfigurationManager.AppSettings["FontPath"];
if (string.IsNullOrEmpty(fontPath))//没有指定字体就用楷体
var fontName = "楷体";
if (!FontFactory.IsRegistered(fontName))
fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Fonts\simkai.ttf";
FontFactory.Register(fontPath);
return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
BaseFont bfChinese = BaseFont.CreateFont(fontPath,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 16f, Font.NORMAL);
return fontC
1.3 HTML转换pdf
HTML中包含的元素较多,比较复杂,主要有两种方法,一种是调用浏览器的接口,让浏览器把HTML打印为PDF,另外就是ITextSharp提供了专门的XML/HTML转换组件:XML Worker,这个已经独立出来,不包含在ITextSharp中,需要单独下载。
public static bool ConvertHtml2Pdf(string text, string pdfPath)
Document document = new Document(PageSize.A4);
PdfWriter.GetInstance(document, new FileStream(pdfPath, FileMode.Create));
document.Open();
var fontName = "楷体";
if (!FontFactory.IsRegistered(fontName))
var fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Fonts\simkai.ttf";
FontFactory.Register(fontPath);
var elements = iTextSharp.tool.xml.XMLWorkerHelper.ParseToElementList(text, @"body {
font-size: 16
color: #F00;
font-family: 楷体;
//iTextSharp.text.
foreach (var element in elements)
document.Add(element);
catch (DocumentException de)
Console.Error.WriteLine(de.Message);
catch (IOException ioe)
Console.Error.WriteLine(ioe.Message);
document.Close();
return true;
1.4添加水印
以上都是转换成pdf的功能,在转换后,我们可以进一步使用ITextSharp对pdf进行加工,比较常见的添加水印功能。其实就是做一个淡淡的背景透明的图片,然后打开pdf文件,在每一页中画上水印图片即可。
/// &summary& /// 添加水印 /// &/summary& /// &param name="inputPath"&源PDF文件路径&/param& /// &param name="outputPath"&加水印后的PDF路径&/param& /// &param name="watermarkPath"&水印图片的路径&/param& /// &param name="error"&&/param& /// &returns&&/returns& public static bool AddWatermark(string inputPath, string outputPath, string watermarkPath, ref string error)
PdfReader pdfReader = new PdfReader(inputPath);
int numberOfPages = pdfReader.NumberOfP
FileStream outputStream = new FileStream(outputPath, FileMode.Create);
PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream);
PdfContentByte waterMarkC
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(watermarkPath);
image.SetAbsolutePosition(10, 10);
for (int i = 1; i &= numberOfP i++)
waterMarkContent = pdfStamper.GetUnderContent(i);
waterMarkContent.AddImage(image);
pdfStamper.Close();
pdfReader.Close();
outputStream.Close();
return true;
catch (Exception ex)
error = ex.StackT
return false;
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中的代码,根据需求去掉下载,打印等按钮,禁止用户下载和打印文件。
用云栖社区APP,舒服~
【云栖快讯】支撑千亿营收,阿里如何做研发?淘宝如何做敏捷实践?如何面对开发中的“黑天鹅”事件?6月29日首届阿里研发效能嘉年华,独家直播,赶紧预约吧!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
2017杭州云栖大会火热抢票
Loading...2238人阅读
其他skill(2)
以下大部分内容我只是转载了一下,免得原作者删除后没得看了,最后面我加了一些转载的原文里缺少的内容!
最近在做项目时,要在手机端实现在线文档预览的功能。于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览。这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫。只能考虑其它方案,这时微软的office web apps方案映入眼帘,于是和同事一起用一台PC机折腾了几天终于完成了部署,希望通过本篇记录下安装过程和遇到的坑。目前使用该方案的有&,我部署的服务地址:&下面是在线预览的效果图。
  使用该方案的好处:
  1.现有代码改动量很小,几乎可以忽略不计。
  2.无需自己写代码,只需一台服务器即可
  3.支持文档类型很全面,doc,ppt,xls,docx,pptx,xlsx,pdf。
  4.手机和pc都支持,支持文档缓存,分页浏览。
安装部署步骤
  介绍完特性以后,下面介绍服务的安装部署。个人感觉初次部署可能会觉得比较困难,因为这个服务限制还是很多的。
服务器环境要求
  1.转换文档需要两台服务器,一台为转换server,另外一台为域控server。(安装office web apps的服务器必须加域才能安装成功,如果没有加域后面步骤会出现错误,疑难问题里面会介绍)
  2.系统要求为widow serverbit或者以上,NET Framework 4.5,KB2592525,Windows PowerShell 3.0,IIS,保证80 443 809端口不被占用,确保当前机器没有安装office,确保当前机器没有安装Exchange,sharepoint,lync server,sql server
  3.服务器带宽和内存越高越好,测试发现比较耗性能,原因得从服务的实现原理上讲起。office web apps服务会通过用户提供的文档src,从src服务器上把文档下载下来,然后进行转换,根据文档名称进行缓存,转换完成以后返回。 带宽越大下载过程使用的时间越短,服务器性能越好转换速度越快。
  域控服务器安装这里就不介绍了,有需要的可以参考这篇文章。
  1.本文安装步骤所需的软件我都放在百度云盘了,可以进行下载。下载地址:
  下面的安装步骤很重要,不按顺序安装可能出现未知错误,很难解决,所以建议按照下面步骤进行安装。
  1.安装.net framework4.5
  2.安装iis7
  打开服务器管理,添加角色
这里说明一点,把这些功能全部都勾上,后面运行命令的时候会用到。
 3.安装补丁
  Windows Server
Edition 更新程序 (KB2592525)_Windows6.1-KB.msu
 4.安装powershell
  Windows6.1-KB.msu
 5.安装墨迹支持
  服务器管理,添加功能
  6.安装office web apps
  官网下载URL:
& & 7.安装office web apps语言包
  wacserverlanguagepack.exe
  8.安装office web apps sp1补丁包
  9.通过PowerShell配置Office web apps
  这个步骤是最容易出错的,记得要使用域账户右键管理员方式运行
Import-Module OfficeWebApps
New-OfficeWebAppsFarm -InternalURL
-ExternalURL
-AllowHttp -EditingEnabled -OpenFromUrlEnabled
&New-OfficeWebAppsFarm 的使用及各参数含义可以去微软官网查看:
-InternalURL:内网浏览地址, 其中 xx表示计算机名
-ExternalURL:外网浏览地址
-AllowHttp 允许80端口访问
-OpenFromUrlEnabled 允许通过url方式进行预览
-CacheLocation& 缓存文件存放路径 默认是C:\ProgramData\Microsoft\OfficeWebApps\Working\d&
-CacheSizeInGB& 最大缓存文件大小 单位GB 默认为15GB
关于-InternalURL的怎么设置,可以计算机右键-》属性进行查看& 计算机全名则是需要的地址
执行完命令就可以在iis中查看了,可以看到自动添加了两个站点,通过上面的地址 进行浏览,出现下面的界面则表示整个安装完成了。
使用过程中如果想修改服务配置,可以通过Set-OfficeWebAppsFarm命令进行修改
Set-OfficeWebAppsFarm -AllowHttp
&我这边装完以后通过花生壳映射了一个外网地址,大家可以访问预览(网络可能不稳定)。
&&&&安装完成office web apps以后,你可以采用以下方式实现在线预览。
//在线预览服务地址
var strOfficeApps=&&;
//文档地址,需要外网能访问
var strFileUrl=&http://74881.vhost65.cloudvhost.net/doc/test.docx&;
var strUrl =strOfficeApps+&/op/embed.aspx/src=&+encodeURIComponent(strFileUrl);
  这样生成的地址即可以在浏览器中预览了,你可以把这个地址嵌入到iframe中进行使用
&iframe src='strUrl' width='476px' height='288px' frameborder='0'&This is an embedded &a target='_blank' href=''&Microsoft Office&/a& document, powered by &a target='_blank' href='/webapps'&Office Web Apps&/a&.&/iframe&
服务器部署疑难问题
&&&&下面列举一下安装部署过程中出现的几个问题及解决办法
  1.New-OfficeWebAppsFarm : 登录失败: 未知的用户名或错误密码
PS C:\Users\Administrator& New-OfficeWebAppsFarm -InternalURL &http://xxxx& -AllowHttp -EditingEnabled
New-OfficeWebAppsFarm : 登录失败: 未知的用户名或错误密码。
所在位置 行:<span style="color:# 字符: <span style="color:#
&#43; New-OfficeWebAppsFarm -InternalURL &http://xxxx& -AllowHttp -EditingE ...
&#43; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&#43; CategoryInfo
: NotSpecified: (:) [New-OfficeWebAppsFarm], AuthenticationException
&#43; FullyQualifiedErrorId : System.Security.Authentication.AuthenticationException,Microsoft.Office.Web.Apps.Adminis
tration.NewFarmCommand
如果碰到这种问题,可能是使用的本地账户登录的,需要切换到域账户下面操作。
 2.HTTP 错误 500.21
http://xxxx/hosting/discovery
HTTP 错误 <span style="color:#0.21 - Internal Server Error
处理程序“DiscoveryService”在其模块列表中有一个错误模块“ManagedPipelineHandler”
出现这种错误是第一步安装的.net framework4.5未在iis中注册导致的,以管理员方式打开cmd,运行以下命令
cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
.\aspnet_regiis.exe
Microsoft (R) ASP.NET RegIIS 版本 <span style="color:#.0.<span style="color:#319.17929
用于在本地计算机上安装和卸载 ASP.NET 的管理实用工具。
版权所有(C) Microsoft Corporation。保留所有权利。
开始安装 ASP.NET (<span style="color:#.0.<span style="color:#319.17929)。
.............
ASP.NET (<span style="color:#.0.<span style="color:#319.17929)安装完毕。
iisreset /restart /noforce
正在尝试停止...
Internet 服务已成功停止
正在尝试启动...
Internet 服务已成功启动
&3.文件太大解决方案(&10M)
&服务默认支持的最大文件大小是10M,大于10M会报错。可以通过以下步骤解决此问题
<span style="color:#.打开如图文件Settings_Service.ini,文件目录为C:\Program Files\Microsoft Office Web Apps\OpenFromUrlHost
; --- OpenFromUrlHost ---
; The application root for the current application
ApplicationRoot=(System.String)/oh
在默认内容后添加(4M,可以根据自己的需求设定)
OpenFromUrlMaxFileSizeInKBytes=(System.Int32)512000;
2.修改 C:\Program Files\Microsoft Office Web Apps\OpenFromUrlWeb 下的Settings_Service.ini,进行相同的修改
3.重启office web apps服务
再重新试一下&10M的文件,发现可以访问了
&4.文档地址为ip不是域名的预览报错解决方案
& 比如文档地址为http://10.5.192.168/A.docx 这个时候预览会报错 ,而相应的地址为/A.docx 域名的则是好的。这个问题估计是微软自己的安全验证问题,为了解决此问题我采取了一种地址转发的方式。
& 步骤:在Http80站点下添加转发应用程序,站点文件路径一定要选在C:\Windows\System32\drivers\etc 下,并且赋予读写权限,为了方便修改hosts文件
&& 正常预览访问的是:/op/embed.aspx/src=文档地址,现在改为/Redirect/embed.aspx/src=文档地址
代码会判断如果是ip则在hosts添加ip和域名的映射关系
Redirect站点代码下载地址:
  整个方案不需要自己额外写代码,麻烦的地方在于安装部署,出现错误很难排查,主要还是因为资料少。所以建议安装到office web apps步骤时,用ghost工具备份一下系统,以免出错从头开始安装。
  如果你在安装过程中遇到奇怪的错误并且解决了,希望可以告诉我一下,以供我补充完善疑难问题这一项。目前该方案已经在购买服务器实施的过程中,有需要实现在线文档预览的可以考虑使用。
------------------转载的内容到此为止---------------------------
1、转载的文章里给出的域服务器的安装是windows server 2012的不是2008 R2,windows server 2008 R2的域环境搭建可看文档:/link?url=txQfvoQM8fUNtjA7MjedBJ02Qp1MnamZp1A951oaX5zy551dcmVjvZaX-GB6WaiVIZrhuwNdQUkEREVuVqacxBcd6-h4Mzigsbbw7BYl0mW
2、在安装的过程中我还遇到里一个问题,就是在执行
New-OfficeWebAppsFarm -InternalURL
-ExternalURL
-AllowHttp -EditingEnabled -OpenFromUrlEnabled
时出现“Windows&身份验证”Windows&服务器功能必须安装并启用。这个是因为在安装IIS时没有安装Windows身份验证,需删除IIS后重新安装,
并把Windows身份验证的勾打上即可。
3、安装都完成后,我在预览时报错:很抱歉,由于某种原因不能为你打开。如下:
这是因为文档的url没有使用域名(一定要域名,不能是ip地址)。
例如我在转换server上通过ISS管理器(开始-&管理工具-&Internet 信息服务(ISS)管理器),新建了一个file,指向本地的一个文件夹,文件夹里
放了待展示的office文档。
然后就可以用转换server的计算机全名作为域名写成文档的url了:
点击CreateLink后,再点击test this link即可进行在线预览:
下面在看一个excel预览效果:
不得不说,Office Web Apps的预览效果的确不错。
4、文档的地址必须采用域名形式的,这个目前改不了,那转换服务器为什么也一定要使用域名,能不能使用ip?
答案当然是可以的,否则岂不是每个客户端都要在本机的hosts文件里配置转换服务器的ip和对于域名,或者使用花生壳做映射,才能访问转换服务器?
显然这两种解决方式都不好,所以必须得让客户能直接敲ip访问转换服务器,而之前之所以只能用域名,是因为在执行
New-OfficeWebAppsFarm -InternalURL http://yl. -ExternalURL http://yl. &-AllowHttp -EditingEnabled -OpenFromUrlEnabled
时,把内网访问地址(InternalURL)和外围访问地址(ExternalURL)都设置成了域名形式的,现在想使用ip来访问,就重新设置一下即可:
Set-OfficeWebAppsFarm -InternalURL http://192.168.206.131 &-ExternalURL http://192.168.206.131 &-AllowHttp -EditingEnabled -OpenFromUrlEnabled
这样就可以使用ip访问OWA预览服务了,例如这是我的一个预览地址:
http://192.168.206.131/op/view.aspx?src=http%3A%2F%
%2Fupload%2Ffile%2Fpublic%2FF%E9%95%BF%E8%80%85%E4
%BF%A1%E6%81%AF%E7%BB%9F%E8%AE%A1%E8%A1%A2170.xls
可以看到地址开头可以使用ip了,而src=XXX后面的就是文档的地址,这个还是得使用域名形式的。
但注意,这样设置之后,就不能使用域名访问转换服务器了,只能使用ip了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:40030次
排名:千里之外
原创:26篇
评论:25条
(1)(2)(4)(1)(4)(2)(1)(5)(2)(12)

我要回帖

更多关于 文档在线预览解决方案 的文章

 

随机推荐