質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

2回答

2685閲覧

サーバーでPHPのexec関数を実行したい

gegegege

総合スコア26

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

1クリップ

投稿2021/05/18 06:29

編集2021/05/20 09:01

前提・実現したいこと

PHPでPDFファイルのテキストを読み込みたい
→xpdfのpdftotextを利用したらローカル環境では実現できた(「該当のソースコード」のコマンドをexec関数で実行)
→さくらのレンタルサーバーにデプロイして同じ動作をさせたいが出来ない

発生している問題・エラーメッセージ

さくらのレンタルサーバーでexec関数が上手く動かない
いろいろ試したがexec関数の第三引数に「126」,「127」が返ってくる

該当のソースコード

php

1$cmd = __DIR__ . "/xpdf-tools-win-4.03/bin64/pdftotext -enc Shift-JIS " . __DIR__ . "/pdftotext_escape/pdf/" . "ユーザが読み込ませたPDFのファイル名.pdf" 2exec ($cmd, $output, $result_code);

試したこと

コマンド末尾に「2> ./logs/log.log」を追加し下記を試し、エラーログを確認した。
1.
まずはローカル環境で動いていた状態で実行
エラーログ:sh: /home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/pdftotext: not found

2.
相対パスで指定してコマンドを実行

php

1$cmd = "./xpdf-tools-win-4.03/bin64/pdftotext -enc Shift-JIS ./pdftotext_escape/pdf/" . "ユーザが読み込ませたPDFのファイル名.pdf" . " 2> ./logs/log.log" 2exec ($cmd, $output, $result_code);

エラーログ:sh: ./xpdf-tools-win-4.03/bin64/pdftotext: not found

3.
指定のパスを絶対パス(ローカル環境で動いていた状態)に戻しフォルダ「/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/」にある「pdftotext.exe」を「pdftotext」にした(拡張子を消した)。
エラーログ:sh: /home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/pdftotext: Permission denied

4.
3.の状態でコマンドの実行に権限を持たせる

php

1$cmd = "sudo -S " . __DIR__ . "/xpdf-tools-win-4.03/bin64/pdftotext -enc Shift-JIS " . __DIR__ . "/pdftotext_escape/pdf/" . "ユーザが読み込ませたPDFのファイル名.pdf" . " 2> ./logs/log.log"; 2exec ($cmd, $output, $result_code);

エラーログ:sh: sudo: Permission denied

補足情報(FW/ツールのバージョンなど)

下記、レンタルサーバーのフォルダ構成です。

/home/hoge/www/fuga/ ├index.php ├pdftotext_escape/ └pdf/ ├xpdf-tools-win-4.03/ ├bin64/ ├xpdf-japanese/ ├xpdfrc ├pdftotext.exe

下記、/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/xpdfrcファイルに書かれている内容もパスをローカルからサーバの情報に変更しています。

#----- begin Japanese support package (2011-sep-02) cidToUnicode Adobe-Japan1 "/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/xpdf-japanese/Adobe-Japan1.cidToUnicode" unicodeMap ISO-2022-JP "/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/xpdf-japanese/ISO-2022-JP.unicodeMap" unicodeMap EUC-JP "/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/xpdf-japanese/EUC-JP.unicodeMap" unicodeMap Shift-JIS "/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/xpdf-japanese/Shift-JIS.unicodeMap" cMapDir Adobe-Japan1 "/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/xpdf-japanese\CMap" toUnicodeDir "/home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/xpdf-japanese\CMap" #fontFileCC Adobe-Japan1 /usr/..../NotoSansCJKjp-Regular.otf #----- end Japanese support package

自分なりの見解では、コマンドがスペースで区切られていて実行できていないのでは?といった感じです。
実行したいコマンド:__DIR__ . "/xpdf-tools-win-4.03/bin64/pdftotext -enc Shift-JIS " . __DIR__ . "/pdftotext_escape/pdf/" . "ユーザが読み込ませたPDFのファイル名.pdf"
エラー:sh: /home/hoge/www/fuga/xpdf-tools-win-4.03/bin64/pdftotext: not found
でもコマンド末尾の2> ./logs/log.logのスペースは影響なくログが出力出来ているしスペースは悪さしていないのかな?とも思ったりしています。

ご教授いただきたくよろしくお願い致します。

追記

①フォルダ構成

/home/hoge/www/fuga/ ├ index.php ├ usr/ └ local/ ├ libexec/ └ xpdf/ ├ xpdfrc ├ pdftotext ├ share/ ├ xpdf/ ├ japanese/ ├ Shift-JIS.unicodeMap

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

「pdftotext.exe」を「pdftotext」にした

これがすごく気になります。pdftotext.exeはWindowsバイナリですよね。
さくらのレンタルサーバはFreeBSDなのでFreeBSDで動くバイナリを置く必要があると思います。
そして chmod 755 する必要があると思います。

