Gunakan Ghostscript, tetapi katakan untuk tidak memproses ulang gambar?

30

Saya memiliki PDF yang sudah dikompresi dan agak artifak-y gambar, dan saya menggunakan Ghostscript untuk menambahkan halaman judul ke PDF itu.

Namun, saya tidak dapat menemukan cara untuk memberitahu GS untuk hanya menggunakan gambar yang ada apa adanya tanpa memproses ulang mereka, dan sekarang saya merasa seolah-olah itu ada hubungannya dengan cara kerja GS, yaitu Anda tidak dapat mengkompilasi ulang / menautkan PDF tanpa memproses ulang gambarnya .. Apakah itu benar?

Saya dapat meningkatkan pengaturan DPI di GS, tetapi akan berubah dari 5MB menjadi 60MB sementara masih terlihat lebih buruk.

Apakah ada alternatif yang lebih baik untuk GS yang akan melakukan apa yang saya butuhkan (lebih disukai yang akan dikompilasi pada OS X)?

Mahmoud Al-Qudsi
sumber
Bisakah Anda mengedit pertanyaan dan mengutip baris perintah yang Anda gunakan untuk menambahkan halaman judul ke PDF asli? Lalu saya bisa memberi tahu Anda apa yang harus diubah atau ditambahkan ke commandline untuk mendapatkan hasil yang lebih baik untuk gambar ...
Kurt Pfeifle
Saya tidak ingin hanya membuatnya terlihat lebih baik, saya ingin bergabung tanpa diproses ulang. Ini akan a) menghasilkan kualitas yang lebih baik (transformasi lossless), dan b) tidak membuang waktu CPU memproses dokumen halaman 1000+ saya.
Mahmoud Al-Qudsi
1
Hei, Anda tidak menjawab pertanyaan saya dan Anda tidak mengutip baris perintah GS yang tepat yang Anda gunakan. Yang berarti: Anda tidak akan mendapatkan bantuan mengenai GS yang Anda cari ...
Kurt Pfeifle

Jawaban:

44

Jika Anda hanya ingin menggabungkan dua file PDF tanpa memproses ulang kontennya, pdftkitu untuk Anda. (Pada Mac OS X ini harus tersedia melalui MacPorts atau Fink, untuk Linux, ada paket asli untuk semua distribusi utama; untuk Windows, lihat di sini. ) Coba ini:

 pdftk title.pdf content.pdf cat output book.pdf

Ini akan mengawali title.pdf ke content.pdf dan menulis hasilnya ke book.pdf .

pdftkadalah "bodoh", tetapi cara yang sangat cepat untuk menggabungkan dua (atau lebih) file PDF. "Bodoh" sejauh ini, karena pdftktidak dengan cara apa pun menafsirkan aliran data PDF, itu hanya memastikan bahwa nomor objek internal di-reshuffle sesuai kebutuhan dan muncul dalam xrefstruktur PDF (yang pada dasarnya adalah semacam ToC PDF untuk benda).

Ghostscript:

Jika Anda ingin menggunakan Ghostscript, perintah dasar untuk menggabungkan dua file yang sama adalah:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

Namun, seperti yang Anda alami, baris perintah sederhana ini dapat mengacaukan kualitas gambar Anda. Alasannya adalah bahwa Ghostscript bukan 'dump' ketika memproses PDF: itu sepenuhnya menafsirkannya ketika membaca, dan membuat file yang sama sekali baru saat menuliskan hasilnya. Untuk membuat hasilnya, secara otomatis akan menggunakan pengaturan default untuk banyak detail dalam pemrosesan keseluruhan. Default ini akan berlaku untuk semua kasus di mana pemanggilannya tidak menginstruksikan Ghostscript sebaliknya.

Jadi metode Ghostscript untuk membuat book.pdf baru jauh lebih "cerdas" (tetapi juga jauh lebih lambat) daripada pdftkmetode. (Ini juga alasan mengapa Ghostscript dalam banyak kasus mampu --dalam batas - "memperbaiki" file PDF yang rusak, atau untuk menanamkan font ke dalam output PDF yang tidak tertanam dalam input PDF, atau untuk menghapus duplikat gambar, menggantikan mereka hanya dengan referensi, dll. - dan secara keseluruhan dibuat file yang lebih kecil, lebih baik dioptimalkan dari PDF masukan yang membengkak ...)

Solusinya adalah tidak membiarkan Ghostscript menggunakan defaultnya: dengan menambahkan lebih banyak parameter khusus ke baris perintah.

Apa artinya "Ghostscript 'menginterpretasikan input PDF-nya" ?

Semua file dan isinya (objek, aliran, font, gambar, ...) dibaca, diperiksa, dan disimpan dalam representasi internal sendiri, sebelum memuntahkan PDF yang dihasilkan dengan objek PDF-nya lagi. Namun, ketika 'meludahkan', Ghostscript akan menerapkan semua pengaturan default internal untuk ratusan parameter [*] yang tersedia.

Sayangnya, ini menyebabkan Anda "memproses ulang" gambar sesuai dengan pengaturan default ini - yang hanya dapat dihindari atau diganti dengan menambahkan parameter baris perintah Anda sendiri (yang diinginkan).

Masalah gambar Anda dapat disebabkan oleh kebutuhan Ghostscript (karena masalah lisensi) untuk menyandikan ulang gambar JPEG2000 ke penyandian JPEG. Jika Anda ingin menghindari ini, tambahkan yang berikut ke baris perintah Anda:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

Opsi baris perintah terkait gambar lainnya untuk dipertimbangkan termasuk:

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

Jadi commandline Ghostscript lengkap yang bisa membuat Anda bahagia harus membaca:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

Anda juga bisa memberi tahu Ghostscript untuk tidak mengkompres gambar sama sekali dalam output PDF, dengan menggunakan perintah ini:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf

.


[*]:
Jika Anda tertarik untuk mengetahui daftar lengkap pengaturan default yang digunakan perangkat pdfwrite Ghostscript , jalankan perintah berikut. Ini mengembalikan Anda daftar lengkap :

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

Untuk penjelasan tentang apa sebenarnya arti semua parameter ini, Anda harus membaca dalam dokumentasi Adobe tentang "Parameter Pengurai" . Ghostscript berusaha sangat keras untuk meniru semua ini ...

Kurt Pfeifle
sumber
3
(FYI) Dalam kasus saya, bendera dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagespenyebabnya file output untuk menjadi jauh lebih besar. Dengan menghapusnya, ukuran file berubah dari 22MB menjadi 3.1MB dan kualitas gambar tampaknya sama persis dengan menggunakan flag-flag ini. Semua yang unik bendera dengan saya menggunakan adalah: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Dor
@Kurt Pfeifle Opsi apa yang diizinkan -dColorImageFilter? Saya hanya dapat menemukan FlateEncodedan DCTEncode. DCT tampaknya melakukan JPEG (mengapa mereka mengenkripsi itu?). Saya pikir FLATE adalah pilihan yang sudah ketinggalan zaman untuk gambar sekarang karena paten Bell Labs di LZW tidak lagi menjadi masalah? Namun setelah menghabiskan waktu mencari, saya tidak dapat menemukan cara menggunakan PNG (atau apa pun) ... Gambar asli saya adalah PNG dan saya ingin mereka tetap tidak berubah. Saya mencoba opsi -c, tapi itu memberi saya -c can only be used in a built with POSTSCRIPT included....
Louis Somers