2012-01-09 22 views
10

Necesito guardar un documento pdf de una página como una imagen para una miniatura en un sitio web.Exportar PDF a JPG (s) en C#

He estado jugando con PDFSharp y no he tenido suerte.

He intentado esto: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1 pero todo lo que hace es extraer las imágenes incrustadas en el archivo PDF que no es el resultado deseado.

¿Ideas sobre cómo hacer esto? ¿Alguien conoce una buena biblioteca que pueda manejar esto?

Editar: Háganme saber por qué esta es una pregunta tan mala. Si alguien tiene una buena solución para esto, sería un gran recurso para muchas otras personas. Especialmente desde que las búsquedas de google aparecen vacías.

+1

¿Qué pruebas en PDFSharp? Hay un ejemplo aquí: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1 – keyboardP

+0

Muéstrenos lo que ha intentado. Te ayudaremos con eso. – Amy

+0

¡Gracias por los votos a favor! No he intentado nada excepto el ejemplo que vinculó, que extrae las imágenes en el PDF en lugar de representar el PDF y enviarlo a una imagen. Esa es la razón por la que estoy preguntando: no veo una manera de hacerlo en iTextSharp o PDFSharp. Busqué en Google y vine con las manos vacías. – Jason

Respuesta

5

Eche un vistazo a Ghostscript. Puede procesar PDF en imágenes con él.

http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/

+0

¡Gracias, lo intentaré! – Jason

+0

Funciona como un campeón. Recomiendo obtener la fuente. Es más fácil de seguir y también es un poco diferente que el ejemplo en el blog. Lo único que debes saber es el ancho/alto deseado. Creo que voy a trabajar en averiguar de dónde extraer esa información. – Jason

+0

No estoy loco por esta solución, aparte del hecho de que funciona. Si alguien tiene una mejor solución háganoslo saber y le daré la marca de verificación. – Jason

1

(disclaimer: Yo trabajo para Atalasoft y escribió gran parte de la tecnología PDF) Si utiliza el PdfDecoder en Atalasoft DotImage, esto es sencillo:

public void PdfToJpegThumb(Stream srcStream, int pageNo, int maxDimension, Stream dstStream) 
{ 
    PdfDecoder decoder = new PdfDecoder(); 
    decoder.Resolution = 96; // reduce default resolution to speed up rendering 
    // render page 
    using (AtalaImage pdfimage = decoder.read(srcStream, pageNo, null)) { 
     Thumbnail tn = new Thumbnail(maxDimension, maxDimension); 
     // make a thumbnail image 
     using (AtalaImage tnImage = tn.Create(pdfImage)) { 
      // save it 
      tnImage.Save(dstStream, new JpegEncoder(), null); 
     } 
    } 
} 
+9

Eso sería bastante bueno si no costara más de 2000 dólares. = P – Jason

0

Lo obtuve de algún lugar en la web, no recuerdo exactamente dónde pero me funciona.
Acabo de hacer una buena función.

Utiliza las API Ghostscript (gsdll32.dll)

Ejemplos del parámetro ImageFormat son "jpeg", "tiff32nc", etc.

#region GhostScript API functions 
    [DllImport("gsdll32.dll", EntryPoint = "gsapi_new_instance")] 
    private static extern int CreateAPIInstance(out IntPtr pinstance, 
              IntPtr caller_handle); 

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_init_with_args")] 
    private static extern int InitAPI(IntPtr instance, int argc, IntPtr argv); 

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_exit")] 
    private static extern int ExitAPI(IntPtr instance); 

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_delete_instance")] 
    private static extern void DeleteAPIInstance(IntPtr instance); 
    #endregion 

    public bool CreateImage(string inputPath, string outputPath, string imageFormat, int firstPage, int lastPage, int width, int height) 
    { 
     bool result = false; 
     try 
     { 
      string[] args = GetArgs(inputPath, outputPath, imageFormat, firstPage, lastPage, width, height); 
      var argStrHandles = new GCHandle[args.Length]; 
      var argPtrs = new IntPtr[args.Length]; 

      // Create a handle for each of the arguments after 
      // they've been converted to an ANSI null terminated 
      // string. Then store the pointers for each of the handles 
      for (int i = 0; i < args.Length; i++) 
      { 
       argStrHandles[i] = GCHandle.Alloc(StringToAnsi(args[i]), GCHandleType.Pinned); 
       argPtrs[i] = argStrHandles[i].AddrOfPinnedObject(); 
      } 

      // Get a new handle for the array of argument pointers 
      var argPtrsHandle = GCHandle.Alloc(argPtrs, GCHandleType.Pinned); 

      // Get a pointer to an instance of the GhostScript API 
      // and run the API with the current arguments 
      IntPtr gsInstancePtr; 
      CreateAPIInstance(out gsInstancePtr, IntPtr.Zero); 
      InitAPI(gsInstancePtr, args.Length, argPtrsHandle.AddrOfPinnedObject()); 

      // Cleanup arguments in memory 
      for (int i = 0; i < argStrHandles.Length; i++) 
       argStrHandles[i].Free(); 

      argPtrsHandle.Free(); 

      // Clear API 
      ExitAPI(gsInstancePtr); 
      DeleteAPIInstance(gsInstancePtr); 

      result = true; 
     } 
     catch(Exception e) 
     { 
      throw e; 
     } 
     return result; 
    } 
+0

Está tomado de http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/. Además, te faltan todos los métodos de ayuda como 'GetArgs', etc. – Jason

+0

Gracias por la corrección – CompanyDroneFromSector7G

5

Ghostscript es actualmente el estándar de facto para la representación Archivos PDF Es un poco complicado de envolver, incluso con GhostScriptSharp.

Jason Morse escribió great C# wrapper for rendering PDFs como un complemento al código abierto imageresizing.net library.

Si se trata de una aplicación asp.net, la biblioteca permite la representación de la marcha, por lo que basta con añadir una cadena de consulta para obtener la versión JPEG/PNG:

/pdfs/letter.pdf?format=jpg&page=2

También puede utilizar la API administrada en su lugar (en cualquier tipo de aplicación, no específica de asp.net)

ImageBuilder.Current.Build ("letter.pdf", "dest.jpg", new ResizeSettings ("format = jpg; page = 2")));

El plugin PdfRenderer tiene licencia GPL, al igual que Ghostscript.

+0

Lo comprobaré hoy. – Jason