2012-10-18 41 views
5

Tôi đang tìm thư viện hoặc chương trình dòng lệnh có thể nén tệp PDF.Nén PDF bị mất

Tốc độ nén và kích thước tệp là rất quan trọng.

Các tệp PDF có đầy đủ các hình ảnh chất lượng in rất lớn.

Adobe Acrobat thực hiện nén chất lượng cao, nhanh chóng nhưng không cho phép "bản pdf kích thước giảm" được lưu thông qua giao diện có lập trình.

Ghostscript thực hiện nén chất lượng cao sẽ mất quá nhiều thời gian (phút).

+2

Đây là giải pháp tốt nhất mà tôi đã tìm thấy từ trước đến nay: 'gswin64c.exe -dQUIET -dBATCH -dNOPAUSE -dNOGC -dPDFSETTINGS =/screen -sDEVICE = pdfwrite -sOutputFile = compressed.pdf input.pdf'. Mất khoảng 20 giây để chuyển đổi tệp 126 MB thành 3,2 MB. – user1359680

+0

Cảm ơn user1359680. Đó là đơn giản và tuyệt vời, chỉ trong trường hợp của tôi một 'gswin32c.exe' đã được tìm thấy trên hệ thống của tôi. Tôi sẽ bọc nó thành một tập lệnh .cmd một dòng và đặt vào thư mục SendTo của tôi để dễ dàng nhấp chuột phải áp dụng. – Marcos

+0

Cập nhật: Tôi đã đi với Neevia CompressPDF với giá 99 đô la. Nó không nén các phông chữ hoặc lộn xộn với văn bản. Ghostscript đôi khi xóa các chữ cái khỏi lớp văn bản có thể tìm kiếm được. Một giải pháp khác là chuyển đổi PDF sang HTML5 bằng cách sử dụng jpdf2html.jar của IDR Solutions nhưng nó đắt tiền cho một giấy phép ($ 2500) – user1359680

Trả lời

1

Nếu thư viện thương mại là một tùy chọn, bạn có thể dùng thử Amyuni PDF Creator. Có phiên bản .net (C#/VB.Net vv) và một phiên bản ActiveX (cho C++/Delphi/VB/PHP, vv).

Bạn có thể lặp qua tất cả các đối tượng của mỗi trang, chọn những người là hình ảnh và giảm kích thước của chúng. Bạn có một số khả năng ở đó:

  1. Đặt tốc độ nén thấp hơn.
  2. Lấy mẫu xuống (trích xuất hình ảnh, định lại kích thước thành độ phân giải thấp hơn và đặt lại trong tệp của bạn)
  3. Kết hợp hai bước trước đó.

Sau đây là cách mã sẽ như thế nào cho các tùy chọn đầu tiên, trong C#, sử dụng Amyuni PDF Creator Net:

//open a pdf document 
document.Open("c:\\temp\\myfile.pdf",""); 
IacPage page1 = document.GetPage (1); 
Amyuni.PDFCreator.IacAttribute attribute = page1.AttributeByName ("Objects"); 
// listobj is an array list of graphic objects 
System.Collections.ArrayList listobj = (System.Collections.ArrayList) attribute.Value; 
foreach (object pdfObj in listobj) 
{ 
    if ((IacObjectType)pdfObj.AttributeByName("ObjectType").Value == IacObjectType.acObjectTypePicture) 
    { 
     if ((IacImageCompressionConstants)pdfObj.AttributeByName("Compression").Value == IacImageCompressionConstants.acCompressionJPegMedium) 
      pdfObj.AttributeByName("Compression").Value = IacImageCompressionConstants.acCompressionJPegLow; 

     if ((IacImageCompressionConstants)pdfObj.AttributeByName("Compression").Value == IacImageCompressionConstants.acCompressionJPegHigh) 
      pdfObj.AttributeByName("Compression").Value = IacImageCompressionConstants.acCompressionJPegMedium; 
     // (...) 
    } 
} 

từ chối trách nhiệm thông thường áp dụng

0

Bạn có thể muốn thử Docotic.Pdf library cho công việc của bạn.

Đây là một mã mà quy mô tất cả các hình ảnh có chiều rộng hoặc chiều cao lớn hơn hoặc bằng 256. hình ảnh Scaled này sau đó được mã hóa sử dụng nén JPEG với chất lượng thiết lập để 65.

public static void RecompressToJpeg(string path, string outputPath) 
{ 
    using (PdfDocument doc = new PdfDocument(path)) 
    { 
     foreach (PdfImage image in doc.Images) 
     { 
      // image that is used as mask or image with attached mask are 
      // not good candidates for recompression 
      if (!image.IsMask && image.Mask == null && (image.Width >= 256 || image.Height >= 256)) 
       image.Scale(0.5, PdfImageCompression.Jpeg, 65); 
     } 

     doc.Save(outputPath); 
    } 
} 

Bạn cũng có thể chỉ nén lại hình ảnh mà không thay đổi kích thước của chúng bằng cách sử dụng một trong các phương pháp RecompressWithJpeg (hoặc một trong các phương thức RecompressXXX khác).

Và hình ảnh có thể được thay đổi kích thước thành chiều rộng và chiều cao được chỉ định bằng một trong các phương pháp ResizeTo. Xin lưu ý rằng bạn sẽ cần phải tính tỷ lệ khung hình trong trường hợp sau.

Tuyên bố từ chối trách nhiệm: Tôi làm việc cho nhà cung cấp thư viện.

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