2014-01-20 99 views
2

我試圖在WPF應用程序中嵌入/顯示PDF。到目前爲止,我已經嘗試了這些解決方案,都沒有成功:將PDF嵌入WPF應用程序

  1. 顯示PDF在WindowsFormsHost主辦的AxAcroPdf 控制,類似於什麼是顯示here。問題是我的應用程序設置AllowsTransparency = True以創建類似於Modern UI的樣式,但 與WindowsFormsHost(控件 變得不可見)混合不好。

  2. WebBrowser控件中顯示PDF。問題是一樣的。

  3. 設置AllowsTransparency = False,但這會在應用程序中引起緩慢的感覺。由於我使用WPF來提高我們的業務應用程序的外觀和感覺以最終用戶的利益,因此這不是一個解決方案。

  4. 使用帶有AllowsTransparency = False第二個窗口中顯示WindowsFormsHost,並攻擊它,使它看起來像在主窗口的子控件,因爲它描述here。但是,自從使用MVVM以來,我不喜歡代碼隱藏方法。

  5. 查找WPF的本機PDF控件。但是,我只找到了一些商業的商品,現在還不是一種選擇。

我所需要的是能夠:

  • 在WPF應用程序顯示一個PDF或它的表示(即,圖像或轉換爲另一種格式)。
  • 保持我的風格在視覺上完好無損和流暢(AllowsTransparency必須保持True)。
  • 使用尊重MVVM原則的方法(最好不要代碼隱藏)。
  • 免費將其包含在我的應用程序中(用於商業用途)。

我完全開放的手工製作的解決方案,開源庫,甚至完全不同的方法。

+0

這被擱置爲基礎的意見,但我」 m的要求實際上是一個衆所周知的WPF * bug *的解決方法。我相信,這個問題可以通過「事實,參考或具體的專業知識」來解答。事實上,已經有一個符合這個描述的答案。這是我要求一個「強大或已證實的方法」嗎? –

回答

3

如果您對開源解決方案開放,我會推薦GhostScript。您可以將PDF(質量很好,大多數情況下)轉換爲您想要使用的任何格式的單個圖像文件。

另一個選擇是使用pdf2htmlEX將PDF轉換爲HTML,但它目前僅針對Linux進行編譯。

我在Linux和Windows上的幾個應用程序中都使用了上述兩種解決方案。 HTML方式的優點是可以複製和粘貼文本。 GhostScript方式的優點是圖像可能更便攜(更小)。

與任何開源解決方案一樣,您需要了解每種產品發佈的許可條款以及這些條款可能會如何影響您的最終結果。

+3

這裏是用於.NET的Ghostscript包裝器:http://ghostscriptnet.codeplex.com – HABJAN

+1

我使用了[GhostScriptSharp](http://www.nuget.org/packages/GhostScriptSharp/)並將它包裝在一個方便的小WPF控制我可以綁定PDF的文件路徑。它會自動從PDF生成png文件,並將它們顯示在ScrollViewer內的Image的'ListBox'中。雖然在png世代期間性能並不是最佳的,但它仍然有效,並保持我的UI流暢性和代碼清潔。獎金:這個解決方案減少了與調整/重繪'WindowsFormsHost'有關的視覺毛刺。 –

4

我有這個兩個解:

  1. 打開.pdf文件,然後打印作爲.XPS(你也必須能夠對代碼doint這一點),那麼這個文件就可以embded這個將文件顯示在您的應用中,並將其顯示爲xps文檔。看到這個:Documents in WPF - MSDN - Microsoft (XPS)

  2. 要使用免費的圖書館,我不是很確定,如果這允許顯示PDF,但它產生它們,你可以看看EO-Pdf

希望這個提示有助於解決問題。

1

有一個很好的解決方案,我以前使用的是使用CefSharp。這是支持預覽PDF文檔的Chrome瀏覽器引擎。 訪問quick start page

如果您有問題,建議您訪問Troubleshooting page以設置適當的設置。

如果你想顯示在您的本地驅動器的PDF文件,你也應該使用這些設置爲瀏覽器,然後使用file:///協議:

CefSharp.BrowserSettings browserSettings = new CefSharp.BrowserSettings(); 
browserSettings.FileAccessFromFileUrls = CefSharp.CefState.Enabled; 
browserSettings.UniversalAccessFromFileUrls = CefSharp.CefState.Enabled; 
browserSettings.TextAreaResize = CefSharp.CefState.Enabled; 
my_bowser.BrowserSettings = browserSettings;