Как я могу заставить PHP скомпилировать документ LaTeX, если он (www-data) не может получить доступ к требуемым пакетам?

У меня есть PHP-скрипт, который компилирует документы LaTeX с использованием:

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

Это работает для некоторых моих документов LaTeX, но мой последний документ не компилируется, и просмотр журнала показывает:

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

Который я нашел, является результатом того, что LaTeX не может видеть требуемые пакеты шрифтов. Когда я запускаю ту же команду компиляции под своим именем пользователя, документ компилируется так, как должен. Поэтому мой вопрос: как я могу получить PHP (выполняющий как www-data), чтобы получить доступ к необходимым пакетам LaTeX?

Я попытался установить требуемый пакет под учетной записью www-data, используя:

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

но он спрашивает пароль www-data, который, как я полагаю, не был установлен мной, и я ничего не выбрал.

Я использую Ubuntu 12.04, если это поможет.

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

… делает шрифт доступным для всех пользователей (то же, что и в файле missingfont.log, но с аргументом –destdir).

Вы правы с идеей sudo , но чтобы обойти проблему с паролем, есть простое решение.

www-данные должны быть в списке sudoers, в etc/sudoers , и в этом списке вы можете определить, как управляются супер-команды. Можно установить www-data как sudoer, который не требует пароля … но это не очень умная идея с точки зрения безопасности. Поэтому в списке sudoers вы можете указать, какие команды могут быть выполнены пользователем. Разрешение только команды /usr/bin/latexmk проблемами безопасности и позволит вашему веб-серверу запускать супер-команды без пароля.

Просмотрите эту страницу справки для Ubuntu: https://help.ubuntu.com/community/Sudoers – в первую очередь раздел NOPASSWD.

Пример в вашем случае:

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

Вот что в итоге получило компиляцию.

Под моей собственной домашней папкой была скрытая папка, которую LaTeX использовала для хранения шрифтов, необходимых ей ~/.texmf-var . Эта папка содержала fonts/pk/ljfour/jknappen/ec и в нем было 13 файлов шрифтов (некоторые из которых были таковыми, о которых писал латекскм).

Решение заключалось в том, чтобы PHP сгенерировал файл LaTeX, который я хотел скомпилировать (file.tex), в каталог temp (где я скопировал шрифты), где они будут скомпилированы, а затем перенесены туда, где я хотел бы хранить выходные PDF-файлы. Я объясню пример:

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

Таким образом, первая строка генерирует латексный файл в каталоге, где я собираюсь скомпилировать PDF (где $ latex_data – это строка, содержащая документ LaTeX, который я хочу создать).

Теперь часть, которая делает все это работает , создает каталог в ~/website/latexFiles/temp под названием $HOME . Затем копирование (или, возможно, связывание, но я скопировал) ~/.texmf-var в ~/website/latexFiles/temp/$HOME . Это путь, по которому latexmk будет искать latexmk шрифты. Используйте переключатель -cd чтобы латексмк перемещался в ~/website/latexFiles/temp прежде чем пытаться скомпилировать файл LaTeX, где он сможет ~/website/latexFiles/temp шрифты.

Третья строка копирует файл .pdf туда, где я в конечном итоге хотел получить выходной файл, а последняя строка удаляет все оставшиеся файлы из каталога temp с тем же именем файла. Я уверен, что я использую уникальные имена файлов для .tex файлов, поэтому я не .tex файлы, которые может генерировать другой пользователь.

Надеюсь, кто-то найдет это полезным.

Я запускаю с аналогичной проблемой, и это было решено, установив переменную среды $HOME в /var/www в shell-скрипт, который вызвал pdflatex (или я полагаю, что любая папка, доступная для записи в www-data здесь хорошо). См. Подробную информацию о TeX.SX.