web-dev-qa-db-ja.com

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

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
9
user1032531

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

したがって、i)Apacheのユーザーにホームを提供し、ii)書き込みのためにアクセスできるディレクトリを提供する必要があります。したがって、Webページを格納するフォルダと同じフォルダにtmpディレクトリを作成して実行します。次のphpコード:

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

私はテストしたところ、私のマシンで完全に動作しました。 ./tmpの権限が777に設定されていることを確認してください。また、Aroudを使いすぎている場合は、Apacheを再起動する必要がある場合があります。しばらくして変更を加えたため、動作が停止し、再起動する必要がありました。

14
terdon

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を取得し、それはサイレントに処理され、ユーザーの権限を修正する必要がありますか?

3
Paweł Gutowski