Можно ли объединить серию PDF-файлов в одну, используя Ruby?

У меня есть серия PDF-файлов, названных так:

  • 01_foo.pdf
  • 02_bar.pdf
  • 03_baz.pdf
  • и т.п.

Используя Ruby, возможно ли объединить их в один большой PDF, сохраняя их в последовательности? Я не против установить какие-либо необходимые драгоценные камни, чтобы сделать работу.

Если это невозможно в Ruby, как насчет другого языка? Нет коммерческих компонентов, если это возможно.


Обновление: предложение Джейсона Наваррета привело к идеальному решению:

Поместите файлы PDF, которые необходимо объединить, в каталог вместе с pdftk (или убедитесь, что pdftk находится в вашей переменной PATH), затем запустите следующий скрипт:

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`'

Отличное предложение Джейсон, идеальное решение, спасибо. Дайте ему возможность проголосовать.

7 ответов

Решение

В статье на Ruby-Talk предлагается использовать инструментарий pdftk для объединения PDF-файлов.

Должно быть относительно просто вызвать pdftk как внешний процесс и заставить его обрабатывать слияние. PDF:: Writer может быть излишним, потому что все, что вы хотите сделать, это простое приложение.

Если на вашей платформе есть ghostscript, выполните оболочку и выполните следующую команду:

gs -dBATCH -dNOPAUSE -q -sDEVICE = pdfwrite -sOutputFile = законченный.pdf <исходные pdf-файлы>

Вы можете сделать это путем преобразования в PostScript и обратно. Файлы PostScript могут быть объединены тривиально. Например, вот скрипт Bash, который использует инструменты Ghostscript ps2pdf и pdf2ps:

#! / Bin/ Баш
для файла в 01_foo.pdf 02_bar.pdf 03_baz.pdf; делать
    pdf2ps $file - >> temp.ps
сделанный

ps2pdf temp.ps output.pdf
рм темп.пс

Я не знаком с Ruby, но почти наверняка есть какая-то функция (может вызываться system() (только предположение), что вызовет данную командную строку.

Я попробовал решение pdftk, и у меня были проблемы как на SnowLeopard, так и на Tiger. Установка на Tiger фактически привела к хаосу в моей системе и не позволила мне запустить скрипт / сервер, к счастью, это машина, отошедшая от веб-разработки.

Впоследствии нашел другой вариант: - joinPDF. Была абсолютно безболезненная и быстрая установка и работает отлично.

Также попробовал GhostScript, и он с треском провалился (не смог прочитать шрифты, и я получил PDF-файлы, которые имели только изображения).

Но если вы ищете решение этой проблемы, вы можете попробовать joinPDF.

Я бы посоветовал взглянуть на код для PDFCreator (VB, если я не ошибаюсь, но это не имеет значения, поскольку вы просто реализуете подобный код на другом языке), который использует GhostScript (лицензия GNU). Или просто покопаться в самом GhostScript; есть также доступный фасадный слой под названием GhostPDF, который может делать то, что вы хотите.

Если вы можете управлять GhostScript с помощью VB, вы можете сделать это с C, что означает, что вы можете сделать это с Ruby.

В Ruby также есть IO.popen, который позволяет вам вызывать внешние программы, которые могут это делать.

Я не думаю, что у Руби есть инструменты для этого. Вы можете проверить ImageMagick и Каир. ImageMagick можно использовать для связывания нескольких изображений / документов вместе, но я не уверен насчет случая PDF.

Опять же, есть, безусловно, инструменты Windows (коммерческие) для такого рода вещей.

Я сам использую Каир для создания PDF. Если PDF-файлы исходят от вас, возможно, это будет решением (он поддерживает несколько страниц). Удачи!

Любой код Ruby для этого в реальном приложении, вероятно, будет мучительно медленным. Я попытался бы выследить инструменты Unix, чтобы сделать работу. Это одна из прелестей использования Mac OS X, она имеет очень быстрые встроенные возможности PDF. Следующая лучшая вещь, вероятно, инструмент Unix.

На самом деле, у меня был некоторый успех с rtex. Если вы посмотрите здесь, вы найдете информацию об этом. Это намного быстрее, чем любая библиотека Ruby, которую я использовал, и я уверен, что в латексе есть функция для ввода данных PDF из других источников.

Другие вопросы по тегам