2008-09-17 4 views
10

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

  • 01_foo.pdf
  • 02_bar.pdf
  • 03_baz.pdf
  • т.д.

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

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


Update:Jason Navarrete's suggestion приводят к идеальному решению:

Поместите 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`' 

Большое предложение Джейсон, идеальное решение, спасибо. Дайте ему опрос людей.

ответ

14

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

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

+0

Спасибо, я никогда раньше не встречался с pdftk. Какой замечательный инструмент! – 2008-09-21 16:04:03

0

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

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

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

+1

Благодарим вас за предложения. Мы действительно используем различные инструменты для создания и даже объединения PDF-файлов. Тем не менее, их легко автоматизировать, особенно инструмент, который выполняет объединение, отсюда желание записать его в Ruby (или на другом языке). – 2008-09-17 17:23:39

2

Вы можете сделать это путем преобразования в 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() (только предположение)), который будет вызовите заданную командную строку.

0

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

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

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

-1

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

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

2

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

GS -dBATCH -dNOPAUSE -q -sDEVICE = pdfwrite -sOutputFile = finished.pdf < ваши исходные файлы в формате PDF >

+0

Опция -sPAPERSIZE для gs - полезная информация. Например, -sPAPERSIZE = a4 или -sPAPERSIZE = буква. – 2009-04-29 07:58:28

2

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

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

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

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

Смежные вопросы