2012-06-28 19 views
5

Tengo un script PHP que compila documentos LaTeX con el uso de:¿Cómo puedo obtener PHP para compilar un documento LaTeX si (www-data) no puede obtener acceso a los paquetes requeridos?

exec('cd /path/to/doc && /usr/bin/latexmk -pdf filename.tex'); 

Esto está trabajando para algunas de mis documentos LaTeX pero mi último documento no se compila y un vistazo al registro revela:

!pdfTeX error: pdflatex (file ecrm1000): Font ecrm1000 at 600 not found 
==> Fatal error occurred, no output PDF file produced! 

Lo que he encontrado es el resultado de que LaTeX no puede ver los paquetes de fuentes requeridos. Cuando ejecuto el mismo comando de compilación bajo mi nombre de usuario, el documento se compila como debería. Entonces mi pregunta es, ¿cómo puedo obtener PHP (ejecutándose como www-data) para tener acceso a los paquetes LaTeX necesarios?

He intentado instalar el paquete requerido en la cuenta www-data usando:

sudo -u www-data sudo apt-get install texlive-fonts-recommended 

pero Askes la contraseña de www-data, que no creo que fue fijado por mí y no es nada Lo he echado.

Estoy ejecutando Ubuntu 12.04 si es de alguna ayuda.

Respuesta

2

sudo mktexpk --destdir /usr/share/texmf-texlive/fonts/pk/ljfour/jknappen/ec/ --mfmode/--bdpi 600 --mag 1+0/600 --dpi 600 ecrm1000

... hace que la fuente está disponible para todos los usuarios (igual que en missingfont.log pero con argumento --destdir).

+1

Sí, eso era exactamente lo que quería, gracias. ¡No más directorio de compilación temporal! –

0

Tiene razón con la idea sudo, pero para solucionar el problema de la contraseña, hay una solución simple.

www-data debe estar en la lista de sudoers, en etc/sudoers, y dentro de esta lista puede definir cómo se controlan los supercomandos. Es posible configurar www-data como un sudoer que no requiere una contraseña ... pero esa no es una idea muy inteligente en términos de seguridad. Por lo tanto, en la lista de sudoers, puede especificar qué comandos puede ejecutar el usuario. Permitir solo el comando /usr/bin/latexmk solucionará los problemas de seguridad y permitirá que su servidor web ejecute supercomandos sin una contraseña.

Echa un vistazo a esta página de ayuda para Ubuntu: https://help.ubuntu.com/community/Sudoers - más notablemente la sección NOPASSWD.

El ejemplo en tu caso sería:

# This lets "www-data" user run a command without a password 
www-data mark-computer= NOPASSWD: /usr/bin/latexmk 
+0

Chico oh chico que causó algunos problemas con mi habilidad para sudo. Dejaré la edición de ese archivo por el momento. ¿Sugirió que agregar eso permitiría que www-data tuviera acceso a los paquetes que necesitaba para la compilación del documento Latex o que me permitiera usar apt-get install para instalar los paquetes en www-data? En este último caso, ¿no necesitaría tener algo como 'www-data mark-computer = NOPASSWD: apt-get'? –

+0

@MarkJones Sí, los comandos después de NOPASSWD se permitirán sin una contraseña. Puedes cambiarlos a lo que sea que funcione para ti. – Greg

+1

¿Realmente * quieres 'www-data' en la lista de sudoers? Crea una pared tan delgada entre toda la Internet y acceso raíz a toda su máquina. No hace que la aplicación sea menos segura, pero el daño que puede causar CUALQUIER defecto en la seguridad de su aplicación sería inmenso. – Jason

0

Esto es lo que finalmente consiguió la compilación de trabajo.

Debajo de mi propia carpeta de inicio había una carpeta oculta que LaTeX estaba usando para almacenar las fuentes que necesitaba ~/.texmf-var. Esta carpeta contenía fonts/pk/ljfour/jknappen/ec y había 13 archivos de fuentes (algunos de los cuales latexmk se quejaban).

La solución fue hacer que PHP generara el archivo LaTeX que quería compilar (file.tex) en un directorio temporal (donde había copiado las fuentes) donde serían compilados y luego movido a donde yo quería almacenar el PDF de salida. Voy a explicar con un ejemplo:

file_put_contents('~/website/latexFiles/temp/file.tex', $latex_data); 
exec('/usr/bin/latexmk -pdf -cd ~/website/latexFiles/temp/file.tex'); 
exec('mv ~/website/latexFiles/temp/file.pdf ~/website/pdfs/desiredFilename.pdf'); 
exec('rm ~/website/latexFiles/temp/file.*'); 

Así que la primera línea genera el archivo de látex en el directorio en el que voy a compilar a PDF (donde $ latex_data es una cadena que contiene el documento LaTeX quiero crear)

Ahora, la parte que hace que todo esto funcione es la creación de un directorio en ~/website/latexFiles/temp llamada $HOME. Luego copiando (o tal vez vinculando, pero copié) ~/.texmf-var en ~/website/latexFiles/temp/$HOME.Esta es la ruta que buscará latexmk para las fuentes que necesita. Utilice el modificador -cd para que latexmk se mueva a ~/website/latexFiles/temp antes de intentar compilar el archivo LaTeX, donde podrá refinar las fuentes.

La tercera línea copia el archivo .pdf en el lugar donde finalmente quería el archivo de salida y la última línea elimina todos los archivos restantes del directorio temporal con el mismo nombre de archivo. Me aseguro de usar nombres de archivo únicos para los archivos .tex, por lo que no eliminaré archivos que otro usuario pueda estar generando.

Esperemos que alguien más lo encuentre útil.

+0

Aunque esto funcionó, esta solución no es tan adecuada como la de AaL. Para cualquier otra persona con este problema, siga sus instrucciones antes de intentar esto como una solución. –

0

I corrido con un problema similar y se resolvió mediante el establecimiento de $HOME variable de entorno a /var/www en un shell-script que haya aducido pdflatex (o creo que se pueda escribir cualquier carpeta para www-data está bien aquí). Ver los detalles en TeX.SX.

Cuestiones relacionadas