Статически скомпилируйте pdftk для Heroku.Нужно разбить PDF на отдельные файлы подкачки - PullRequest
8 голосов
/ 20 августа 2011

Итак, мы используем 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 на одностраничные файлы в ruby. Есть ли способ сделать это без PDFTK? Илия застрял с попыткой статической компиляции PDFTK?

Спасибо за помощь, я знаю, что это не простая проблема, но я был бы очень признателен за помощь с этим. Я потерял около 6часы, пытаясь заставить эту чертову штуку работать.

Ответы [ 5 ]

4 голосов
/ 21 августа 2011

К сожалению, Heroku продолжает убирать магию, чтобы добавить гибкости. В результате это все больше и больше напоминает дни, когда я использовал для управления и обслуживания своих собственных серверов. Нет простого решения. Мой «патч обезьяны» - отправить файл на сервер, на котором я могу установить PDFTK, обработать файл и отправить его обратно. Не отлично, но это работает. Необходимость бороться с этим побеждает цель использования heroku.

3 голосов
/ 15 сентября 2012

Самое простое решение - добавить одну зависимость для 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 моего приложения.Затем вам просто нужно сказать героку, чтобы он смотрел каталог / 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,9 МБ до 27,5 МБ

2 голосов
/ 22 декабря 2011

Мы столкнулись с той же проблемой, решение, которое мы придумали, заключалось в том, чтобы вместо этого использовать Stapler https://github.com/hellerbarde/stapler, это утилита python, для которой требуется только установка дополнительного модуля (pyPdf) в Heroku.

Я был ориентирован на эту запись в блоге: 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, et voilà!Повторное разделение PDF-файлов из Heroku.

Другой способ, возможно более чистый, заключался бы в инкапсуляции его в драгоценный камень (http://news.ycombinator.com/item?id=2816783)

1 голос
/ 26 мая 2013

Я прочитал аналогичный вопрос по SO и нашел этот подход Райана Дейгла , который также работал для меня: вместо создания локальных двоичных файлов, которые трудно сопоставить с серверами Herokuиспользуйте удаленную среду для компиляции и построения необходимых зависимостей.Это достигается с помощью Vulcan gem , предоставленного Heroku.

Статья Райана "Создание бинарных файлов зависимостей для приложений Heroku"

Другой подход от Jon Magic (не проверенный мной) заключается в загрузке и компиляции зависимости непосредственно через Heroku bash, например, непосредственно на сервере: "Компиляция исполняемых файлов в Heroku" .

С другой стороны, оба подхода приведут к двоичным файлам, которые сломаются, если базовая среда Heroku изменится достаточно.

0 голосов
/ 20 августа 2011

Попробуйте креветка .

...