我们有一个应用程序,管理员可以在其中添加内容供其下属查看。他们的要求是它应该能够以不可编辑的方式显示Word,Excel,PowerPoint和PDF文档。
我发现这样做的一个选项是将内容加载到Web浏览器组件中。其缺点是它会提示用户打开/保存/取消。我们担心下属主要是计算机文盲,会以这种方式打开文件。
使用上述方法还意味着需要在将运行该应用程序的所有计算机上安装Microsoft Office和Adobe Acrobat(或其他支持IE的PDF查看器),这意味着需要支付昂贵的许可费用。
是否有更好的方法可以在C#中的表单上显示此内容?
答案 0 :(得分:3)
可能也很有趣:
使用Microsoft Office 2007将文档保存到XPS(或将其打印到XPS打印机)。
您可以使用XPS查看器组件显示只读XPS文档,也可以逐页显示为PNG或JPEG图像。使用.NET 3.5 / WPF可以很容易地实现这种渲染。
XpsDocument xpsDoc = new XpsDocument(xpsFileName, System.IO.FileAccess.Read);
FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();
const double scaleFactor = 0.8;
for (int pageNum = 0; pageNum < docSeq.DocumentPaginator.PageCount; pageNum++)
{
DocumentPage docPage = docSeq.DocumentPaginator.GetPage(pageNum);
// FIX: calling GetPage without calling UpdateLayout causes a memory leak
((FixedPage)docPage.Visual).UpdateLayout();
RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)Math.Round(scaleFactor * docPage.Size.Width),
(int)Math.Round(scaleFactor * docPage.Size.Height), (int)Math.Round(scaleFactor * 96), (int)Math.Round(scaleFactor * 96), PixelFormats.Default);
renderTarget.Render(docPage.Visual);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 75;
// Choose type here ie: JpegBitmapEncoder, etc
//BitmapEncoder encoder = new PngBitmapEncoder(); // Choose type here ie: JpegBitmapEncoder, etc
encoder.Frames.Add(BitmapFrame.Create(renderTarget));
string pageImageFileName = string.Format("{0}-{1}.jpg", Path.Combine(Path.GetDirectoryName(xpsFileName), Path.GetFileNameWithoutExtension(xpsFileName)), pageNum);
using (FileStream pageOutStream = new FileStream(pageImageFileName, FileMode.Create, FileAccess.Write))
{
encoder.Save(pageOutStream);
}
}
此代码需要引用PresentationCore,PresentationFramework和ReachFramework程序集。
编辑:上面的代码包含内存泄漏(请参阅Opening XPS document in .Net causes a memory leak)。已在示例中插入了变通方法。
答案 1 :(得分:1)
SpreadsheetGear for .NET有一个Excel Compatible Windows Forms control,它会显示您的Excel工作簿(如果您需要,它会比这更多)。如果您想试一试,可以see what people say和download免费试用。
如果您需要生成要在网页中显示的图像,SpreasheetGear也可以创建images from charts and ranges of cells。
答案 2 :(得分:0)
你看过Microsoft Word 9.0对象库了吗?可能无法像最初编写的那样显示数据,但是,您可以在这里做一些事情,如何在内存中打印作为临时pdf并显示它?
答案 3 :(得分:0)
所有这些都是特定于Windows的。
如果您希望在不依赖任何本地安装的情况下在客户端计算机上显示内容,则必须通过以下方式全面负责呈现:
Sumatra完全免费且开源。它不需要任何形式的安装,因此将它包含在您的应用程序中作为子文件夹中的二进制文件安装,然后直接向外显示以显示pdf将正常工作(pdf ID网络可访问,因此它就像执行<一样简单/ p>
SumatraPDF.exe {path-to-file}
如果无法通过网络访问,请将其在后台下载到临时位置,然后按上述方式执行。
Office文档有点棘手,因为它们都需要本地安装。这是一个(过时的)list请注意,许多下载链接会指向您推荐的最新版本。
另一种方法是使用OpenOffice.org的“便携式”版本,这样它就可以在不需要安装的情况下运行(所以你可以像苏门答腊方法一样将它放到适当的位置)但这有很多在你的情况下存在缺陷,因为它仍然需要安装java,所得到的fiels将是可编辑的(除非你对OpenOffice版本进行了更改,这可能很复杂)并且你可能无法获得非常好的显示。
如果您有任何能力在安装应用程序时运行任意程序,那么安装查看器可能是最好的,它们完全免费且可再发行。
如果您可以访问SharePoint,则可以尝试使用完全不同的方法,即通过Web应用程序完成所有操作。 sharepoint插件将允许直接在浏览器中托管文档视图。请注意,这几乎要求Internet Explorer完全可用。
答案 4 :(得分:0)
免责声明,我来自Atalasoft
如果要在任何类型的.NET GUI(Winforms,ASP.NET,Silverlight,WPF)中显示PDF,我们的DotImage PDF Reader add-on支持它。它不使用Adobe,也不需要在客户端机器或服务器上安装任何东西(只是我们的程序集)。