2012-01-09 17 views
10

Ho bisogno di salvare un documento PDF di una pagina come immagine per una miniatura su un sito web.Esporta PDF in JPG (s) in C#

Ho lavorato con PDFSharp e non ho avuto fortuna.

Ho provato questo: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1 ma tutto ciò che fa è estrarre le immagini incorporate nel file PDF che non è il risultato desiderato.

Idee su come fare questo? Qualcuno conosce una buona libreria in grado di gestirlo?

Modifica: Per favore fatemi sapere perché questa è una domanda così negativa. Se qualcuno ha una buona soluzione a questo, sarebbe una grande risorsa per molte altre persone. Soprattutto perché le ricerche su google appaiono vuote.

+1

Cosa hai provato in PDFSharp? C'è un esempio qui: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1 – keyboardP

+0

Mostraci cosa hai provato. Ti aiuteremo. – Amy

+0

Grazie per i downvotes! Non ho provato nulla tranne l'esempio che hai collegato che estrae le immagini nel PDF invece di renderizzare il PDF e di inviarlo a un'immagine. Questo è il motivo per cui ti sto chiedendo: non vedo un modo per farlo in iTextSharp o PDFSharp. Ho cercato su Google molto e sono venuto a mani vuote. – Jason

risposta

5

Dai un'occhiata a Ghostscript. È possibile rendere il PDF alle immagini con esso.

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

+0

Grazie, ci proverò! – Jason

+0

Funziona come un campione. Raccomando di ottenere la fonte. È più facile da seguire ed è anche un po 'diverso dall'esempio sul blog. L'unica cosa è che devi conoscere la larghezza/altezza desiderata. Immagino che lavorerò per capire da dove vengono le informazioni. – Jason

+0

Non sono pazzo di questa soluzione, a parte il fatto che funzioni. Se qualcuno ha una soluzione migliore faccelo sapere e ti darò il segno di spunta. – Jason

1

(disclaimer: io lavoro per Atalasoft e ha scritto un sacco di tecnologia PDF) Se si utilizza il PdfDecoder in Atalasoft DotImage, questo è semplice:

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

Sarebbe bello se non costasse 2000+ dollari. = P – Jason

0

L'ho preso da qualche parte sul web - non ricordo esattamente dove ma funziona per me!
L'ho appena trasformato in una bella funzione.

Esso utilizza le API di Ghostscript (gsdll32.dll)

Esempi del parametro FormatoImmagine sono "jpeg", "tiff32nc", ecc

#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

È tratto da http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/. Inoltre, ti mancano tutti i metodi di supporto come "GetArgs", ecc. – Jason

+0

Grazie per la correzione – CompanyDroneFromSector7G

5

Ghostscript è attualmente lo standard de-facto per il rendering PDF. È un po 'complicato da avvolgere, anche usando GhostScriptSharp.

Jason Morse ha scritto un great C# wrapper for rendering PDFs come plug-in per l'open-source imageresizing.net library.

Se si tratta di un'applicazione asp.net, la libreria permette di rendering on-the-fly, quindi si può semplicemente aggiungere un querystring per ottenere la versione jpeg/png:

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

È inoltre possibile utilizzare invece l'API gestita (in qualsiasi tipo di applicazione - non specifica per asp.net)

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

Il plug-in PdfRenderer è concesso in licenza GPL, proprio come Ghostscript.

+0

, lo controllerò oggi. – Jason