Saya menggunakan Ghostscript dengan opsi berikut yang diambil dari sini.
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Anda mungkin menemukan bahwa pdftocairo
(dari Poppler) dapat membuat PDF lebih kecil tetapi berhati-hatilah karena ini akan menghilangkan beberapa fitur (seperti hyperlink).
Anda dapat memperoleh hasil yang baik dengan mengonversi dari PDF ke Postscript, lalu kembali ke PDF menggunakan
pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf
Nilai argumen -dPDFSETTINGS
menentukan kualitas gambar dalam PDF yang dihasilkan. Pilihannya adalah, dari kualitas rendah ke tinggi:/screen
, /default
, /ebook
, /printer
, /prepress
, lihat http://milan.kupcevic.net/ghostscript-ps-pdf/ untuk referensi.
File Postscript bisa menjadi sangat besar, tetapi hasilnya sepadan. Saya beralih dari PDF berukuran 60 MB menjadi file Postscript berukuran 140 MB, tetapi berakhir dengan PDF yang dioptimalkan sebesar 1,1 MB.
Jika Anda mencari Perangkat Lunak Gratis (seperti dalam 'libre'), Ghostscript pasti pilihan terbaik Anda. Namun, ini tidak selalu mudah digunakan -- beberapa opsi pemrosesannya (yang sangat andal) tidak mudah ditemukan didokumentasikan.
Lihat jawaban ini , yang menjelaskan cara menjalankan kontrol yang lebih mendetail atas downsampling resolusi gambar daripada -dPDFSETTINGS=/screen
umum tidak (yang menentukan beberapa default keseluruhan, yang mungkin ingin Anda ganti):
- Bagaimana cara mengecilkan gambar dalam file pdf?
Pada dasarnya, ini memberi tahu Anda cara membuat Ghostscript menurunkan sampel semua gambar ke resolusi 72dpi (nilai ini adalah -dPDFSETTINGS=/screen
penggunaan -- Anda mungkin ingin lebih rendah lagi):
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \
Jika Anda ingin mencoba apakah Ghostscript juga dapat 'membatalkan penyematan' font yang digunakan (terkadang berhasil, terkadang tidak -- tergantung kerumitan font yang disematkan, dan juga pada jenis font yang digunakan ), Anda dapat mencoba menambahkan yang berikut ke perintah gs Anda:
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
Catatan: Ketahuilah bahwa resolusi gambar downsampling pasti akan mengurangi kualitas (tidak dapat diubah), dan font yang disematkan akan membuat sulit atau tidak mungkin untuk menampilkan dan mencetak PDF kecuali font yang sama diinstal pada mesin....
Perbarui
Salah satu opsi yang saya abaikan dalam jawaban awal saya adalah menambahkan
-dDetectDuplicateImages=true
ke baris perintah. Parameter ini mengarahkan Ghostscript untuk mencoba dan mendeteksi gambar apa pun yang disematkan dalam PDF beberapa kali. Hal ini dapat terjadi jika Anda menggunakan gambar sebagai logo atau latar belakang halaman, dan jika perangkat lunak penghasil PDF tidak dioptimalkan untuk situasi ini. Hal ini pernah terjadi pada OpenOffice/LibreOffice versi lama (saya menguji rilis terbaru LibreOffice, v4.3.5.2, dan tidak lagi melakukan hal bodoh seperti itu).
Ini juga terjadi jika Anda menggabungkan file PDF dengan bantuan pdftk
. Untuk menunjukkan efeknya, dan bagaimana Anda dapat menemukannya, mari kita lihat contoh file 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
Versi terbaru dari pdfimages
Poppler utilitas telah menambahkan dukungan untuk -list
parameter, yang dapat mencantumkan semua gambar yang disertakan dalam file 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%
Contoh PDF ini adalah dokumen 1 halaman, berisi gambar, yang dikompresi dengan kompresi JPEG, memiliki lebar 423 piksel dan tinggi 600 piksel, serta dirender pada resolusi 52 PPI pada halaman.
Jika kita menggabungkan 3 salinan dari file ini dengan bantuan pdftk
seperti itu:
pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf
maka hasilnya menunjukkan properti gambar ini melalui 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%
Ini menunjukkan bahwa ada 3 objek PDF yang identik (dengan ID 4, 8 dan 12) yang disematkan di p3.pdf
sekarang. p3.pdf
terdiri dari 3 halaman:
pdfinfo p3.pdf | grep Pages:
Pages: 3
Optimalkan PDF dengan mengganti gambar duplikat dengan referensi
Sekarang kita dapat menerapkan pengoptimalan yang disebutkan di atas dengan bantuan Ghostscript
gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf
Memeriksa:
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%
Masih ada satu gambar yang dicantumkan per halaman -- tetapi ID objek PDF sekarang selalu sama: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
Seperti yang Anda lihat, rangkaian "bodoh" yang dibuat dengan pdftk meningkatkan ukuran file asli menjadi tiga kali lipat dari aslinya. Optimalisasi oleh Ghostscript menurunkannya dengan jumlah yang cukup besar.
Versi terbaru Ghostscript bahkan mungkin menerapkan -dDetectDuplicateImages
secara default. (AFAIR, v9.02, yang pertama kali memperkenalkannya, tidak menggunakannya secara default.)