2012-06-28 3 views
5

私が使用してLaTeX文書をコンパイルする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データとして実行して)必要なLaTeXパッケージにアクセスするにはどうしたらいいですか?

私が使用してWWWデータアカウントで必要なパッケージをインストールしようとしている:

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

をしかし、それは私が私によって設定され、何もないですして信じていないもの、WWWデータのパスワードをaskes私はそれを投げた。

私はUbuntu 12.04を使用しています。

答えて

2

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引数と同じ)すべてのユーザーのフォントが利用できるようになります。

+1

はい、それは私が欲しかったものでした - ありがとう。これ以上の一時コンパイルディレクトリはありません! –

0

あなたはsudoアイデアを持っていますが、パスワードの問題を回避するには簡単な解決策があります。

www-dataはsudoersリストのetc/sudoersになければなりません。このリストの中で、スーパーコマンドの制御方法を定義できます。 www-データをパスワードを必要としないsudoerとして設定することは可能ですが、それはセキュリティの点で非常に巧妙な考えではありません。したがって、sudoersリストでは、ユーザーが実行できるコマンドを指定できます。 /usr/bin/latexmkコマンドだけを許可すると、セキュリティ上の問題が回避され、Webサーバーはパスワードなしでスーパーコマンドを実行できます。

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 
+0

私のsudoの能力にいくつかの問題を引き起こした少年少年。今はそのファイルを編集しておきます。それを追加すると、www-dataが、Latex文書をコンパイルするために必要なパッケージにアクセスできるようになるか、apt-get installを使ってwww-dataの下にパッケージをインストールできるようにすることを提案しましたか?後者の場合、 'www-data mark-computer = NOPASSWD:apt-get'のようなものは必要ありませんか? –

+0

@ MarkJonesはい、NOPASSWDの後のコマンドはパスワードなしで許可されます。それらをあなたのためにどんなものにでも変更することができます。 – Greg

+1

sudoersのリストで 'www-data'を本当に*したいですか?これは、インターネット全体と、マシン全体へのルートアクセスの間に、このような薄い壁を作り出します。アプリケーションの安全性はそれほど悪くはありませんが、アプリケーションのセキュリティで何か問題が発生する可能性は非常に高いでしょう。 – Jason

0

はここで最終的にコンパイルが働いて得たものです。

自分のホームフォルダの下に、LaTeXが必要なフォントを格納するために使用していた隠しフォルダがありました~/.texmf-var。このフォルダにはfonts/pk/ljfour/jknappen/ecが含まれていて、13個のフォントファイルがありました(そのうちのいくつかはlatexmkが不満を言っていたものでした)。

解決策は、私がコンパイルしたい一時ディレクトリ(どこにコピーしたのか)にコンパイルしたい(ファイルを保存した)場所にPHPファイルを生成することでした。出力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.*'); 

だから、最初の行は、私は$のlatex_dataは、私が作成したいLaTeX文書を含む文字列であるPDF(にコンパイルするつもりのディレクトリにラテックスファイルを生成します)。

ここで、は、$HOMEと呼ばれるディレクトリを~/website/latexFiles/tempに作成しています。その後、~/.texmf-var~/website/latexFiles/temp/$HOMEにコピーする(またはリンクしたがコピーした)。これは、latexmkが必要とするフォントを調べるパスです。 -cdスイッチを使用してlatexmkを~/website/latexFiles/tempに移動してからLaTeXファイルをコンパイルしてください。そこでLaTeXファイルをコンパイルすると、フォントを細かくすることができます。

3行目は.pdfファイルを最終的に出力ファイルが必要な場所にコピーし、最後の行は同じファイル名のtempディレクトリから残りのファイルをすべて削除します。 .texファイルに一意のファイル名を使用するようにしているので、他のユーザーが生成している可能性のあるファイルを削除しているわけではありません。

うまくいえば、他の誰かがこれを便利に見つけてください。

+0

これはうまくいきましたが、この解決法はAaLのものほど適していません。この問題を抱えている人は、これを解決する前に彼の指示に従ってください。 –

0

私は同様の問題に実行し、それがpdflatexを起動したシェルスクリプトで/var/www$HOME環境変数を設定することで解決した(または私はwww-dataに書き込み可能な任意のフォルダがここでOKであると信じて)。 TeX.SXの詳細を参照してください。

関連する問題