GNU/Linux >> Znalost Linux >  >> Linux

Optimalizujte soubory PDF (pomocí Ghostscriptu nebo jiného)

Používám Ghostscript s následujícími možnostmi převzatými odtud.

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

Možná zjistíte, že pdftocairo (od společnosti Poppler) může vytvářet menší soubory PDF, ale mějte na paměti, že odstraní některé funkce (například hypertextové odkazy).


Dobré výsledky můžete získat převodem z PDF do Postscriptu a poté zpět do PDF pomocí

pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf

Hodnota argumentu -dPDFSETTINGS definuje kvalitu obrázků ve výsledném PDF. Možnosti jsou od nízké po vysokou kvalitu:/screen , /default , /ebook , /printer , /prepress , viz http://milan.kupcevic.net/ghostscript-ps-pdf/ pro referenci.

Postscriptový soubor může být poměrně velký, ale výsledky stojí za to. Přešel jsem z 60 MB PDF na 140 MB Postscriptový soubor, ale skončil jsem s 1,1 MB optimalizovaným PDF.


Pokud hledáte bezplatný (jako v „libre“) software, Ghostscript je jistě vaše nejlepší volba. Jeho použití však není vždy snadné – některé z jeho (velmi výkonných) možností zpracování není snadné najít zdokumentované.

Podívejte se na tuto odpověď, která vysvětluje, jak provést podrobnější kontrolu nad převzorkováním rozlišení obrazu, než jaké je obecné -dPDFSETTINGS=/screen dělá (to definuje několik celkových výchozích hodnot, které možná budete chtít přepsat):

  • Jak převzorkovat obrázky v souboru PDF?

V podstatě vám říká, jak zajistit, aby Ghostscript převzorkoval všechny obrázky na rozlišení 72 dpi (tato hodnota je -dPDFSETTINGS=/screen použití -- možná budete chtít jít ještě níže):

-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \

Pokud chcete vyzkoušet, zda je Ghostscript schopen také „odemknout“ použitá písma (někdy to funguje, někdy ne – v závislosti na složitosti vloženého písma a také na použitém typu písma ), můžete zkusit do příkazu gs přidat následující:

gs \
  -o output.pdf \
   [...other options...] \
  -dEmbedAllFonts=false \
  -dSubsetFonts=true \
  -dConvertCMYKImagesToRGB=true \
  -dCompressFonts=true \
  -c ".setpdfwrite <</AlwaysEmbed [ ]>> setdistillerparams" \
  -c ".setpdfwrite <</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Arial]>> setdistillerparams" \
  -f input.pdf

Poznámka: Uvědomte si, že převzorkování rozlišení obrazu jistě sníží kvalitu (nevratně) a odstranění písem ztíží nebo znemožní zobrazení a tisk PDF, pokud nejsou na stroji nainstalována stejná písma....

Aktualizovat

Jednou z možností, kterou jsem ve své původní odpovědi přehlédl, je přidat

-dDetectDuplicateImages=true

do příkazového řádku. Tento parametr vede Ghostscript k tomu, aby se pokusil detekovat všechny obrázky, které jsou vložené do PDF vícekrát. K tomu může dojít, pokud použijete obrázek jako logo nebo pozadí stránky a pokud software pro generování PDF není pro tuto situaci optimalizován. To bývalo u starších verzí OpenOffice/LibreOffice (testoval jsem nejnovější vydání LibreOffice, v4.3.5.2, a už takové hlouposti nedělá).

Stává se to také, pokud zřetězíte soubory PDF pomocí pdftk . Abychom vám efekt ukázali a jak jej můžete objevit, podívejme se na ukázkový soubor PDF:

pdfinfo p1.pdf

 Producer:       libtiff / tiff2pdf - 20120922
 CreationDate:   Tue Jan  6 19:36:34 2015
 ModDate:        Tue Jan  6 19:36:34 2015
 Tagged:         no
 UserProperties: no
 Suspects:       no
 Form:           none
 JavaScript:     no
 Pages:          1
 Encrypted:      no
 Page size:      595 x 842 pts (A4)
 Page rot:       0
 File size:      20983 bytes
 Optimized:      no
 PDF version:    1.1

Nejnovější verze Popplerova pdfimages utilita přidala podporu pro -list parametr, který může vypsat všechny obrázky obsažené v souboru PDF:

pdfimages -list p1.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image    423   600   rgb    3   8 jpeg     no     7  0    52    52 19.2K 2.6%

Tento ukázkový soubor PDF je 1stránkový dokument obsahující obrázek, který je komprimován pomocí komprese JPEG, má šířku 423 pixelů a výšku 600 pixelů a na stránce se vykresluje v rozlišení 52 PPI.

Pokud zřetězíme 3 kopie tohoto souboru pomocí pdftk takhle:

pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf

pak výsledek ukazuje tyto vlastnosti obrázku pomocí pdfimages -list :

pdfimages -list p3.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no     4  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no     8  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    12  0    52    52 19.2K 2.6%

To ukazuje, že existují 3 identické objekty PDF (s ID 4, 8 a 12), které jsou vložené do p3.pdf Nyní. p3.pdf skládá se ze 3 stránek:

pdfinfo p3.pdf | grep Pages:

 Pages:          3

Optimalizujte PDF nahrazením duplicitních obrázků odkazy

Nyní můžeme použít výše zmíněnou optimalizaci pomocí Ghostscript

 gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf

Kontrola:

 pdfimages -list p3-optim.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%

Na stránce je stále uveden jeden obrázek – ale ID objektu PDF je nyní vždy stejné:10.

 ls -ltrh p1.pdf p3.pdf p3-optim.pdf

   [email protected] 1 kp  staff    20K Jan  6 19:36 p1.pdf
   -rw-r--r--  1 kp  staff    60K Jan  6 19:37 p3.pdf
   -rw-r--r--  1 kp  staff    16K Jan  6 19:40 p3-optim.pdf

Jak můžete vidět, "hloupé" spojení vytvořené pomocí pdftk zvětšilo původní velikost souboru na trojnásobek původní velikosti. Optimalizace provedená Ghostscriptem jej výrazně snížila.

Nejnovější verze Ghostscriptu mohou dokonce používat -dDetectDuplicateImages ve výchozím stavu. (AFAIR, v9.02, která jej zavedla poprvé, jej ve výchozím nastavení nepoužívala.)


Linux
  1. Jak šifrovat soubory pomocí gocryptfs na Linuxu

  2. Seřadit soubory v konkrétní složce pomocí Ranger?

  3. Práce se soubory ZIP v Linuxu

  1. Jak Grep v souborech Pdf?

  2. Sloučit soubory pdf s číselným řazením

  3. Převod PDF na černobílý pomocí ghostscriptu

  1. Cat soubory s adresářem?

  2. Přejmenovat soubory v adresáři?

  3. Rekurzivně optimalizujte soubory PNG