ruby - recortar - Estáticamente compilar pdftk para Heroku. Necesidad de dividir PDF en archivos de una sola página
recortar pdf ubuntu (5)
Prueba gambas
Así que estamos usando heroku para alojar nuestra aplicación de rieles. Nos hemos movido a la pila de cedro. Esta pila no tiene la biblioteca pdftk instalada. Me puse en contacto con el soporte y me dijeron que lo compilara estáticamente para amd64 ubuntu y lo incluyera en mi aplicación.
Esto ha resultado ser más difícil de lo que pensaba. Inicialmente descargué el paquete para ubuntu ( http://packages.ubuntu.com/natty/pdftk ), lo extraje e incluí el archivo binario y las bibliotecas compartidas. Estoy recibiendo errores extraños como:
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)
Supongo que esto se debe a que algunas de las dependencias no están instaladas.
Asi que aqui están mis preguntas:
- ¿Hay alguna manera más fácil de compilar estáticamente una biblioteca? ¿O necesito moverme sobre su archivo binario y todas sus bibliotecas y dependencias?
- Solo trato de dividir un PDF de varias páginas en archivos de una sola página en ruby. ¿Hay alguna manera de hacer esto sin PDFTK? ¿O estoy atrapado en intentar compilar estáticamente PDFTK?
Gracias por la ayuda, sé que este no es un problema fácil, pero realmente agradecería ayuda con este. He perdido cerca de 6 horas tratando de hacer que esta maldita cosa funcione.
Desafortunadamente, Heroku sigue eliminando magia para agregar flexibilidad. Como resultado, se parece cada vez más a los días en que solía administrar y mantener mis propios servidores. No hay una solución fácil. Mi "parche de mono" es enviar el archivo a un servidor que puedo instalar PDFTK, procesar el archivo y enviarlo de regreso. No es genial, pero funciona. Tener que lidiar con esto derrota el propósito de usar heroku.
Hemos encontrado el mismo problema, la solución que se nos ocurrió fue utilizar Stapler en su lugar https://github.com/hellerbarde/stapler , es una utilidad de python y solo requiere un módulo adicional para ser instalado (pyPdf) en Heroku.
He sido orientado a esta entrada de blog: http://theprogrammingbutler.com/blog/archives/2011/07/28/running-pdftotext-on-heroku/
Estos son los pasos que seguí para instalar pyPdf:
Accediendo a la consola heroku bash
heroku run bash
Instalando la última versión de 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
Esto coloca todos los archivos necesarios debajo de un archivo .local en la raíz de la aplicación. Acabo de descargarlo y lo agregué a nuestro repositorio git, así como a la utilidad de la grapadora. Finalmente actualicé mi código para usar grapadora en lugar de pdftk, et voilà! División de archivos PDF de Heroku nuevamente.
Otra forma, probablemente más limpia, sería encapsularla en una gema ( http://news.ycombinator.com/item?id=2816783 )
La solución fácil es agregar la única dependencia para pdftk que no se encuentra en 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)
Pongo pdftk y libgcj.so.10 en el directorio / bin de mi aplicación. Entonces solo necesitas decirle a heroku que mire el directorio / bin al cargar libs.
Puedes escribir
$heroku config
LD_LIBRARY_PATH: /app/.heroku/vendor/lib
LIBRARY_PATH: /app/.heroku/vendor/lib
Para ver en qué está establecida su LD_LIBRARY_PATH actual y luego agregue / app / bin (o el directorio que elija para almacenar libgcj.so.10) en ella.
$heroku config:set LD_LIBRARY_PATH=/app/.heroku/vendor/lib:/app/bin
El lado negativo es que mi tamaño de bala pasó de 15.9MB a 27.5MB
Leí una pregunta similar sobre SO , y descubrí que este enfoque de Ryan Daigle también funcionó para mí: en lugar de crear binarios locales difíciles de combinar con los servidores de Heroku, use el entorno remoto para compilar y construir las dependencias requeridas. Esto se logra utilizando la gema Vulcan , que es proporcionada por Heroku.
Artículo de Ryan "Construyendo Binarios de Dependencia para Aplicaciones de Heroku"
Otro enfoque de Jon Magic (no probado por mí) es descargar y compilar la dependencia directamente a través de bash
de Heroku, por ejemplo, directamente en el servidor: "Compilación de ejecutables en Heroku" .
En una nota lateral, ambos enfoques darán como resultado binarios que se romperán si el entorno subyacente de Heroku cambia lo suficiente.