Можно ли объединить серию PDF-файлов в один, используя Ruby?
-
01-07-2019 - |
Вопрос
У меня есть серия PDF-файлов, названных последовательно следующим образом:
- 01_foo.pdf
- 02_bar.pdf
- 03_baz.pdf
- и т.д.
Используя Ruby, можно ли объединить их в один большой PDF-файл, сохраняя при этом их последовательность?Я не возражаю против установки любых необходимых драгоценных камней для выполнения этой работы.
Если это невозможно в Ruby, как насчет другого языка?По возможности, никаких коммерческих компонентов.
Обновить: Предложение Джейсона Наваррете привести к идеальному решению:
Поместите PDF-файлы, которые необходимо объединить, в каталог вместе с pdftk (или убедитесь, что pdftk находится на вашем ПУТИ), затем запустите следующий скрипт:
pdfs = Dir["[0-9][0-9]_*"].sort.join(" ")
`pdftk #{pdfs} output combined.pdf`
Или я мог бы даже сделать это как однострочник из командной строки:
ruby -e '`pdftk #{Dir["[0-9][0-9]_*"].sort.join(" ")} output combined.pdf`'
Отличное предложение, Джейсон, идеальное решение, спасибо. Проголосуйте за него, люди.
Решение
A Рубиновый ток post предлагает использовать pdftk инструментарий для объединения PDF-файлов.
Вызвать его должно быть относительно просто pdftk как внешний процесс и попросите его обработать слияние. PDF::Писатель может быть, это излишество, потому что все, чего вы хотите добиться, - это простое добавление.
Другие советы
Вы можете сделать это, преобразовав в PostScript и обратно.Файлы PostScript могут быть объединены тривиальным образом.Например, вот скрипт Bash, который использует инструменты Ghostscript ps2pdf и pdf2ps:
#!/bin/bash for file in 01_foo.pdf 02_bar.pdf 03_baz.pdf; do pdf2ps $file - >> temp.ps done ps2pdf temp.ps output.pdf rm temp.ps
Я не знаком с Ruby, но там почти наверняка есть какая-то функция (может быть вызвана system()
(просто предположение)), которое вызовет заданную командную строку.
Если у вас есть ghostscript на вашей платформе, раскошелитесь и выполните эту команду:
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=готово.pdf <your source="" pdf="" files="">
Я попробовал решение pdftk, и у меня возникли проблемы как со SnowLeopard, так и с Tiger.Установка на Tiger фактически привела к хаосу в моей системе и лишила меня возможности запускать скрипт / сервер, к счастью, это машина, снятая с веб-разработки.
Впоследствии был найден другой вариант:- Присоединяйтесь к PDF.Установка была абсолютно безболезненной и быстрой, и она работает безукоризненно.
Также попробовал GhostScript, и он с треском провалился (не удалось прочитать шрифты, и в итоге я получил PDF-файлы, в которых были только изображения).
Но если вы ищете решение этой проблемы, возможно, вам захочется попробовать joinPDF.
Я не думаю, что у Ruby есть инструменты для этого.Вы могли бы проверить ImageMagick и Cairo.ImageMagick можно использовать для связывания нескольких изображений / документов вместе, но я не уверен в случае с PDF.
С другой стороны, наверняка существуют инструменты Windows (коммерческие) для выполнения подобных действий.
Я сам использую Cairo для генерирующий PDF-файлы.Если PDF-файлы исходят от вас, возможно, это было бы решением (он поддерживает несколько страниц).Удачи вам!
Я бы предложил взглянуть на код для PDFCreator (VB, если я не ошибаюсь, но это не должно иметь значения, поскольку вы просто реализуете аналогичный код на другом языке), который использует GhostScript (лицензия GNU).Или просто покопайтесь прямо в самом GhostScript;также доступен фасадный слой под названием GhostPDF, который может делать то, что вы хотите.
Если вы можете управлять GhostScript с помощью VB, вы можете делать это с помощью C, что означает, что вы можете делать это с помощью Ruby.
В Ruby также есть IO.popen, который позволяет вам вызывать внешние программы, которые могут это делать.
Любой Ruby-код, позволяющий сделать это в реальном приложении, вероятно, будет мучительно медленным.Я бы попытался найти инструменты unix для выполнения этой работы.Это одна из прелестей использования Mac OS X, в нее встроены очень быстрые возможности PDF.Следующая лучшая вещь - это, вероятно, инструмент unix.
На самом деле, я добился некоторого успеха с rtex.Если вы посмотрите здесь вы найдете кое-какую информацию об этом.Это намного быстрее, чем любая библиотека Ruby, которую я использовал, и я почти уверен, что в latex есть функция для переноса PDF-данных из других источников.