2009-02-06 103 views
39

Quiero cargar y dibujar archivos PDF gráficamente usando C#. No necesito editarlos ni nada, simplemente renderizarlos en un nivel de zoom determinado.Cómo renderizar archivos PDF usando C#

Las bibliotecas de pdf que he encontrado parecen estar enfocadas en la generación. ¿Cómo hago esto?

Gracias.

Respuesta

43

Hay algunas otras opciones en caso de que el Adobe ActiveX no es lo que estás buscando (ya que Acrobat debe estar presente en la máquina del usuario y no se puede enviar por sí mismo).

Para crear la vista previa en PDF, primero echar un vistazo a algunas otras discusiones sobre el tema en StackOverflow:

En los dos últimos hablo de algunas cosas que puede probar:

  • , usted puede obtener un procesador comercial (PDFViewForNet, PDFRasterizer.NET, ABCPDF, ActivePDF, XpdfRasterizer y otros en las otras respuestas ...).
    La mayoría son bastante caros, especialmente si todo lo que te importa es hacer una vista previa simple/miniaturas.

  • Además del fragmento de código de Omar Shahine, hay un CodeProject article que muestra cómo usar Adobe ActiveX, pero puede estar desactualizado, se puede romper fácilmente con los nuevos lanzamientos y su legalidad es turbia (básicamente está bien para internos use pero no puede enviarlo y no puede usarlo en un servidor para producir imágenes de PDF).

  • usted podría tener un vistazo al código fuente para SumatraPDF, un visor de PDF Open Source para las ventanas.

  • Existe también Poppler, un motor de renderizado que utiliza Xpdf como un motor de renderizado. Todos estos son geniales, pero requerirán una buena cantidad de compromiso para hacer que funcionen e interactúen con .Net y tienden a distribuirse bajo la GPL.

  • Es posible que desee considerar el uso de GhostScript como intérprete porque la representación de páginas es un proceso bastante simple.
    El inconveniente es que tendrá que volver a empaquetarlo para instalarlo con su aplicación o hacerlo un requisito previo (o al menos una parte de su proceso de instalación).
    No es un gran desafío, y ciertamente es más fácil que tener que dar masajes a otros motores de renderizado para que cooperen con .Net.
    Hice un pequeño proyecto que encontrará en el archivo adjunto Developer Express forums.
    Tenga cuidado con los requisitos de licencia para GhostScript a través de.
    Si no puedes irte con eso, entonces el software comercial es probablemente tu única opción.

+1

La opción Poppler se puede usar fácilmente desde aplicaciones .NET cuando la herramienta se ejecuta como línea de comando con System.Diagnostics.Process, y en este caso la licencia GPL no es un bloqueador para el uso de poppler en proyectos de código cerrado. Recientemente, he creado [C# wrapper for poppler] (https://www.nuget.org/packages/NReco.PdfRenderer/) que proporciona una API muy simple para el procesamiento de PDF. –

0

Dynamic PDF Viewer del software ceTe puede hacer lo que está buscando. He usado su software de generador y estaba muy contento con él.

http://www.dynamicpdf.com/

+0

agradable pero bastante caro! –

0

Usar el control de explorador Web. Esto requiere que se instale Adobe Reader, pero lo más probable es que lo tenga de todos modos. Establezca la URL del control en la ubicación del archivo.

+0

¿por qué downvote esta respuesta? – cbrulak

+3

No veo por qué necesitarías usar el control del navegador ya que él mismo usa el complemento Adobe ActiveX al que se puede acceder directamente. Simplemente agrega una capa de complejidad y posibles problemas aparentemente sin una buena razón. –

-1

Puedes buscar en Google PDF viewer component, y llegar a más de unos pocos hits.

Si usted realmente no necesita integrar en su aplicación, sin embargo - que sólo puede requerir Acrobat Reader o Foxit (o paquete que, si cumple con sus respectivos términos de licencia) y shell out a ella. No es tan genial, pero hace el trabajo gratis.

0

La lib más fácil que he usado es Paolo Gios's biblioteca. Se trata básicamente de

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

This es un gran tutorial para empezar.

+0

Creo que lo que Garth quiere es solo renderizar pdf; no es lo que has mostrado arriba. – MarlonRibunal

13

Aquí está mi respuesta de otra pregunta.

primer lugar usted necesita para hacer referencia al control ActiveX Adobe Reader

Adobe Acrobat control de explorador Type Library 1.0

% programfiles & \ Archivos comunes \ Adobe \ Acrobat \ ActiveX \ AcroPDF.dll

Luego, simplemente arrástralo a tu Windows Form desde Toolbox.

Y use un código como este para inicializar el control 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; 
    } 
} 

