2012-06-28 63 views
5

我已經編譯LaTeX文檔在使用的PHP腳本:如何獲得PHP編譯LaTeX文檔(www-data)無法訪問所需的軟件包?

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數據帳戶下安裝所需的軟件包:

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

但askes爲www數據的密碼,我不相信這是由我設定,並沒有任何東西我拋棄了它。

我正在運行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-data設置爲不需要密碼的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

下面是最終得到的編譯工作。

在我自己的home文件夾下是一個隱藏文件夾,LaTeX正在使用它來存儲它需要的字體~/.texmf-var。這個文件夾包含fonts/pk/ljfour/jknappen/ec,並且有13個字體文件(其中一些是latexmk抱怨的)。

解決方案是讓PHP生成我想編譯的文件(file.tex)到一個臨時目錄(我已經複製了字體),在那裏它們將被編譯,然後移動到我想要存儲的位置輸出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將考慮它需要的字體的路徑。使用-cd開關,以便在嘗試編譯LaTeX文件之前,latexmk移動到~/website/latexFiles/temp之前,然後它將能夠精細處理字體。

第三行復制.pdf文件出來,我想最終的輸出文件和最後一行除去來自具有相同文件名的臨時目錄中的所有剩餘的文件。我確定我爲.tex文件使用了唯一的文件名,因此我不會刪除其他用戶可能生成的文件。

希望有人認爲這有用。

+0

雖然這有效,但這種解決方案並不適合AaL的解決方案。對於有此問題的任何人,請在嘗試將此作爲解決方案之前遵循他的指示。 –

0

我有類似的問題上運行,它是由一個shell腳本調用它設置pdflatex$HOME環境變量/var/www解決(或相信任何文件寫入到www-data是確定在這裏)。請參閱TeX.SX的詳細信息。

相關問題