是否可以使用Ruby将一系列PDF合并为一个?
我有一系列依次命名的PDF,如下所示:
- 01_foo.pdf
- 02_bar.pdf
- 03_baz.pdf
- 等等。
使用Ruby,是否可以将它们组合成一个大的PDF,同时保持它们的顺序?我不介意安装任何必要的宝石来完成这项工作。
如果在Ruby中无法做到这一点,那么另一种语言呢?如果可能,没有商业组件。
更新:Jason Navarrete的建议导致了完美的解决方案:
将需要合并的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`'
很棒的建议杰森,完美的解决方案,谢谢。给他一个有投票权的人。
解决方案
回答
我认为Ruby没有为此提供工具。我们可以检查ImageMagick和Cairo。 ImageMagick可用于将多个图片/文档绑定在一起,但是我不确定PDF的情况。
再说一次,肯定有Windows工具(商业)可以做这种事情。
我自己使用Cairo生成PDF。如果PDF是由我们提供的,则可能是一种解决方案(它确实支持多页)。祝你好运!
回答
我们可以通过转换为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()
(只是一个猜测))将调用给定的命令行。
回答
我建议我们看一下使用GhostScript(GNU许可证)的PDFCreator(VB,如果我没记错的话,但这没关系,因为我们只是用另一种语言实现类似的代码)。或者直接深入研究GhostScript本身;还有一个名为GhostPDF的外观层,可以完成我们想要的操作。
如果可以用VB控制GhostScript,则可以用C进行控制,这意味着可以用Ruby进行控制。
Ruby还具有IO.popen,它允许我们调出可以执行此操作的外部程序。
回答
Ruby-Talk帖子建议使用pdftk工具包合并PDF。
将pdftk称为外部进程并让其处理合并应该相对简单。 PDF :: Writer可能会过大,因为我们要完成的只是一个简单的追加。
回答
任何在实际应用程序中执行此操作的Ruby代码都可能会非常缓慢。我会尝试寻找unix工具来完成这项工作。这是使用Mac OS X的优点之一,它内置了非常快的PDF功能。接下来最好的事情可能是unix工具。
实际上,我在rtex上取得了一些成功。如果我们在这里查看,我们会发现一些有关它的信息。它比我使用过的任何Ruby库都快得多,而且我敢肯定,latex具有从其他来源导入PDF数据的功能。
回答
如果平台上有ghostscript,请掏出外壳并执行以下命令:
gs -dBATCH -dNOPAUSE -q -sDEVICE = pdfwrite -sOutputFile = finished.pdf <原始pdf文件>
回答
我尝试了pdftk解决方案,并且在SnowLeopard和Tiger上都遇到了问题。实际上,在Tiger上安装会严重破坏我的系统,使我无法运行脚本/服务器,所幸的是,这是一台从Web开发中退出的机器。
随后找到了另一个选择:joinPDF。绝对轻松快捷地安装,并且完美运行。
还尝试了GhostScript,它失败了(无法读取字体,我最终得到了仅包含图像的PDF)。
但是,如果我们正在寻找解决此问题的方法,则可以尝试使用joinPDF。