2012-10-18 14 views
5

Sto cercando una libreria o un programma da riga di comando in grado di comprimere i PDF.compressione lossy PDF

La velocità di compressione e la dimensione del file sono molto importanti.

I PDF sono pieni di immagini di qualità di stampa molto grandi.

Adobe Acrobat esegue una compressione rapida di alta qualità ma non consente di salvare "PDF di dimensioni ridotte" tramite un'interfaccia programmatica.

Ghostscript fa una compressione di alta qualità troppo lungo (minuti).

+2

Questa è la soluzione migliore che ho trovato finora: 'gswin64c.exe -dQUIET -dBATCH -dNOPAUSE -dNOGC -dPDFSETTINGS =/screen -sDEVICE = pdfwrite -sOutputFile = compresso.pdf input.pdf'. Occorrono circa 20 secondi per convertire un file di 126 MB in 3,2 MB. – user1359680

+0

Grazie utente1359680. È semplice e grandioso, solo nel mio caso è stato trovato un 'gswin32c.exe' sul mio sistema. Lo inserirò in uno script di una riga .cmd e lo inserirò nella mia cartella SendTo per una facile applicazione con il tasto destro del mouse. Aggiornamento – Marcos

+0

: Sono andato con Neevia CompressPDF per $ 99. Non comprime i caratteri o non interferisce con il testo. Ghostscript a volte rimuove le lettere dal livello di testo ricercabile. Un'altra soluzione è convertire i PDF in HTML5 usando jpdf2html.jar di IDR Solutions ma è costoso per una licenza ($ 2500) – user1359680

risposta

1

Se una libreria commerciale è un'opzione, è possibile provare Amyuni PDF Creator. Esiste una versione .net (C#/VB.Net ecc.) E una versione ActiveX (per C++/Delphi/VB/PHP ecc.).

È possibile scorrere tutti gli oggetti di ciascuna pagina, selezionare quelle che sono immagini e ridurne le dimensioni. Esistono diverse possibilità:

  1. Impostazione di una velocità di compressione inferiore.
  2. Down-sampling (estrazione dell'immagine, ridimensionamento a una risoluzione inferiore e reinserimento nel file)
  3. Combinare i due precedenti.

Ecco come il codice sarà simile per la prima opzione, in C#, utilizzando 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; 
     // (...) 
    } 
} 

solita dichiarazione vale

0

Si potrebbe desiderare di provare Docotic.Pdf library per la tua attività.

Qui è un codice che scala tutte le immagini con larghezza o altezza maggiore o uguale a 256. Le immagini in scala vengono poi codificati utilizzando la compressione JPEG qualità impostata 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); 
    } 
} 

Si potrebbe anche solo ricomprimere immagini senza cambiare le loro dimensioni usando uno dei metodi RecompressWithJpeg (o uno degli altri metodi RecompressXXX).

E le immagini possono essere ridimensionate secondo la larghezza e l'altezza specificate utilizzando uno dei metodi ResizeTo. Si prega di notare che sarà necessario prendere in considerazione le proporzioni in quest'ultimo caso.

Disclaimer: Lavoro per il venditore della biblioteca.