Объединить PDF и удалить страницы в один проход
Я хотел бы объединить документы PDF без потери какой-либо информации (передискретизация изображений и т. Д.). Я только хочу делать сжатия без потерь, объединять шрифты и т. Д.
Перед слиянием я хотел бы удалить первую и последнюю страницу каждого документа. Как я могу объединить это с процессом слияния, чтобы мне не нужно было запускать каждый файл дважды через gs?
Чтобы объединить, я использую команду из этого превосходного ответа. Я добавил dPDFSETTINGS=\prepress. Я не уверен, если это необходимо или хорошая идея.
gs \
-o book.pdf \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dEncodeColorImages=false \
-dEncodeGrayImages=false \
-dEncodeMonoImages=false \
title.pdf \
content.pdf
Обновить:
Я попробовал команду выше (без удаления страниц) на некоторых реальных файлах, и она работает очень медленно.
gswin32c.exe -dBATCH -dNOPAUSE -o temp.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dColorConve
rsionStrategy=/LeaveColorUnchanged -dEncodeColorImages=false -dEncodeGrayImages=false -dEncodeMonoImages=false [list of pdf files] pdfmark
Выполнение вышеуказанной команды для 20 файлов размером 2 МБ создает почти 2 ГБ временных файлов, а затем выполняется крайне медленно с небольшим использованием ЦП и большой нагрузкой на жесткий диск. Это занимает около 20 минут, а размер выходного файла составляет 800 МБ.
Я получаю это сообщение об ошибке: GPL Ghostscript 9.10: Отсутствует глиф CID=0, глиф =0028 в шрифте HiddenHorzOCR . Вывод PDF может не получиться у некоторых зрителей.
С другой стороны, pdftk запускается за 30 секунд, а размер выходного файла составляет 40 МБ. Добавление закладок с помощью gs занимает еще одну минуту и уменьшает размер файла до 30 МБ.
gswin32c.exe -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf pdftk.pdf pdfmark
Есть ли недостатки использования pdftk? Я хотел бы сохранить изображения точно такого же качества, не теряя деталей и не делая файлы чрезмерно большими. В противном случае мне все равно, в основном это отсканированные научные статьи и главы из книг. Страницы, которые я хотел бы удалить, являются титульными страницами, которые были отсканированы с каждой статьей, одна спереди и одна в конце.
1 ответ
Что касается вашего обновления: pdftk
сохраняет настройки качества изображения, но не метаданные, маркеры глав и т. д.
sejda
это новый набор инструментов для редактирования PDF, который может делать все, что может pdftk и многое другое. Самое главное, что он сохраняет все настройки качества и большую часть метаданных файла. Сейда требует Java для работы.
Вот документация по действиям слияния:
$sejda merge -h
Given a collection of pdf documents, creates a single output pdf document composed by the selected pages of each input document taken in the given order.
Example usage: sejda-console merge -f /tmp/file1.pdf /tmp/file2.pdf -o /tmp/output.pdf -s all:12-14:32,12-14,4,34-:
Usage: sejda-console merge options
[--addBlanks] : add a blank page after each merged document if the number of pages is odd (optional)
--bookmarks -b value : bookmarks merge policy. {discard, retain, one_entry_each_doc }. Default is 'retain' (optional)
[--compressed] : compress output file (optional)
[--copyFields] : input pdf documents contain forms (high memory usage) (optional)
[--directory -d value] : directory containing pdf files to merge. Files will be merged in alphabetical order. (optional)
[--files -f value...] : pdf files to operate on: a list of existing pdf files (EX. -f /tmp/file1.pdf or -f /tmp/password_protected_file2.pdf:secret123) (optional)
[--filesListConfig -l value] : xml or csv file containing pdf files list to concat. If csv file in comma separated value format; if xml file <filelist><file value="filepath" /></filelist> (optional)
[--help -h] : prints usage information. Can be used to detail options for a command '-h command' (optional)
[--matchingRegEx -e value] : regular expression the file names have to match when the directory input is used (Ex -e "test(.*).pdf"). (optional)
--output -o value : output file (required)
[--overwrite] : overwrite existing output file (optional)
--pageSelection -s value : page selection script. You can set a subset of pages to merge as a colon separated list of page selections. Order of the pages is relevant. Accepted values: 'all' or 'num1-num2' or 'num-' or 'num1,num2-num3..'
(EX. -f /tmp/file1.pdf /tmp/file2.pdf -s all:all:), (EX. -f /tmp/file1.pdf /tmp/file2.pdf /tmp/file3.pdf -s all:12-14:32,12-14,4,34-:) to merge file1.pdf, pages 12,13,14 of file2.pdf and pages 32,12,13,14,4,34,35.. of file3.pdf.
If -s is not set default behaviour is to merge document completely (optional)
--pdfVersion -v value : pdf version of the output document/s {2, 3, 4, 5, 6 or 7}. Default is 6. (optional)
Допустим, у вас есть два файла PDF, file1.pdf и file2.pdf, каждый длиной 50 страниц, и вы хотели бы объединить их, оставляя при этом первую и последнюю страницы в каждом случае. Эта команда должна сделать трюк:
sejda-console merge -f file1.pdf file2.pdf -o merge.pdf -s 2-49:2-49:
Примечание. Возможно, вам придется заменить sejda-console
с sejda-console.bat
если вы на Windows.
Как видите, вам все равно придется вручную указывать диапазон страниц для каждого документа. Если вы хотите автоматизировать это, вы можете написать скрипт bash или что-то похожее, чтобы сначала рассчитать количество страниц PDF (например, с помощью libpoppler's pdfinfo
), а затем составить sejda
командная строка соответственно.