是否可以使用Ruby将一系列PDF合并为一个?

时间:2008-09-17 17:10:02

标签: ruby language-agnostic pdf

我有一系列按顺序命名的PDF:

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

使用Ruby,是否可以将这些组合成一个大的PDF,同时保持它们的顺序?我不介意安装任何必要的宝石来完成这项工作。

如果在Ruby中无法做到这一点,那么另一种语言呢?如果可能的话,没有商业组件。


更新: 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`'

很好的建议杰森,完美的解决方案,谢谢。 给他一个投票的人

7 个答案:

答案 0 :(得分:14)

Ruby-Talk帖子建议使用 pdftk 工具包合并PDF。

pdftk 作为外部进程调用并让它处理合并应该相对简单。 PDF :: Writer 可能有点过分,因为你想要完成的只是一个简单的追加。

答案 1 :(得分:2)

您可以通过转换为PostScript并返回来完成此操作。 PostScript文件可以简单连接。例如,这是一个使用Ghostscript工具ps2pdf和pdf2ps的Bash脚本:

#!/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()(只是猜测))会调用给定的命令行。

答案 2 :(得分:2)

如果您的平台上有ghostscript,请执行以下命令并执行此命令:

gs -dBATCH -dNOPAUSE -q -sDEVICE = pdfwrite -sOutputFile = finished.pdf< your source pdf files>

答案 3 :(得分:2)

我尝试了pdftk解决方案并且在SnowLeopard和Tiger上都遇到了问题。在Tiger上安装实际上对我的系统造成了严重破坏,让我无法运行脚本/服务器,幸运的是,这是一台从Web开发中退出的机器。

随后找到另一个选项: - joinPDF。是一个绝对无痛和快速安装,它的工作完美。

还尝试了GhostScript,它失败了(无法读取字体,我最终得到了只有图像的PDF)。

但是,如果您正在寻找此问题的解决方案,您可能想尝试joinPDF。

答案 4 :(得分:0)

我不认为Ruby有这方面的工具。你可以查看ImageMagick和Cairo。 ImageMagick可用于将多张图片/文档绑定在一起,但我不确定PDF格式。

然后,肯定有Windows工具(商业)可以做这种事情。

我自己使用Cairo来生成 PDF。如果PDF来自你,也许这将是一个解决方案(它确实支持多个页面)。祝你好运!

答案 5 :(得分:0)

我建议查看PDFCreator的代码(VB,如果我没有弄错,但这应该不重要,因为你只是用另一种语言实现类似的代码),它使用GhostScript(GNU许可证) 。或者直接挖掘GhostScript本身;还有一个名为GhostPDF的外观层,它可以做你想要的。

如果你可以用VB控制GhostScript,你可以用C来做,这意味着你可以用Ruby来做。

Ruby还有IO.popen,它允许你调用可以执行此操作的外部程序。

答案 6 :(得分:-1)

任何在真实应用程序中执行此操作的Ruby代码可能会非常缓慢。我会尝试寻找unix工具来完成这项工作。这是使用Mac OS X的优点之一,它内置了非常快的PDF功能。下一个最好的事情可能是unix工具。

实际上,我在rtex方面取得了一些成功。如果您查看here,您会找到有关它的一些信息。它比我使用的任何Ruby库快得多,我非常确定latex有一个从其他来源引入PDF数据的功能。