投稿2021/05/18 06:37

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/18 07:10

https://www.xpdfreader.com/download.html だとしたら、サーバー環境に合わせたパッケージを選択し直さないといけないでしょうね。Linux 32/64-bitのコマンドラインツールはあるようです。が、レンタルサーバー側の制限によって動かない可能性もありますね。
gegegege

2021/05/18 22:08

ご回答ありがとうございます。 Linuxのパッケージを選択して実行してみるとエラー内容が 「sh: /home/hoge/www/fuga/xpdf-tools-linux-4.03/bin64/pdftotext: Exec format error」 に変わりました。 64bit/32bit両方でこのエラーが出ます。 パーミッションを755に変更済みです。 この場合は諦めるしかないのでしょうか。
itagagaki

2021/05/19 00:21

Linuxの実行可能ファイルフォーマットは ELF 形式です。 対してFreeBSDの実行可能ファイルフォーマットは a.out 形式です。 FreeBSD用のパッケージが入手できないなら、FreeBSD上でソースコードからビルドしないといけないですね。 さくらのレンタルサーバは確かシェルログイン可能だと思いますが、契約プランによるかもしれません。
gegegege

2021/05/19 14:38

なるほど、LinuxとFreeBSDでもファイル形式が違うのですね。 私の契約プランだとSHHが使用できます。 itagagaki様のアドバイスによってFreeBSD用のパッケージがダウンロードできました。 しかし、次はitagagaki様にお送りしたコメントの内容の問題が発生してしまい、まだ動作ができていません。
guest

0

ベストアンサー

さくらのレンタルサーバで XpdfReader を使うには、FreeBSD 用のバイナリをセットアップする必要があります。

XpdfReader のセットアップ

FreeBSD 向けのバイナリを含むパッケージ(pdftotext を含む)があります。パッケージをダウンロードし、展開すると、コマンドは利用可能になります。

Shell

1% wget https://pkg.freebsd.org/FreeBSD:12:amd64/quarterly/All/xpdf-4.02,1.txz 2% tar xvfz xpdf-4.02,1.txz 3% ./usr/local/libexec/xpdf/pdftotext -v 4pdftotext version 4.02 5Copyright 1996-2019 Glyph & Cog, LLC

あとは、PHP のソースコード上から、 pdftotext のパスを指定するなり、ディレクトリを移動されたら使えるようになるでしょう。

日本語への対応作業

初期状態では英語の PDF にしか対応していません。そのため、日本語に対応するためのパッケージも、あわせてセットアップします。

Shell

1% wget https://pkg.freebsd.org/FreeBSD:12:amd64/quarterly/All/ja-xpdf-jafont-4.02.txz 2% tar xvfz ja-xpdf-jafont-4.02.txz

このコマンドを仮に /home/example/ で実行したとしますと( example は実際のログインユーザ名に置き換えてお考えください)、 /home/example/usr/local/share/xpdf/japanese/ 以下に ShiftJIS を扱うために必要な Shift-JIS.unicodeMap などのファイルが展開されます。

次に、 ~/.xpdfrc ファイルを作成するか、既に有る場合は、以下の記述を追加します。※ /home/example/ 以下は、実際のサーバ上のパスを指定します。

unicodeMap Shift-JIS /home/example/usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap

それから、コマンドラインでの実行をお試しください。たとえば、次のようにコマンドラインを実行すると、 PDF の変更ができるかどうかを確認できます。

shell

1% cd ~/usr/local/libexec/xpdf 2% ./pdftotext -enc Shift-JIS -raw ~/test.pdf test.txt

ここまで来ましたら、環境は整いますので、PHP 側での変換処理ができるようになると思います。

投稿2021/05/19 11:17

編集2021/05/20 01:39
zembutsu

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gegegege

2021/05/19 14:32

ご回答ありがとうございます。 SSHで無事ダウンロードできました。 実行してみたところ、エラーログの内容が下記に変わりました。 ` Config Error: No paper information available - using defaults Syntax Error: Couldn't find unicodeMap file for the 'Shift-JIS' encoding Config Error: Couldn't get text encoding ` 下記URLを参考に細々と設定ファイルをいじってみましたがエラー内容が変わらず。 http://pdf-file.nnn2.com/?p=858 他にやらなければいけないことがあるのでしょうか。
itagagaki

2021/05/20 00:17

まず、xpdfrcファイルで unicodeMap Shift-JIS <file> で設定した <file> が無いのでは?
gegegege

2021/05/20 03:22

