У меня есть 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.