Chuyển đổi tệp thành PDF bằng LibreOffice theo apache người dùng (tức là khi sử dụng PHP)


9

Tôi đã cài đặt libreoffice-headless và có thể chuyển đổi tài liệu khi đăng nhập vào shell như một người dùng bình thường.

[root@desktop ~]# yum install libreoffice-headless
[root@desktop ~]# yum install libreoffice-writer
[root@desktop ~]# su NotionCommotion
sh-4.1$ /usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc
convert /tmp/ayb/document_34.doc -> /tmp/ayb/document_34.pdf using writer_pdf_Export

Bây giờ tôi muốn làm điều tương tự, nhưng sử dụng PHP và do đó là người dùng apache, tuy nhiên, sau đây sẽ không chuyển đổi tệp.

<?php
  shell_exec('/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc');
?>

Trong nỗ lực khắc phục sự cố, tôi đã chạy lệnh tương tự thông qua trình bao như người dùng apache, nhưng nó vẫn không chuyển đổi tệp:

[root@desktop ~]# su -s /bin/sh apache -c "/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc"

Apache không giống như người dùng bình thường không có nhà và tôi nhớ rằng tôi có thể cần chỉ định nhà sử dụng HOME=/tmp/aybtrước khi thử chuyển đổi, nhưng điều đó không có ích (tôi nghĩ khi sử dụng CentOS 5.8 và có lẽ là một phiên bản khác của LibreOffice, nó đã làm, nhưng không chắc chắn).

Làm cách nào để chuyển đổi tệp thành PDF bằng libreoffice khi chạy tệp dưới dạng apache người dùng?

Hệ thống đã cài đặt:

CentOS 6.4
httpd.x86_64                    2.2.15-28.el6.centos              @updates
libreoffice-headless.x86_64     1:3.4.5.2-16.1.el6_3              @base

Câu trả lời:


14

Có hai vấn đề ở đây. Đầu tiên là www-data(người dùng apache) không có $HOMElibreoffice không thể chạy nếu không có $HOMEđịnh nghĩa. Vấn đề thứ hai là, trừ khi bạn đặc biệt thiết lập nó theo cách này (và bạn thực sự thực sự không nên), apachekhông có quyền truy cập vào /tmpthư mục hệ thống . Một máy chủ web thường chạy trong một môi trường hạn chế và không có quyền truy cập đầy đủ vào hệ thống tệp vì lý do bảo mật rất hợp lệ.

Vì vậy, bạn cần phải i) cung cấp cho người dùng apache một ngôi nhà và ii) cung cấp cho nó một thư mục mà nó có quyền truy cập để ghi. Vì vậy, hãy tạo một tmpthư mục trong cùng thư mục nơi bạn lưu trữ trang web của mình và sau đó chạy phpmã sau :

<?php
  shell_exec('export HOME=/tmp && libreoffice --headless -convert-to pdf --outdir ./tmp /tmp/ayb/document_34.doc');
?>

Tôi vừa thử nghiệm và nó hoạt động hoàn hảo trên máy của tôi. Hãy chắc chắn rằng quyền của bạn ./tmpđược đặt thành 777. Ngoài ra, bạn có thể cần phải khởi động lại apache nếu bạn chơi aroud với nó quá nhiều. Nó đã ngừng hoạt động với tôi sau một thời gian khi tôi thực hiện các thay đổi và tôi cần phải khởi động lại nó.


Cảm ơn terdon, làm việc hoàn hảo cho tôi là tốt. Vài câu hỏi. Tại sao không giữ chúng trong / tmp và không nằm trong cùng thư mục với nơi lưu trữ các trang web (Tôi đã kiểm tra nó, nó hoạt động). Tại sao không export HOME=/tmp/ayb libreoffice --headless ...làm việc? Mục đích của exportvà tại sao không HOME=/tmp/ayb; libreoffice --headless....hoạt động?
dùng1032531

Nếu bạn thực sự có thể viết thư cho /tmpbạn thì bạn có thể tự do làm điều đó. Tuy nhiên, đó là một ý tưởng tốt từ quan điểm bảo mật của vew để không cung cấp cho máy chủ web của bạn quyền truy cập vào các thư mục bên ngoài /var/www. exportxuất biến, làm cho nó có sẵn cho tất cả các shell tiếp theo và &&đảm bảo nó chỉ chạy nếu xuất thành công. Tôi không chắc chắn về các chi tiết, apache có thể khá khó tính về các quyền, sẽ tốt hơn nếu giữ mọi thứ trong wwwthư mục của bạn .
terdon

Tôi đang sử dụng tmp. Vâng, apache có thể viết thư /tmp, và một điều tốt (tôi nghĩ) về việc sử dụng nó là nó tự động xóa các tập tin cũ. Nhưng sau đó, một lần nữa, tôi thấy quan điểm của bạn về việc giữ mọi thứ bên dưới /var/www.
dùng1032531

Cũng thực tế cho Ubuntu (không có thư mục nhà libreoffice --headlesschết sau X11 connection rejected because of wrong authenticationtin nhắn).
Stanislav Ivanov

3

Tôi gặp vấn đề tương tự trên Debian và tôi đã giải quyết nó.

Chạy lệnh của bạn, nhưng với stracetừ đầu, như thế này:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Điều này sẽ tạo ra tệp nhật ký khổng lồ với mọi quyền truy cập vào API hệ thống và kết quả của nó.
Trong trường hợp của tôi, ở đâu đó gần dòng 5000 có một thứ như thế này:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Theo dấu vết này, tôi đã thay đổi quyền đệ quy cho thư mục /var/spool/libreofficethành 777.

Sau đó, chuyển đổi bắt đầu hoạt động cho mọi người dùng.

Có thể bạn cũng nhận được Permission deniedmột số tệp khác, nó được xử lý âm thầm và bạn cần sửa quyền cho người dùng của mình?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.