Використовуйте Ghostscript, але скажіть це, щоб не переробляти зображення?


30

У мене є PDF, який вже стиснув і дещо артефакт-y зображення, і я використовую Ghostscript, щоб додати титульну сторінку до цього PDF.

Однак я не можу знайти спосіб сказати GS просто використовувати наявні зображення як є, не переробляючи їх, і тепер я відчуваю, ніби це щось пов'язане з тим, як працює GS, тобто ви не можете перекомпілювати / зв'язати PDF не переробляючи його зображення .. Це правда?

Я можу підняти налаштування DPI в GS, але він піде від 5MB до 60MB, але все ще виглядає гірше.

Чи є краща альтернатива GS, яка зробить те, що мені потрібно (бажано, що буде компілюватися в OS X)?


Чи можете ви відредагувати своє запитання та вказати точний командний рядок, який ви використовуєте, щоб додати свою титульну сторінку до оригінального PDF? Тоді я міг би сказати вам, що саме потрібно змінити або додати до командного рядка, щоб отримати кращий вихід для зображень ...
Kurt Pfeifle

Я не хочу, щоб це просто виглядало краще, я хочу злитися без повторної обробки. Це призведе до а) кращої якості (перетворення без втрат) і б) не витрачати години процесорного часу на обробку документа на 1000+ сторінок.
Махмуд Аль-Кудсі

1
Гей, ти не відповів на моє запитання і не вказав точний командний рядок GS, який ти використовуєш. Що означає: Ви не отримаєте допомоги стосовно GS, яку шукаєте ...
Kurt Pfeifle

Відповіді:


44

Якщо ви просто хочете об'єднати два файли PDF, не переробляючи його вміст, pdftkдля вас. (На Mac OS X це повинно бути доступно через MacPorts або Fink; для Linux є рідні пакети для всіх основних дистрибутивів; для Windows дивіться тут. ) Спробуйте це:

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

Це додасть title.pdf до content.pdf і запише результат у book.pdf .

pdftkце "німий", але дуже швидкий спосіб об'єднання двох (або більше) файлів PDF. "Тупий" настільки, pdftkщо жодним чином не інтерпретує потік даних PDF, він просто гарантує, що внутрішні номери об'єктів будуть перестановлені за необхідною зміною та відображаються в xrefструктурі PDF (що в основному є свого роду PDF ToC для об’єкти).

Привид:

Якщо ви хочете використовувати Ghostscript, основною командою для об'єднання двох тих самих файлів буде:

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

Однак, як ви переживали, цей простий командний рядок може зіпсувати якість вашого зображення. Причина полягає в тому, що Ghostscript не «скидається» під час обробки PDF-файлів: він повністю інтерпретує їх під час читання та створює абсолютно новий файл, коли виписує результат. Для створення результату автоматично використовуватиме налаштування за замовчуванням для багатьох деталей у загальній обробці. Ці параметри за замовчуванням застосовуються для всіх випадків, коли його виклики не вказували Ghostscript інакше.

Таким чином, метод Ghostscript для створення нового book.pdf набагато "розумніший" (але також набагато повільніше), ніж pdftkметод 's. (Це також причина, чому Ghostscript у багатьох випадках здатний - з обмеженнями - "відновити" файли PDF b0rken або вставити шрифти у вихідні PDF-файли, які не вбудовані у вхідні PDF-файли, або видалити повторювані зображення, замінивши їх за допомогою простих посилань тощо - і загалом створені менші, краще оптимізовані файли з розширених вхідних PDF-файлів ...)

Рішення полягає в тому, щоб не дозволити Ghostscript використовувати його за замовчуванням: додавши більше спеціальних параметрів до командного рядка.

Що означає "Ghostscript" інтерпретує "його введення в PDF" ?

Весь файл та його вміст (об’єкти, потоки, шрифти, зображення, ...) зачитуються, перевіряються та зберігаються у своєму внутрішньому представленні, перш ніж знову виплюнути отриманий PDF своїми об’єктами PDF. Однак, коли "випльовується", Ghostscript застосує всі свої внутрішні параметри за замовчуванням для сотень параметрів [*], які є в наявності.

На жаль, це спричиняє вашу "переробку" зображень відповідно до цих налаштувань за замовчуванням - чого можна уникнути або змінити лише додавши власні (бажані) параметри командного рядка.

Ваші проблеми із зображенням можуть бути викликані потребою Ghostscript (через проблеми з ліцензуванням) перекодувати зображення JPEG2000 до кодування JPEG. Якщо ви хочете цього уникнути, додайте до командного рядка наступне:

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

Інші варіанти командного рядка, пов'язані із зображенням, які слід врахувати, зокрема:

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

Тож повний командний рядок Ghostscript, який може зробити вас щасливим, повинен прочитати:

 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

Ви також можете сказати Ghostscript НЕ стискати зображення взагалі у вихідному PDF, використовуючи цей командний рядок:

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

.


[*]:
Якщо вам цікаво дізнатися про повний список налаштувань за замовчуванням, якими використовується пристрій pdfwrite Ghostscript , виконайте наступну команду. Він повертає вам повний список:

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

Щоб пояснити, що саме означають усі ці параметри, вам доведеться ознайомитися в документації Adobe про "Параметри дистилятора" . Ghostscript дуже намагається наслідувати всі ці ...


3
(FYI) У моєму випадку, прапори dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagesтому що вихідний файл , щоб стати набагато більш масивними. Видаляючи їх, розмір файлу змінився з 22 МБ на 3,1 МБ, і якість зображення виглядає точно так само, як і з використанням цих прапорів. Всі унікальні прапори з I користь: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Дор

@Kurt Pfeifle Які параметри дозволені -dColorImageFilter? Я можу лише знайти FlateEncodeі DCTEncode. Здається, DCT робить JPEG (чому вони зашифрували це?). Я думаю, що FLATE - це застарілий варіант для зображень, оскільки патент Bell Labs на LZW вже не є проблемою? Однак, витративши багато часу на пошук, я не можу знайти, як використовувати PNG (або що-небудь інше) ... Мої оригінальні зображення - це PNG, і я хочу, щоб вони залишалися незмінними. Я спробував варіант -c, але це дає мені -c can only be used in a built with POSTSCRIPT included....
Луї Сомерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.