C# 如何在windows窗体上显示office和/或pdf内容?

C# 如何在windows窗体上显示office和/或pdf内容?,c#,.net,excel,pdf,ms-word,C#,.net,Excel,Pdf,Ms Word,我们有一个应用程序,其中管理员成员可以添加内容供其下属查看。他们的要求是,它应该能够以不可编辑的方式显示Word、Excel、PowerPoint和PDF文档 我发现这样做的一个选择是将内容加载到web浏览器组件中。缺点是它会提示用户打开/保存/取消。我们担心的是,这些下属大多不懂计算机,因此很难以这种方式打开文件 使用上述方法还意味着需要在运行应用程序的所有计算机上安装Microsoft Office和Adobe Acrobat(或其他支持IE的PDF查看器),这意味着昂贵的许可费 有没有更好

我们有一个应用程序,其中管理员成员可以添加内容供其下属查看。他们的要求是,它应该能够以不可编辑的方式显示Word、Excel、PowerPoint和PDF文档

我发现这样做的一个选择是将内容加载到web浏览器组件中。缺点是它会提示用户打开/保存/取消。我们担心的是,这些下属大多不懂计算机,因此很难以这种方式打开文件

使用上述方法还意味着需要在运行应用程序的所有计算机上安装Microsoft Office和Adobe Acrobat(或其他支持IE的PDF查看器),这意味着昂贵的许可费


有没有更好的方法让这些内容以C#的形式显示在我的表单上?

您看过Microsoft Word 9.0对象库吗?可能无法按照最初编写的方式显示数据,但是,您可以在这里执行evul操作,如何在内存中打印为临时pdf并显示


所有这些都是windows特有的

如果希望在不依赖任何本地安装的情况下在客户端计算机上显示某些内容,则必须通过以下方式对呈现负全部责任:

  • 提供一些在客户端运行的非侵入性库,并知道如何呈现它
  • 使用“适当的”工具/库在服务器上将其呈现为内存中的映像,并将该映像发送到客户端。服务器速度慢,计算成本高,无法为客户端提供“类似文档”的界面
  • 是完全免费和开源的。它不需要任何形式的安装,因此将其作为二进制文件包含在应用程序安装的子文件夹中,然后直接将其剥离到该子文件夹以显示pdf将很好地工作(或者pdf ID网络可访问,因此它与执行一样简单)

    SumatraPDF.exe {path-to-file}
    
    如果无法通过网络访问,请在后台将其下载到临时位置,然后如上所述执行

    Office文档有点棘手,因为它们都需要本地安装。这里有一个(过时的)注意事项,许多指向下载的链接将指向推荐的最新版本

    另一种方法是在OpenOffice.org的“可移植”版本中使用OpenOffice.org,这将允许它在不需要安装的情况下运行(因此您可以像苏门答腊方法一样将其放置在适当的位置)。然而,在您的情况下,这有很多缺陷,因为它仍然需要安装java,因此产生的文件将是可编辑的(除非您对OpenOffice版本进行了更改,这可能很复杂),否则您可能无法获得非常好的显示效果

    如果你有能力在安装应用程序时运行任意程序,那么安装查看器可能是最好的选择,它们是完全免费的,可以再发行

    如果您有权访问SharePoint,您可以尝试一种完全不同的方法,即通过web应用程序完成所有操作。SharePoint插件将允许在浏览器中直接托管文档上的视图。请注意,这几乎要求Internet Explorer完全可用。

    有一个可显示Excel工作簿的(如果你愿意,它可以做的远不止这些。)如果你想试试,你可以免费试用


    如果需要生成要在网页中显示的图像,SpreasheetGear也可以创建。

    可能也很有趣:

    使用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);
        }
    }
    
    XpsDocument xpsDoc=新的XpsDocument(xpsFileName,System.IO.FileAccess.Read);
    FixedDocumentSequence docSeq=xpsDoc.GetFixedDocumentSequence();
    常数双尺度因子=0.8;
    对于(int pageNum=0;pageNum
    此代码需要引用PresentationCore、PresentationFramework和Reach框架程序集


    编辑:上面的代码包含内存泄漏(请参阅)。解决方法已插入示例中。

    免责声明,我来自Atalasoft


    如果您想在任何类型的.NET GUI(Winforms、ASP.NET、Silverlight、WPF)中显示PDF,我们的支持。它不使用Adobe,也不需要在客户端计算机或服务器上安装任何东西(只需要我们的程序集).

    使用此方法显示PDF时,必须在系统上安装Adobe Acrobat。Adobe Acrobat是免费的,您可以将其与软件捆绑在一起