2012-06-28 21 views
5

Tôi có một kịch bản PHP mà biên dịch tài liệu LaTeX với việc sử dụng:Làm cách nào để tôi có thể lấy PHP để biên dịch tài liệu LaTeX nếu nó (www-data) không thể truy cập vào các gói được yêu cầu?

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

này đang làm việc cho một số các văn bản LaTeX của tôi, nhưng tài liệu mới nhất của tôi không biên dịch và xem nhật ký tiết lộ:

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

Điều tôi đã tìm thấy là kết quả của LaTeX không thể xem các gói phông chữ được yêu cầu. Khi tôi chạy lệnh biên dịch tương tự dưới tên người dùng của tôi, tài liệu sẽ biên dịch như nó cần. Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể nhận được PHP (thực hiện như www-data) để có được quyền truy cập vào các gói LaTeX cần thiết?

Tôi đã thử cài đặt các gói cần thiết theo tài khoản www-dữ liệu sử dụng:

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

nhưng nó askes nhập mật khẩu www-data, mà tôi không tin rằng đã được thiết lập bởi tôi và không phải là bất cứ điều gì Tôi đã ném vào nó.

Tôi đang chạy Ubuntu 12.04 nếu có bất kỳ trợ giúp nào.

Trả lời

2

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

... làm cho phông chữ có sẵn cho tất cả người dùng (giống như trong missingfont.log nhưng với lập luận --destdir).

+1

Vâng, đó là chính xác những gì tôi muốn - cảm ơn bạn. Không có thư mục biên dịch tạm thời nào nữa! –

0

Bạn phù hợp với ý tưởng sudo, nhưng để khắc phục sự cố mật khẩu, có một giải pháp đơn giản.

www-data phải nằm trong danh sách sudoers, tại etc/sudoers và trong danh sách này, bạn có thể xác định cách siêu điều khiển được kiểm soát. Có thể đặt www-data là sudoer không yêu cầu mật khẩu ... nhưng đó không phải là một ý tưởng rất thông minh về an ninh. Do đó, trong danh sách sudoers, bạn có thể chỉ định những lệnh nào được người dùng thực thi. Chỉ cho phép lệnh /usr/bin/latexmk sẽ gặp sự cố bảo mật và cho phép máy chủ web của bạn chạy các lệnh siêu mà không cần mật khẩu.

Kiểm tra trang trợ giúp này cho Ubuntu: https://help.ubuntu.com/community/Sudoers - đáng chú ý nhất là phần NOPASSWD.

Ví dụ trong trường hợp của bạn sẽ là:

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

Boy oh boy gây ra một số vấn đề với khả năng của tôi để sudo. Tôi sẽ để lại chỉnh sửa tập tin đó ngay bây giờ. Bạn có đề xuất thêm rằng điều đó sẽ cho phép www-data có quyền truy cập vào các gói cần thiết cho tài liệu Latex để biên dịch hay cho phép tôi sử dụng cài đặt apt-get để cài đặt các gói theo www-data? Nếu sau này, tôi sẽ không cần phải có một cái gì đó như 'www-data mark-computer = NOPASSWD: apt-get'? –

+0

@MarkJones Có, các lệnh sau NOPASSWD sẽ được cho phép mà không cần mật khẩu. Bạn có thể thay đổi chúng thành bất kỳ thứ gì phù hợp với bạn. – Greg

+1

Bạn có * thực sự * muốn 'www-data' trong danh sách sudoers không? Nó tạo ra một bức tường mỏng như vậy giữa toàn bộ Internet và quyền truy cập root vào toàn bộ máy của bạn. Nó không làm cho ứng dụng trở nên kém an toàn hơn, nhưng thiệt hại có thể được thực hiện bằng BẤT K ch cú nhấp chuột nào trong bảo mật ứng dụng của bạn sẽ rất lớn. – Jason

0

Đây là những gì cuối cùng đã biên soạn làm việc.

Dưới thư mục chính của riêng tôi là một thư mục ẩn mà LaTeX đang sử dụng để lưu trữ phông chữ cần thiết ~/.texmf-var. Thư mục này chứa fonts/pk/ljfour/jknappen/ec và trong đó có 13 tệp phông chữ (một số trong đó là những tệp mà latexmk đang khiếu nại).

Giải pháp là để PHP tạo tệp LaTeX tôi muốn biên dịch (file.tex) thành thư mục tạm thời (nơi tôi đã sao chép phông chữ), nơi chúng được biên dịch và sau đó chuyển đến nơi tôi muốn lưu trữ các tệp PDF đầu ra. Tôi sẽ giải thích với một ví dụ:

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

Vì vậy, dòng đầu tiên tạo ra các tập tin trong thư mục mủ nơi tôi sẽ để biên dịch sang PDF (trong đó $ latex_data là một chuỗi chứa tài liệu LaTeX Tôi muốn tạo).

Bây giờ, phần làm cho tất cả công việc này đang tạo một thư mục trong ~/website/latexFiles/temp được gọi là $HOME. Sau đó sao chép (hoặc có thể liên kết, nhưng tôi đã sao chép) ~/.texmf-var vào ~/website/latexFiles/temp/$HOME.Đây là đường dẫn mà latexmk sẽ xem xét cho các phông chữ cần thiết. Sử dụng công tắc -cd để latexmk di chuyển vào ~/website/latexFiles/temp trước khi cố gắng biên dịch tệp LaTeX, sau đó nó sẽ có thể tinh chỉnh phông chữ.

Dòng thứ ba sao chép tệp .pdf vào nơi cuối cùng tôi muốn tệp đầu ra và dòng cuối cùng xóa tất cả các tệp còn lại khỏi thư mục tạm thời có cùng tên tệp. Tôi đảm bảo rằng tôi sử dụng tên tệp duy nhất cho các tệp .tex để tôi không xóa các tệp mà người dùng khác có thể đang tạo.

Hy vọng rằng người khác thấy điều này hữu ích.

+0

Mặc dù điều này làm việc, giải pháp này không phải là phù hợp tại đó của AaL. Đối với bất kỳ ai khác có vấn đề này, vui lòng làm theo chỉ dẫn của anh ấy trước khi thử làm giải pháp này. –

0

tôi chạy với vấn đề tương tự và nó đã được giải quyết bằng cách thiết lập $HOME biến môi trường để /var/www trong một vỏ kịch bản mà gọi pdflatex (hoặc tôi tin rằng bất kỳ thư mục có thể ghi tới www-data là ok ở đây). Xem chi tiết trên TeX.SX.