Asegúrese de que cuando el formulario se cierra que se deshaga del Control ActiveX

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

lo contrario Acrobat podría quedar ahí.

+0

+1. Me ayudó a alojar este control en WPF – RichardOD

+0

¿Cómo se lee en la transmisión? – uikrosoft

3

ABCpdf hará esto y muchas otras cosas para usted.

No solo mostrará su PDF en una variedad de formatos (por ejemplo, JPEG, GIF, PNG, TIFF, JPEG 2000, vectores EPS, SVG, Flash y PostScript) sino que también puede hacerlo en una variedad de espacios de color (por ejemplo, gris, RGB, CMYK) y profundidades de bits (por ejemplo, 1, 8, 16 bits por componente).

¡Y eso es solo lo que hará!

Para más detalles ver:

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

Oh y se puede obtener licencias libres a través del esquema de licencia libre.

Existen problemas de EULA con el uso de Acrobat para hacer el procesamiento de PDF. Si desea ir por esta ruta, compruebe los aspectos legales con mucho cuidado primero.

37

Google tiene abierto obtuvo su excelente motor de renderizado PDF - PDFium - que escribió con Foxit Software.

Hay un paquete nuget C# llamado PdfiumViewer que proporciona un contenedor C# alrededor de PDFium y permite que los archivos PDF se muestren e impriman.

Lo he usado y quedé muy impresionado con la calidad de la representación.


PDFium trabaja directamente con transmisiones por lo que no requiere que se escriban datos en el disco.

Este es mi ejemplo de una aplicación Windows Forms

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); 
    } 

Editar: Para obtener el control depdfRenderer en WinForm: Añadir el paquete NuGet PdfiumViewer con el proyecto; abra la carpeta de paquetes de proyectos en Windows Explorer y arrastre el archivo PdfiumViewer.dll a la ventana Toolbox; Un control de llamada PdfRenderer estará disponible para agregar:

Adding PdfRenderer control to WinForms

+7

Sé que este es un hilo viejo, pero vale la pena comentarlo. Si está trabajando en un proyecto de código fuente cercano y necesita lidiar con archivos PDF, esta es la biblioteca que desea. todo lo demás requiere una licencia pagada para usar. – ScarletMerlin

+2

** Esta es, de lejos, la mejor respuesta a las preguntas sobre los lectores de PDF en las aplicaciones de winforms **. Me pregunto por qué no está marcado como respuesta a esta publicación. Gracias @Paddy, ¡fue una gran ayuda! – aubykhan

+0

Nota: El pdfium.dll actual no se puede cargar en un proyecto .NET 4.0 – CZahrobsky

2

PdfiumViewer es grande, pero relativamente estrechamente unida a System.Drawing y WinForms. Por esta razón he creado mi propia envoltura alrededor PDFium: PDFiumSharp

páginas pueden ser prestados a un PDFiumBitmap que a su vez se pueden guardar en el disco o se expone as a stream. De esta forma, cualquier marco capaz de cargar una imagen en formato BMP desde una secuencia puede usar esta biblioteca para mostrar páginas en formato PDF.

Por ejemplo, en una aplicación de WPF se puede utilizar el siguiente método para representar una página 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(); 
      } 
     } 
    } 
}