Якщо ви просто хочете об'єднати два файли 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 дуже намагається наслідувати всі ці ...