2012-06-28 17 views
5

Ho uno script PHP che compila documenti LaTeX con l'uso di:Come posso ottenere PHP per compilare un documento LaTeX se (www-data) non può accedere ai pacchetti richiesti?

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

Questo sta lavorando per alcuni dei miei documenti LaTeX, ma il mio ultimo documento non compilare e uno sguardo al log rivela:

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

Ciò che ho trovato è il risultato di LaTeX che non è in grado di vedere i pacchetti di caratteri richiesti. Quando eseguo lo stesso comando di compilazione sotto il mio nome utente, il documento viene compilato come dovrebbe. Quindi la mia domanda è: come posso ottenere PHP (eseguendo come www-data) per ottenere l'accesso ai pacchetti LaTeX necessari?

Ho provato ad installare il pacchetto richiesto con l'account www-dati utilizzando:

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

ma askes la password di www-data, che non credo sia stato impostato con me e non è nulla L'ho gettato.

Sto eseguendo Ubuntu 12.04 se c'è qualche aiuto.

risposta

2

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

... rende il font disponibile per tutti gli utenti (stessi come in missingfont.log ma con argomento --destdir).

+1

Sì, era esattamente quello che volevo - grazie. Niente più directory di compilazione temporanea! –

0

Hai ragione con l'idea sudo, ma per aggirare il problema della password, c'è una soluzione semplice.

www-data deve essere nell'elenco di sudoers, a etc/sudoers e all'interno di questo elenco è possibile definire come vengono controllati i super comandi. È possibile impostare www-data come sudoer che non richiede una password ... ma non è un'idea molto intelligente in termini di sicurezza. Pertanto, nell'elenco di sudoers, è possibile specificare quali comandi possono essere eseguiti dall'utente. Consentendo solo il comando /usr/bin/latexmk si aggirano i problemi di sicurezza e si consente al server Web di eseguire comandi super senza password.

Dai un'occhiata a questa pagina di aiuto per Ubuntu: https://help.ubuntu.com/community/Sudoers - in particolare la sezione NOPASSWD.

L'esempio nel tuo caso sarebbe:

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

Boy oh boy che ha causato alcuni problemi con la mia capacità di sudo. Lascerò perdere il file per ora. Stavi suggerendo che aggiungere che permetterebbe a www-data di avere accesso ai pacchetti necessari per compilare il documento Latex o consentirmi di usare apt-get install per installare i pacchetti sotto www-data? In quest'ultimo caso, non avrei bisogno di avere qualcosa del tipo 'www-data mark-computer = NOPASSWD: apt-get'? –

+0

@MarkJones Sì, i comandi dopo NOPASSWD saranno consentiti senza password. Puoi cambiarli in qualunque cosa funzioni per te. – Greg

+1

Vuoi * davvero * www-data' nella lista sudoers? Crea un muro così sottile tra l'intero Internet e l'accesso root all'intera macchina. Non rende l'applicazione meno sicura, ma il danno che può essere fatto da QUALSIASI falla nella sicurezza dell'applicazione sarebbe immenso. – Jason

0

Ecco quello che alla fine ha ottenuto la compilazione di lavoro.

Nella mia cartella principale c'era una cartella nascosta che LaTeX stava usando per memorizzare i font necessari ~/.texmf-var. Questa cartella conteneva fonts/pk/ljfour/jknappen/ec e c'erano 13 file di font (alcuni dei quali erano quelli di cui si lamentava latexmk).

La soluzione era di avere PHP generare il file LaTeX che volevo compilare (file.tex) in una directory temporanea (dove avevo copiato i font) dove sarebbero stati compilati e poi spostati dove volevo memorizzare il uscita PDF. Mi spiego con un esempio:

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.*'); 

Quindi la prima riga genera il file lattice nella directory in cui ho intenzione di compilare in formato PDF (dove $ latex_data è una stringa contenente il documento LaTeX che voglio creare).

Ora, la parte che rende questo tutto il lavoro è la creazione di una directory in ~/website/latexFiles/temp chiamato $HOME. Quindi copiare (o forse collegare, ma ho copiato) ~/.texmf-var in ~/website/latexFiles/temp/$HOME.Questo è il percorso che latexmk esaminerà i caratteri necessari. Utilizzare lo switch -cd in modo che latexmk passi a ~/website/latexFiles/temp prima di provare a compilare il file LaTeX, dove sarà quindi in grado di correggere i caratteri.

La terza riga copia il file .pdf nel punto in cui volevo il file di output e l'ultima riga rimuove tutti i file rimanenti dalla directory temporanea con lo stesso nome file. Mi assicuro di utilizzare nomi di file univoci per i file .tex, pertanto non rimuoverò i file che potrebbero essere generati da un altro utente.

Speriamo che qualcun altro lo trovi utile.

+0

Sebbene funzionasse, questa soluzione non è adatta a quella di AaL. Per chiunque altro con questo problema, si prega di seguire le sue indicazioni prima di tentare questo come soluzione. –

0

corro con problemi simili ed è stato risolto impostando $HOME variabile di ambiente /var/www in uno script di shell che ha invocato pdflatex (o qualsiasi credo scrivibile cartella per www-data è ok qui). Vedi i dettagli su TeX.SX.