ユーザーapacheでLibreOfficeを使用してファイルをPDFに変換します(つまり、PHPを使用する場合)


9

libreoffice-headlessをインストールし、通常のユーザーとしてシェルにログオンしたときにドキュメントを変換できます。

[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

今は同じことをしたいのですが、PHPを使用しているため、ユーザーapacheとして、以下はファイルを変換しません。

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

トラブルシューティングを行うために、ユーザーapacheと同じコマンドをシェルで実行しましたが、それでもファイルは変換されません。

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

通常のユーザーとは異なり、Apacheには家HOME=/tmp/aybがないため、変換を試みる前に使用する家を指定する必要があるかもしれないと聞いたことを思い出しますが、助けにはなりません(CentOS 5.8とおそらく別のバージョンのLibreOfficeを使用している場合、したが、確かではない)。

ユーザーapacheとして実行するときにlibreofficeを使用してファイルをPDFに変換するにはどうすればよいですか?

インストールされているシステム:

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

回答:


14

ここには2つの問題があります。1つ目は、www-data(apacheユーザー)が定義されてい$HOMEない場合、libreofficeを実行できないためです$HOME。2番目の問題は、この方法で具体的に設定しない限り(そして、本当にそうすべきではない場合)、apacheシステム/tmpディレクトリにアクセスできないことです。Webサーバーは通常、制限された環境で実行され、非常に有効なセキュリティ上の理由から、ファイルシステムへの完全なアクセス権はありません。

したがって、i)apacheのユーザーにホームを与え、ii)書き込みを行うためにアクセスできるディレクトリを与える必要があります。したがって、tmpWebページを保存するのと同じフォルダにディレクトリを作成し、次のphpコードを実行します。

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

私はテストしたところ、私のマシンで完全に動作しました。./tmpアクセス許可が777に設定されていることを確認してください。また、apacheを使いすぎている場合は、apacheを再起動する必要がある場合があります。しばらくして変更を加えたため、機能しなくなり、再起動する必要がありました。


terdonに感謝します。私にも最適です。いくつかの質問。/ tmpに保存せず、ウェブページが保存されているのと同じフォルダに保存しないでください(私はテストしましたが、動作します)。なぜ動かないのexport HOME=/tmp/ayb libreoffice --headless ...ですか?目的は何ですか?exportなぜ機能しないのHOME=/tmp/ayb; libreoffice --headless....ですか?
user1032531 2013

あなたが実際に/tmpあなたに書くことができるならば、そうするのは自由です。ただし、vewのセキュリティポイントから、Webサーバーに外部のディレクトリへのアクセスを許可しないことをお勧めします/var/wwwexport変数をエクスポートし、後続のすべてのシェルで使用できる&&ようにし、エクスポートが成功した場合にのみ実行されるようにします。詳細についてはわかりませんが、Apacheはアクセス許可について非常に細心の注意を払う必要がありwwwます。常にフォルダの下にすべてを保存することをお勧めします。
terdon 2013

tmpを使用することに混乱しています。はい、Apacheはに書き込むことができます。Apacheを使用すること/tmpの良い点(私はそう思います)は、古いファイルを自動的に削除することです。しかし、もう一度、私はすべてを下に保つことについてあなたの要点を理解してい/var/wwwます。
user1032531 2013

Ubuntuの場合も同様です(ホームディレクトリlibreoffice --headlessがない場合、X11 connection rejected because of wrong authenticationメッセージの後に終了します)。
スタニスラフイワノフ2017年

3

Debianでも同様の問題があり、解決しました。

コマンドを実行しますがstrace、最初は次のようにします。
strace -f -o output.txt soffice --headless --convert-to pdf (...)

これにより、システムAPIへのすべてのアクセスとその結果を含む巨大なログファイルが生成されます。
私の場合、行5000の近くのどこかに次のようなものがありました。
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

この証跡に従って、フォルダのアクセス許可を再帰的にに変更/var/spool/libreofficeしました777

その後、変換はすべてのユーザーに対して機能し始めました。

たぶん、あなたはPermission denied他のファイルに乗って、それは静かに処理され、あなたのユーザーの権限を修正する必要がありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.