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.)