8

所以我们使用heroku 来托管我们的rails 应用程序。我们已经移到了 cedar 堆栈。此堆栈没有安装 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 拆分为 ruby​​ 中的单页文件。没有 PDFTK 有没有办法做到这一点?还是我坚持尝试静态编译 PDFTK?

感谢您的帮助,我知道这不是一个简单的问题,但非常感谢您的帮助。我已经浪费了将近 6 个小时试图让这该死的东西正常工作。

4

5 回答 5

4

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

于 2011-08-21T19:39:07.903 回答
3

简单的解决方案是为 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.10 放入我的应用程序的 /bin 目录中。然后你只需要告诉 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

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

于 2012-09-14T23:59:36.817 回答
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 存储库以及订书机实用程序中。最后我更新了我的代码以使用订书机而不是 pdftk,等等!再次从 Heroku 拆分 PDF。

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

于 2011-12-22T15:24:29.520 回答
1

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

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

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

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

于 2013-05-26T08:25:11.113 回答
0

试试大虾

于 2011-08-20T01:15:34.347 回答