2009-02-06 58 views
39

我想用C#以圖形方式加載和繪製pdf文件。我不需要編輯它們或任何東西,只需將它們渲染到給定的縮放級別即可。如何使用C呈現pdfs#

我發現的pdf庫似乎專注於一代。我該怎麼做呢?

謝謝。

回答

43

如果Adobe ActiveX不是您要查找的內容(因爲Acrobat必須存在於用戶機器上,並且您無法自己發貨),還有其他幾種選擇。

對於創建PDF預覽,先看看StackOverflow上關於這個問題的其他一些討論:

在最後兩篇我談了你幾件事可以試試:

  • 你可以得到一個商業渲染器(PDFViewForNetPDFRasterizer.NETABCPDFActivePDFXpdfRasterizer和其他人在其他的答案...)。
    雖然大多數都相當昂貴,尤其是如果你所關心的是製作簡單的預覽/縮略圖。

  • 除了奧馬爾Shahine的代碼片段,有一個CodeProject article展示瞭如何使用Adobe的ActiveX,但它可能是過時的,很容易被新版本打破,其合法性不明朗(基本上它的確定內部使用但你不能發貨,你不能在服務器上使用它來生成PDF圖像)。

  • 您可以看看SumatraPDF的源代碼,這是一個用於windows的OpenSource PDF查看器。

  • 還有Poppler,一個使用Xpdf作爲渲染引擎的渲染引擎。 所有這些都很好,但他們需要相當的承諾,使他們工作和與.Net接口,他們往往是分佈在GPL下。

  • 您可能需要考慮使用GhostScript作爲解釋器,因爲渲染頁面是一個相當簡單的過程。
    缺點是您需要重新打包才能將其安裝在您的應用中,或者將其作爲必備條件(或至少是安裝流程的一部分)。
    這不是一個很大的挑戰,而且它必須比其他渲染引擎與.Net合作更容易。
    我做了一個小項目,你會發現在Developer Express forums作爲附件。
    請注意GhostScript的許可要求。
    如果你不能離開那麼商業軟件可能是你唯一的選擇。

0

ceTe軟件的動態PDF查看器可能會做你正在尋找的東西。我使用過他們的發生器軟件,並且非常滿意。

http://www.dynamicpdf.com/

+0

很好,但非常昂貴! – 2009-02-17 06:33:31

0

使用Web瀏覽器控制。這需要安裝Adobe閱讀器,但最有可能的是你有它。將控件的UrL設置爲文件位置。

+0

爲什麼downvote這個答案? – cbrulak 2009-02-06 03:46:31

+3

我不明白你爲什麼需要使用瀏覽器控件,因爲它本身使用可直接訪問的Adobe ActiveX插件。你只是添加一層複雜性和潛在問題,顯然沒有任何理由。 – 2011-02-07 02:18:17

-1

您可以谷歌爲PDF viewer component,並拿出超過幾個點擊。

如果你真的不需要將它們嵌入到你的應用中,你可以只需要Acrobat Reader或FoxIt(或將它捆綁在一起,如果它符合它們各自的許可條款)和shell out。這不是很酷,但它可以免費完成工作。

0

我使用的最簡單的庫是Paolo Gios's庫。這基本上是

Create GiosPDFDocument object 
Create TextArea object 
Add text, images, etc to TextArea object 
Add TextArea object to PDFDocument object 
Write to stream 

This是一個很好的教程,讓你開始。

+0

我想Garth想要的只是呈現pdf的;不是你上面顯示的。 – MarlonRibunal 2009-02-06 04:54:05

13

這是我從另一個問題的答案。

首先,你需要引用ADOBE READER ActiveX控件

的Adobe Acrobat瀏覽器控件的類型庫1.0

%PROGRAMFILES & \ Common Files文件\的Adobe \ Acrobat中\的ActiveX \ AcroPDF.dll

然後,您只需將它從工具箱拖到Windows窗體中即可。

並使用一些像這樣的代碼來初始化ActiveX控件。

private void InitializeAdobe(string filePath) 
{ 
    try 
    { 
     this.axAcroPDF1.LoadFile(filePath); 
     this.axAcroPDF1.src = filePath; 
     this.axAcroPDF1.setShowToolbar(false); 
     this.axAcroPDF1.setView("FitH"); 
     this.axAcroPDF1.setLayoutMode("SinglePage"); 
     this.axAcroPDF1.Show(); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

確保當你的窗體關閉你處理ActiveX控件

this.axAcroPDF1.Dispose(); 
this.axAcroPDF1 = null; 

否則Acrobat中可能被遺落各地。

+0

+1。幫助我在WPF中託管此控件 – RichardOD 2011-10-28 11:37:30

+0

如何從流中讀取? – uikrosoft 2016-03-04 07:16:59

3

ABCpdf會爲你做這件事和其他許多事情。

它不會渲染你的PDF到各種格式(如JPEG,GIF,PNG,TIFF,JPEG 2000;矢量EPS,SVG,Flash和PostScript),但它也可以在各種色彩空間(例如灰度,RGB,CMYK)和位深度(例如,每個組件1,8,16位)。

而這只是它會做的一部分!

有關詳細信息,請參閱:

http://www.websupergoo.com/abcpdf-8.htm

哦,你可以通過免費授權方式獲得免費許可。

使用Acrobat進行PDF渲染時存在EULA問題。如果你想走下這條路,首先要非常小心地檢查合法性。

37

谷歌已經開放它採用了福昕軟件編寫的優秀PDF渲染引擎 - PDFium

有一個名爲PdfiumViewer的C#nuget包,它提供了一個圍繞PDFium的C#包裝並允許顯示和打印PDF。

我已經使用它,並且對渲染的質量印象非常深刻。


PDFium直接處理流,因此它不需要任何數據寫入磁盤。

這是一個WinForms應用程序

public void LoadPdf(byte[] pdfBytes) 
    { 
     var stream = new MemoryStream(pdfBytes); 
     LoadPdf(stream) 
    } 

    public void LoadPdf(Stream stream) 
    { 
     // Create PDF Document 
     var pdfDocument = PdfDocument.Load(stream); 

     // Load PDF Document into WinForms Control 
     pdfRenderer.Load(pdfDocument); 
    } 

編輯我的例子:爲了獲得在winform的pdfRenderer控制:PdfiumViewer NuGet包添加到項目中;在Windows資源管理器中打開項目包文件夾,然後將PdfiumViewer.dll文件拖到Toolbox窗口;所謂PdfRenderer控制將可用於補充:

Adding PdfRenderer control to WinForms

2

PdfiumViewer是偉大的,但相對緊耦合的System.Drawing和WinForms。爲此,我創建了各地PDFium我自己的包裝:PDFiumSharp

頁面可以被渲染到PDFiumBitmap這反過來又可以保存到磁盤或暴露as a stream。這樣,任何能夠從流中以BMP格式加載圖像的框架都可以使用該庫來顯示PDF頁面。

例如在WPF應用程序,你可以用下面的方法來渲染PDF頁面:

using System.Linq; 
using System.Windows; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using PDFiumSharp; 

static class PdfRenderer 
{ 
    public static ImageSource RenderPage(string filename, int pageIndex, string password = null, bool withTransparency = true) 
    { 
     using (var doc = new PdfDocument(filename, password)) 
     { 
      var page = doc.Pages[pageIndex]; 
      using (var bitmap = new PDFiumBitmap((int)page.Width, (int)page.Height, withTransparency)) 
      { 
       page.Render(bitmap); 
       return new BmpBitmapDecoder(bitmap.AsBmpStream(), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First(); 
      } 
     } 
    } 
}