2012-01-09 44 views
10

Tôi cần lưu tài liệu pdf một trang dưới dạng hình ảnh cho hình thu nhỏ trên trang web.Xuất PDF sang JPG (s) trong C#

Tôi đã rối tung với PDFSharp và không có may mắn.

Tôi đã thử điều này: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1 nhưng tất cả những gì bạn làm là trích xuất các hình ảnh được nhúng trong tệp PDF không phải là kết quả mong muốn.

Ý tưởng về cách thực hiện việc này? Bất cứ ai biết một thư viện tốt có thể xử lý này?

Chỉnh sửa: Vui lòng cho tôi biết tại sao đây lại là một câu hỏi tồi. Nếu bất cứ ai có một giải pháp tốt cho điều này nó sẽ là một nguồn lực lớn cho nhiều người khác. Đặc biệt là kể từ khi tìm kiếm google xuất hiện trống.

+1

Bạn đã thử gì trong PDFSharp? Có một ví dụ ở đây: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1 – keyboardP

+0

Hiển thị cho chúng tôi những gì bạn đã thử. Chúng tôi sẽ giúp bạn với nó. – Amy

+0

Cảm ơn bạn đã tìm hiểu! Tôi đã không thử bất cứ điều gì ngoại trừ ví dụ bạn liên kết mà trích xuất các hình ảnh trong PDF thay vì rendering PDF và xuất nó vào một hình ảnh. Đó là lý do tôi yêu cầu: Tôi không thấy một cách để làm điều đó trong iTextSharp hoặc PDFSharp. Tôi đã Googled rất nhiều và đưa ra tay trắng. – Jason

Trả lời

5

Hãy xem Ghostscript. Bạn có thể hiển thị PDF thành hình ảnh với nó.

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

+0

Cảm ơn, tôi sẽ thử! – Jason

+0

Làm việc như một nhà vô địch. Tôi khuyên bạn nên lấy nguồn. Nó là dễ dàng hơn để làm theo và nó cũng là một chút khác nhau mà các ví dụ trên blog. Điều duy nhất là bạn phải biết chiều rộng/chiều cao mong muốn. Tôi đoán tôi sẽ làm việc để tìm ra nơi để thu thập thông tin đó. – Jason

+0

Tôi không điên về giải pháp này, khác với thực tế là nó hoạt động. Nếu có ai có giải pháp tốt hơn hãy cho chúng tôi biết và tôi sẽ cung cấp cho bạn dấu kiểm. – Jason

1

(từ chối trách nhiệm: Tôi làm việc cho Atalasoft và viết rất nhiều các công nghệ PDF) Nếu bạn sử dụng PdfDecoder trong Atalasoft dotImage, đây là thẳng về phía trước:

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

Điều đó sẽ khá gọn gàng nếu nó không tốn 2000 đô la. = P – Jason

0

Tôi nhận được từ một nơi nào đó trên web - không thể nhớ chính xác vị trí nào nhưng nó hoạt động cho tôi!
Tôi vừa biến nó thành một chức năng tuyệt vời.

Nó sử dụng các API GhostScript (GSdll32.dll)

Ví dụ về các tham số imageFormat là "jpeg", "tiff32nc", vv

#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

Được lấy từ http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/. Ngoài ra, bạn đang thiếu tất cả các phương pháp trợ giúp như 'GetArgs' vv – Jason

+0

Cảm ơn bạn đã sửa đổi – CompanyDroneFromSector7G

5

Ghostscript hiện là tiêu chuẩn de-facto cho rendering PDF. Đó là một chút khó khăn để bọc, thậm chí sử dụng GhostScriptSharp.

Jason Morse đã viết một great C# wrapper for rendering PDFs làm plugin cho mã nguồn mở imageresizing.net library.

Nếu đó là một ứng dụng asp.net, thư viện cho phép dựng hình on-the-fly, vì vậy bạn chỉ có thể thêm một chuỗi truy vấn để có được phiên bản jpeg/png:

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

Bạn cũng có thể sử dụng API được quản lý thay thế (trong bất kỳ loại ứng dụng nào - không phải asp.net cụ thể)

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

Plugin PdfRenderer được cấp phép GPL, giống như Ghostscript.

+0

Tôi sẽ kiểm tra nó ra ngày hôm nay. – Jason

Các vấn đề liên quan