为Heroku静态编译pdftk。需要将PDF拆分为单页文件

时间:2011-08-20 01:02:01

标签: ruby pdf heroku split pdftk

所以我们使用heroku来托管我们的rails应用程序。我们搬到了雪松堆里。此堆栈没有安装pdftk库。我联系了支持部门并被告知要将其静态编译为amd64 ubuntu并将其包含在我的应用程序中。

事实证明这比我想象的要困难得多。最初我下载了ubuntu(http://packages.ubuntu.com/natty/pdftk)的软件包,将其解压缩,并包含二进制文件和共享库。我遇到了一些奇怪的错误:

Unhandled Java Exception:
java.lang.NullPointerException
   at com.lowagie.text.pdf.PdfCopy.copyIndirect(pdftk)
   at com.lowagie.text.pdf.PdfCopy.copyObject(pdftk)
   at com.lowagie.text.pdf.PdfCopy.copyDictionary(pdftk)

我假设这是因为没有安装某些依赖项?

所以这是我的问题:

  1. 是否有更简单的方法来静态编译库?或者我是否需要移动其二进制文件及其所有库和依赖项?
  2. 我只是想将多页PDF分成红宝石中的单页文件。有没有办法在没有PDFTK的情况下做到这一点?或者我是不是试图静态编译PDFTK?
  3. 感谢您的帮助,我知道这不是一个简单的问题,但非常感谢您对这个问题的帮助。我浪费了近6个小时试图让这该死的东西起作用。

5 个答案:

答案 0 :(得分:4)

不幸的是,Heroku不断剥离魔法以增加灵活性。结果,感觉越来越像我以前管理和维护自己的服务器的日子。没有简单的解决方案。我的“猴子补丁”是将文件发送到我可以安装PDFTK的服务器,处理该文件并将其发回。不是很好,但它确实有效。不得不处理这个问题会破坏使用heroku的目的。

答案 1 :(得分:3)

简单的解决方案是添加一个在heroku上找不到的pdftk依赖项。

$ldd pdftk
    linux-vdso.so.1 =>  (0x00007ffff43ca000)
    libgcj.so.10 => not found
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f1d26d48000)
    libm.so.6 => /lib/libm.so.6 (0x00007f1d26ac4000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f1d268ad000)
    libc.so.6 => /lib/libc.so.6 (0x00007f1d2652a000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007f1d2630c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1d27064000)

我将pdftk和libgcj.so.10放入我的应用程序的/ bin目录中。然后你只需要告诉heroku在加载libs时查看/ bin目录。

您可以输入

$heroku config
LD_LIBRARY_PATH:             /app/.heroku/vendor/lib
LIBRARY_PATH:                /app/.heroku/vendor/lib

要查看当前LD_LIBRARY_PATH的设置,然后添加/ app / bin(或者您选择存储libgcj.so.10的任何目录)。

$heroku config:set LD_LIBRARY_PATH=/app/.heroku/vendor/lib:/app/bin

不利的一面是我的slu size大小从15.9MB变为27.5MB

答案 2 :(得分:2)

我们遇到了同样的问题,我们提出的解决方案是使用Stapler而不是https://github.com/hellerbarde/stapler,它是一个python实用程序,只需要在Heroku上安装额外的模块(pyPdf)。

我一直关注这个博客文章:http://theprogrammingbutler.com/blog/archives/2011/07/28/running-pdftotext-on-heroku/

以下是我安装pyPdf的步骤:

访问heroku bash控制台

heroku run bash

安装最新版本的pyPdf

cd tmp
curl http://pybrary.net/pyPdf/pyPdf-1.13.tar.gz -o pyPdf-1.13.tar.gz
tar zxvf pyPdf-1.13.tar.gz
python setup.py install --user

这会将所有必需的文件放在应用程序根目录下的.local文件下。我刚下载它并将其添加到我们的git repo以及stapler实用程序中。最后我更新了我的代码以使用订书机而不是pdftk,etvoilà!再次从Heroku拆分PDF文件。

另一种方式,可能更清晰,就是将其封装在gem(http://news.ycombinator.com/item?id=2816783

答案 3 :(得分:1)

我读了a similar question on SO,发现this approach by Ryan Daigle对我也很有用:不是构建难以匹配Heroku服务器的本地二进制文件,而是使用远程环境编译和构建所需的依赖项。这是使用Heroku提供的Vulcan gem完成的。

Ryan's article "Building Dependency Binaries for Heroku Applications"

Jon Magic的另一种方法(我未经测试)是直接通过Heroku的bash下载和编译依赖项,例如直接在服务器上:"Compiling Executables on Heroku"

另一方面,如果Heroku的底层环境发生了足够的变化,这两种方法都会导致二进制文件破裂。

答案 4 :(得分:0)

尝试prawn