Php exec経由でlinuxの"less"コマンドを実行する-バイナリファイルの警告
質問
いくつかのPDFファイルをTXTに変換する必要があります。たとえば、pdftotextにはPDFのテーブルにいくつかの問題があるため、私は"less"コマンドで終わります。問題は、exec関数(またはshell_exec/system)からコマンドを実行したときに、情報を表示するだけでなく、選択したPDFがバイナリファイルであり、結果ファイルがPDFデーしかし、私がターミナルで通常同じことをするとき、すべてが大丈夫です。また、www_dataユーザーとしてログインし、このユーザーとしてコマンドを実行しようとしましたが、問題もありません。
コマンド:
$ less /var/www/original.pdf > /var/www/new.txt
PHPコード:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
PHP execからの結果:
"/var/www/original.pdf" may be a binary file. See it anyway?
Execコマンドの「-f」オプションは、「はい、とにかく見たい」のために「y」を押す必要がないため、そこにあります。"
set | grep less
歩留まり:
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
Lossless LZW RLE Zip' -- "$cur" ));
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless ()
解決
私が読んだことから、あなたのコンソールはPDFファイルを表示することができます less
入力プリプロセッサがインストールされているため、次のようになります lesspipe
または lessfile
.作り方 less
これらのプリプロセッサを使用するには、LESSOPENと呼ばれる環境変数を読み込むことによって、 lesspipe
と lessfile
スクリプト。
Webサーバーが環境変数とシェルコマンドを使用して、この動作を複製して、次の呼び出しを行う方法があるかもしれません less
Pdfを適切に解析します。
私が提案するのは、呼び出すのではなく、あなたのために変換を行うためにbashスクリプトを呼び出すことです less
直接。そうすれば、bashスクリプトは適切な環境変数を設定し、適切なコマンドを実行してPDFファイルを読み取り可能な出力に変換することができます。
これを行う方法の例を次に示します:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
次に、PHPから、そのスクリプトを次のように呼び出します:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
うまくいかない場合は、変更してみてください eval $(lesspipe)
に eval $(lessfile)
.
他のヒント
まず第一に、lessはテキストストリームを読むためのインタラクティブなプログラムです。この文脈では、次のものを使用する必要があります cat
代わりに。PDFはテキストベースではなくバイナリ形式であるため、このコースまたはコースは機能しません。
なぜあなたはのようなテキストコンバータにpdfを使用しないでください pdftotext
?
PHPコードはどのように実行されましたか?コマンドラインで、 php file.php
またはブラウザでヒットしたときにWebサーバーによって http://servername/something/file.php
?
一つの推測は、 less
コマンドラインで実行するときに実行するのは同じではありません less
PHPコードが実行されるときと同じように。