为Heroku静态编译pdftk.需要将PDF分割成单页文件



所以我们使用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. 我只是想把一个多页的PDF分成单页的ruby文件。有没有办法在没有PDFTK的情况下做到这一点?还是我一直在尝试静态编译PDFTK?

谢谢你的帮助,我知道这不是一个容易的问题,但我真的很感谢你的帮助。我已经浪费了将近6个小时来让这该死的东西工作。

不幸的是,Heroku一直在剥离魔法以增加灵活性。因此,感觉越来越像我过去管理和维护自己的服务器的日子了。没有简单的解决办法。我的"猴子补丁"是将文件发送到服务器,我可以安装PDFTK,处理文件并将其发送回来。不是很好,但很有效。必须处理这个问题违背了使用heroku的目的。

简单的解决方案是为pdftk添加一个heroku上没有的依赖项。

$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。然后,你只需要告诉heroku在加载库时查看/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

缺点是我的段塞大小从15.9MB变为27.5MB

我们遇到了同样的问题,我们提出的解决方案是使用订书机代替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中,以及订书机实用程序。最后我更新了我的代码,使用订书机而不是pdftk,再见!再次从Heroku分割pdf文件。

另一种可能更简洁的方法是将其封装在gem中(http://news.ycombinator.com/item?id=2816783)

我在SO上读过一个类似的问题,并且发现Ryan Daigle的方法对我也很有效:与其构建难以与Heroku服务器匹配的本地二进制文件,不如使用远程环境来编译和构建所需的依赖项。这是使用火神宝石来完成的,它是由Heroku提供的。

Ryan的文章"为Heroku应用程序构建依赖二进制文件"

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

附带说明一下,如果Heroku的底层环境发生了足够的变化,这两种方法都会导致二进制文件中断。

试试虾

最新更新