ファイルのパスを確認してみましたがあっているように思います。 下記がxpdfrcの最後に記述したコードです。 ``` #launchCommand viewer-script #----- begin Japanese support package (2011-sep-02) cidToUnicode Adobe-Japan1 /home/hoge/www/fuga/usr/local/libexec/xpdf/japanese/Adobe-Japan1.cidToUnicode unicodeMap ISO-2022-JP /home/hoge/www/fuga/usr/local/libexec/xpdf/japanese/ISO-2022-JP.unicodeMap unicodeMap EUC-JP /home/hoge/www/fuga/usr/local/libexec/xpdf/japanese/EUC-JP.unicodeMap unicodeMap Shift-JIS /home/hoge/www/fuga/usr/local/libexec/xpdf/japanese/Shift-JIS.unicodeMap cMapDir Adobe-Japan1 /home/hoge/www/fuga/usr/local/libexec/xpdf/japanese/CMap toUnicodeDir /home/hoge/www/fuga/usr/local/libexec/xpdf/japanese/CMap #fontFileCC Adobe-Japan1 /usr/..../NotoSansCJKjp-Regular.otf #----- end Japanese support package ``` フォルダ構成です。 ``` /home/hoge/www/fuga/ ├ index.php ├ usr/ └ local/ ├ libexec/ └ xpdf/ ├ xpdfrc ├ pdftotext ├ japanese/ └ CMap/ ├ Shift-JIS.unicodeMap ``` おそらくパスはあっていると思います。
itagagaki

2021/05/20 03:27

コメントだとインデントが効かないので、ちょっとなんだかわかんないですけど ^^; file /home/hoge/www/fuga/usr/local/libexec/xpdf/japanese/Shift-JIS.unicodeMap はエラーにならないんですね?
gegegege

2021/05/20 03:29

すみません、「日本語への対応作業」の追記部分を見逃していました。 一度、参考にして作業してみます。
gegegege

2021/05/20 09:09

やはりエラー内容は変わらないです。 現状のフォルダ構成は質問の所の追記に「①フォルダ構成」で書きました。 /home/hoge/www/fuga/usr/local/libexec/xpdf/xpdfrcファイルには下記追記済みです。 ` unicodeMap Shift-JIS /home/hoge/www/fuga/usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap ` file /home/hoge/www/fuga/usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap も ` /home/hoge/www/fuga/usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap: ASCII text ` と結果が返ってきます。
gegegege

2021/05/20 13:20

あれから原因をいろいろ探ってようやく動くようになりました!! 疑った原因は ・パーミッション ・パス ・ファイル名 です。 各種ファイルのパーミッションが755になっておらず、xpdfrcの場所がホームディレクトリになっておらず、xpdfrcのファイル名が「.xpdfrc」になっていませんでした。 ~/のパスの表記の意味が分かっておらず、指定された場所にファイルが置けていませんでした。 大変助かりました。ありがとうございます。 最後に素朴な疑問です。 XpdfReaderのセットアップ方法は元から知っていたのでしょうか。 それとも調べながらご教授いただいていたのでしょうか。 もし後者であればなにを参照されていたのか知りたいです。 今後の学習の参考にしたく、よろしければ教えていただきたいです。
zembutsu

2021/05/20 19:41

動くようになってよかったです! XpdfReaderをさくらのレンタルサーバで動かす方法は、今回調べながらご紹介しました。 <調べた手順> 基本的にオープンソースで公開・配布されているものは、大半がバイナリファイルかパッケージが公開されていますので、何かしら動くものをサーバにセットアップしたら動きます。セットアップには、公式サイトのドキュメント、ソースコードに含まれる README や INSTALL などのファイルを読むか、セットアップ後の man コマンドや公式ドキュメントを読むことで大半は解決します。 また、root 権限があれば FreeBSD は ports (pkgコマンド)で探す方法が一般的ですが、今回は一般ユーザでしか使えないという縛りが出てきます。そのため、手動でパッケージを探すかソースコードからコンパイルする必要があります。 これを踏まえて、 1. 公式サイト XpdfReader のダウンロードページ https://www.xpdfreader.com/download.html をさがし、FreeBSD 向けのバイナリやパッケージを確認 →今回はありません 2. パッケージ情報検索サイト pkgs.org で xpdf 関連のものを検索 https://freebsd.pkgs.org/12/freebsd-amd64/xpdf-4.02,1.txz.html 3. アーカイブ xpdf-4.02,1.txz をレンタルサーバ上に wget でダウンロード 4. ファイル内容を展開、動作確認 5. 日本語に関連するファイルは追加パッケージが必要なため、2 と同様の手順で ja-xpdf-jafont-4.02.txz を探し、レンタルサーバ上に展開 6. Shift-JIS.unicodeMap が展開された先にあることを確認 7. README ファイル(セットアップ手順や注意事項が書かれているのが一般的な)を読む 8. 設定ファイル ~/.xpdfrc に unicodeMap の記述を追加 9. 適当な PDF ファイルをレンタルサーバ上に転送し、Shift-JIS で書かれたファイルから日本語を抽出できることを確認
gegegege

2021/05/20 21:39

ありがとうございます。 ここら辺のリサーチ能力を身につけられるよう精進します。 今回の質問で知らなかったことがたくさん知れました。 ご回答いただいた方、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問