代码之家  ›  专栏  ›  技术社区  ›  Richard C

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

  •  5
  • Richard C  · 技术社区  · 16 年前

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

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

    5 回复  |  直到 12 年前
        1
  •  3
  •   Community paulsm4    7 年前

    使用Microsoft Office 2007将文档保存到XPS(或打印到XPS打印机)。

    可以使用XPS查看器组件显示只读XPS文档,也可以逐页渲染为PNG或JPEG图像。使用.NET3.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);
        }
    }
    

    编辑:上面的代码包含内存泄漏(请参阅 Opening XPS document in .Net causes a memory leak

        3
  •  0
  •   Filip Ekberg    16 年前

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

    This is how you display a PDF with C#

        4
  •  0
  •   ShuggyCoUk    16 年前

    所有这些都是windows特有的。

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

    1. 提供一些在客户端运行的非侵入性库,并知道如何呈现它
    2. 使用“适当的”工具/库在服务器上将其呈现为内存中的映像,并将该映像发送到客户端。服务器速度慢,计算成本高,无法为客户端提供“类似文档”的界面。

    Sumatra 是完全免费和开源的。它不需要任何形式的安装,因此将其作为二进制文件包含在应用程序安装的子文件夹中,然后直接将其剥离到该子文件夹以显示pdf将很好地工作(或者pdf ID网络可访问,因此它与执行一样简单)

    SumatraPDF.exe {path-to-file}
    

    Office文档有点棘手,因为它们都需要本地安装。这是一个(过时的) list

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

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

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

        5
  •  0
  •   Lou Franco    14 年前

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