Kompresja plików PDF

Bardzo często, po dodaniu ilustracji, plik PDF puchnie do ogromnych rozmiarów. Przygotowując publikację do druku staramy się aby jakość ilustracji była jak najlepsza i czasami przesadzamy z tym. Osobną sprawą jest przygotowanie ilustracji w takiej rozdzielczości, aby drukarz (albo redakcja nie narzekali). Nie będziemy zajmować się tym teraz. Program Adobe Acrobat (w wersji pro) pozwala zapisać plik w wersji „zoptymalizowanej”. Opis tej funkcjonalności można znaleźć na stronach Adobe. Co jednak zrobić gdy nie mamy dostępu do tego (płatnego) programu? Program ghostscript oferuje zbliżoną funkcjonalność. Podstawowe polecenie do optymalizacji wygląda tak:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.6 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=plik\_skompresowany.pdf plik.pdf

Kluczowa opcja to -dPDFSETTINGS=/printer która stara się działać podobnie jak odpowiednie ustawienie w Adobe Acrobat. Inne wartości jakie może ona przyjmować to:

  • /prepress — najwyższa jakość, 300 dpi,
  • /printer — wysoka jakość, optymalizowane do wydruku, 300 dpi,
  • /ebook — niska jakość, 150 dpi,
  • /screen — do czytania na ekranie, ilustracje są skalowane do 72 dpi (co nie zawsze daje dobre efekty)
  • /default — ustawienia domyślne.

Wykonany test pozwolił skompresować plik o wielkości 5 M do:

  • 244 K /screen
  • 276 K /ebook
  • 632 K /prepress
  • 704 K /print
  • 788 K /default

W przypadku plików PDF tworzonych przez narzędzia TeXowe warto skorzystać z programu pdfimages znajdującego się w linuksowym pakiecie poppler-utils. W przypadku Windows (nie testowałem) program znajduje się w paczce pakietu XpdfReader. Program nie tylko pozwala na wyodrębnienie ilustracji zawartych w pliku PDF (nie każdą ilustrację i nie z każdego pliku da się w ten sposób wyodrębnić) ale, w szczególności, program pozwala odpytać o wszystkie ilustracje znajdujące się w pliku PDF:

pdfimages -list plik.pdf

Dowiemy się w jakiej rozdzielczości są ilustracje. Po kompresji okaże się co z nimi zrobił ghostscript. W opisywanym wcześniej przykładzie było sporo plików graficznych w rozdzielczości 945 dpi. Po kompresji zostały one odpowiednio zmniejszone (do 300 dpi) w przypadku /printer. Wadą tak zrealizowanej kompresji jest to, że wszystkie „klikalne odsyłacze” w pliku PDF przestają być klikalne. I nie tyle jest to wina LaTeXa/ghostscripta ile raczej sposobu traktowania różnych obiektów podczas kompresji. Aby odnośniki pozostały klikalne — należy (nad)użyć opcji pdfa pakietu hyperref:

\usepackage[pdfa]{hyperref}

Odsyłacze będą działały.

Wojciech Myszka
Wojciech Myszka
dr inż. adiunkt

Tak się tylko rozglądam…