2009-01-29 37 views
5

我們有一個應用程序,管理員可以在其中添加內容供其下屬查看。他們的要求是它應該能夠以不可編輯的方式顯示Word,Excel,PowerPoint和PDF文檔。如何在Windows窗體上顯示辦公室和/或pdf內容?

我發現這樣做的一個選項是將內容加載到Web瀏覽器組件中。缺點是它會提示用戶打開/保存/取消。我們擔心,下屬大多是計算機文盲,將無法以這種方式打開文件。

使用上述方法還意味着需要在將運行應用程序的所有機器上安裝Microsoft Office和Adobe Acrobat(或其他支持IE的PDF查看器),這意味着需要昂貴的許可費用。

有沒有更好的方式讓這個內容顯示在我的窗體上在C#中?

+0

Adob​​e Reader和Foxit PDF閱讀器都是免費的PDF閱讀器(無許可費用) – 2009-01-31 01:02:04

回答

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)。該示例中已插入解決方法。

0

你看過Microsoft Word 9.0對象庫嗎?可能不可能只顯示最初編寫的數據,但是,您可以在這裏做些什麼,如何在內存中打印臨時PDF並顯示它?

This is how you display a PDF with C#

+0

使用此方法顯示PDF時,必須在系統上安裝Adobe Acrobat。 – 2009-01-29 08:22:02

+0

Adob​​e Acrobat是免費的,您可以將其與您的軟件捆綁在一起,並且可能是來自Adobe的SDK,因此您不需要。我看不出真正的問題,沒有許可費用。 – 2009-01-29 09:30:14

+1

這需要Adobe Acrobat,而不是Adobe Acrobat Reader。讀者是免費的,但Acrobat帶來相當高的費用。 據我所知,使用Word對象庫需要將Office安裝在機器上。 – RichieACC 2009-03-03 09:24:09

0

這一切是Windows具體。

如果你希望不依賴於任何地方安裝,然後顯示在客戶機上的東西,你必須承擔渲染無論是總的責任:

  1. 供應某種,在客戶端運行非侵入性的圖書館並知道如何渲染它
  2. 使用'正確的'工具/庫在服務器上將其渲染到內存映像中,並將該映像發送到客戶端。在您的服務器上運行速度慢,計算量非常大,並且不會爲您的客戶提供「文檔」界面。

Sumatra是完全免費開源的。它不需要任何形式的安裝,因此將其包含在您的應用程序中作爲二進制文件安裝在子文件夾中,然後直接將其轉換爲顯示PDF的文件將可以正常工作(可以訪問pdf IDES網絡,因此它可以像執行

一樣簡單
SumatraPDF.exe {path-to-file} 

如果不能從網絡訪問下載它在後臺到一個臨時位置,然後如上執行。

Office文檔更棘手,因爲它們都需要本地安裝位。這裏有一個(出的日期)list請注意,許多下載鏈接將指向您推薦的最新版本。

另一種方法是使用OpenOffice.org中的'便攜式'化身,這將允許它在無需安裝的情況下運行(因此您可以像蘇門答臘方法那樣將它放置到位),但這種方式有很多因爲它仍然需要安裝java,所以結果將會是可編輯的(除非您對OpenOffice版本進行了修改,這可能會非常複雜),並且您可能無法獲得非常好的顯示效果。

如果您有任何安裝應用程序時運行任意程序的能力,安裝查看器可能是最好的,它們完全免費且可再發行。

如果您有權訪問SharePoint,則可以嘗試一種完全不同的方法,即通過Web應用程序完成所有操作。 Sharepoint插件將允許直接在瀏覽器中託管文檔的視圖。請注意,這非常需要Internet Explorer儘可能完全可用。

+0

雖然可行,但這些選項都需要第三方應用程序才能打開單獨的窗口。要求是將其與應用程序上的其他元素一起顯示。 – RichieACC 2009-01-29 11:25:48

0

聲明,我從Atalasoft

是如果你想在任何類型的.NET GUI(的WinForms,ASP.NET,Silverlight的,WPF)來顯示PDF,我們DotImagePDF Reader add-on支持它。它不使用Adobe,也不需要在客戶機或服務器上安裝任何東西(只是我們的程序集)。