linuxのfirefox上でpdfを開く方法

タイトルにlinuxとか書いてますがgentooを前提に書かれています
応用すれば大抵のlinuxでできると思いますけどね

前置き

gentooだと

# emerge -va "app-text/acroread"

でpdfが見れるacroreadを導入できますがfirefoxのpluginとしては入ってくれません
なぜかflashの方の

# emerge -va "www-plugins/adobe-flash"

だと勝手にfirefoxのpluginとして入ってくれます

やり方

前提にacroreadをパッケージ管理で入れといてください
gentooだと

# emerge -va "app-text/acroread"

です
まずはacroreadのインストール先を知る必要があります
別に知らなくてもpathさえ通ってればいいのでとりあえず確認します

% which acroread
/opt/bin/acroread

これでacroreadへのPATHが通っていることがわかったので次に
nppdf.soというファイルの場所を知る必要があります
locateが使えるなら

% locate nppdf.so
/opt/Adobe/Reader9/Browser/intellinux/nppdf.so

これで一瞬ですがfindなどを使っていては時間がかかりますし
先ほどの/opt/bin/acroreadがシンボリックリンクならその結果を利用してインストール先を探りましょう

% ls -l /opt/bin/acroread
lrwxrwxrwx 1 root root 31 Jun  6 00:05 /opt/bin/acroread -> /opt/Adobe/Reader9/bin/acroread

もしここでシンボリックリンクじゃないとわかった場合はfindでnppdf.soを探してください
どうやらインストール先は

/opt/Adobe/Reader9

だったようなのでそこからの相対パスで考えて

% cd /opt/Adobe/Reader9
% cd Browser/intellinux

ここにnppdf.soがあります
そういうわけでntpdf.soへの絶対パス

/opt/Adobe/Reader9/Browser/intellinux/nppdf.so

がわかったので後はfirefoxのpluginsのディレクトリにシンボリックリンクを貼るだけです
大抵はfirefoxの実体がある場所だと思うので

% which firefox
/usr/bin/firefox
% ls -l /usr/bin/firefox
lrwxrwxrwx 1 root root 24 Jul 21 10:15 /usr/bin/firefox -> /usr/lib/firefox/firefox

というわけで

/usr/lib/firefox

がそうみたいなので

% ln -s /opt/Adobe/Reader9/Browser/intellinux/nppdf.so /usr/lib/firefox/plugins

こんな感じに貼ります
試してませんが恐らく

% ln -s /opt/Adobe/Reader9/Browser/intellinux/nppdf.so ~/.mozilla/plugins

このようにユーザーごとのmozillaディレクトリでもできると思います
プラグインを導入できれば後はfirefoxを再起動させて
アドレスバーに

about:plugins

を打ち込んでAdobe Readerがあることを確認した後
好きなpdfをブラウザで開いて実際にできるか確かめれば終わりです

方法を導いた方法

前置きに書いた違いはわかりませんがとりあえず
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/773pdfinff.html
ここを見るに

# ./install_browser_plugin

というファイルを探して実行すればいいようですが

% locate install_browser_plugin

をしてもファイルが見当たりません*1
どうやら本来はacroreadのインストール先近くにあるように読み取れるので
適当に探してみると

/opt/Adobe/Reader9/Browser

というそれらしきディレクトリが見つかりましたがinstall_browser_pluginは見つかりません
しかしこのディレクトリにHowToという名前のディレクトリがあったので中を開いていくと

/opt/Adobe/Reader9/Browser/HowTo/ENU/Browser_Plugin_HowTo.txt

なんだか説明してくれてそうなテキストファイルが見つかったので中を見てみると
それっぽいのがありました
折角なんで全部訳してここに置きました
https://gist.github.com/3162843
要点だけまとめるとどうやら./install_browser_pluginというスクリプトを使うみたいですがないので
acroreadをいれたebuildを見ることにします

% view /usr/portage/app-text/acroread/acroread-9.5.1.ebuild

すると171行目あたりで

	# remove cruft
	rm "${S}"/Adobe/Reader9/bin/UNINSTALL
	rm "${S}"/Adobe/Reader9/Browser/install_browser_plugin
	rm "${S}"/Adobe/Reader9/Resource/Support/vnd.*.desktop

なんだか削除してました
恐らくこれが原因ですね
とにかくacroreadを入れるのに使ったSRC_URIにはこのスクリプトがありそうなので

% cp /usr/portage/distfiles/AdbeRdr9.5.1-1_i486linux_enu.tar.bz2 ~/tmp

こんな感じで好きなディレクトリにコピーしておきます
そして解凍します

% cd ~/tmp
% tar xvf AdbeRdr9.5.1-1_i486linux_enu.tar.bz2
AdobeReader/
AdobeReader/COMMON.TAR
AdobeReader/ILINXR.TAR
AdobeReader/INSTALL
AdobeReader/ReadMe.htm

どうやらまた解凍しないといけなさそうです
どっちにあるかわからないのでそれぞれの圧縮ファイルに何が入っているかリストを表示させて
grepで目的のファイルがあるか絞り込みます

% cd ./AdobeReader
% tar tvf COMMON.TAR|grep install_browser_plugin
% tar tvf ILINXR.TAR|grep install_browser_plugin
-rwxr-xr-x root/root     15710 2012-03-28 19:48 Adobe/Reader9/Browser/install_browser_plugin

ILINXR.TARにあるみたいなので解凍します

% tar xvf ILINXR.TAR
(出力は省略)

どんな処理をしているのか中身を見ることにしますが
いきなりソースを読むなんていう荒業はしたくないので#がある行をgrepで引きぬいて
コメントだけを読んでいくことにしますが後でソースも見たいので

  • nオプションもつけて行番号が表示されるようにしてます
% grep -n "#" Adobe/Reader9/Browser/install_browser_plugin

すると42行目から46行目にそれっぽいことがコメントで書いてありますので必要な箇所だけ翻訳してまとめますと

ブラウザのインストールパス(ユーザーによって指定された)内の
'plugins'フォルダを見つけ出してこの場所にプラグインをコピーする
もしプラグインが既に存在していたらユーザーに上書きするかどうか
それに応じて続行するかどうかを促します

ようはこの後にプラグインを移動させたり上書きさせたりする処理をしてるみたいなので

% view Adobe/Reader9/Browser/install_browser_plugin

さっそく46行目から下を見ていきます
こんな文章がありました
すると83行目あたりでそれっぽいのがありました

    BROWSER_PLUGIN_FILE="${BROWSER_PLUGIN_DIR}/nppdf.so"

このBROWSER_PLUGIN_DIRがどのように定義されているのか知りたいので検索すると
75行目あたりからのソースで
その中の

    BROWSER_PLUGIN_DIR="${BROWSER_DIR}/plugins"

これでpluginsの場所を指定しているみたいなのでBROWSER_DIRの変数はどのように定義されているのかソース内を検索すると
54行目あたりで定義されているようです

    if [ $# -eq 0 ]
(中略)
    else
    BROWSER_DIR=$1
    fi

このように書いてあるのできっとこの処理が書かれている関数を呼び出している時に
ブラウザのディレクトリが指定されているみたいですね
もし関数を呼び出している時に指定されていなければ手動で指定しなければいけないようです
この処理はInstallBrowserGlobalという関数の中にあるので呼び出しているところを検索して探します
するとAutoInstallSystemPathという関数内で呼び出しているようで
その関数がInstallBrowserGlobalを呼び出す時に指定している引数の変数は
このAutoinstallSystemPathの引数が入っているみたいなので
AutoInstallSystemPathの呼び出し元をまた検索します
するとAutoInstallの関数内で引数に${BROWSER_LIB_DIR}が使われているようです
この変数は実力が足らなくてどのように定義されているかわかりませんが
恐らく私の環境だと/usr/lib/firefoxになっていると思います
仮にそうだとしたら

BROWSER_PLUGIN_DI="/usr/lib/firefox/plugins"

になってそうです
そういう前提で話を進めていくと
247行目辺りからプラグインをコピーしている処理をしているようです

    cp "$NPPDF_FILE" "$BROWSER_PLUGIN_FILE"

こうなっているのでNPPDF_FILEの変数を調べていくと
539行目あたりからで定義しているようです
OSはHP-UXではないので

    NPPDF_FILE="${ACROREAD_DIR}/Adobe/Reader9/Browser/${CONFIG_FOLDER}/nppdf.so"

になっているみたいです
CONFIG_FOLDERの値はソースで検索すると
520行目あたりでintellinuxが入ってそうです
ここまでわかればもうソースなんて見ないでも問題ないですね
同じようなディレクトリ構造のファイルはacroreadのインストール先にあるので

# cp /opt/Adobe/Reader9/Browser/intellinux/nppdf.so /usr/lib/firefox/plugins/

でいいのですがlsでディレクトリを見てみると

% ls -la /usr/lib/firefox/plugins
total 0
lrwxrwxrwx 1 root root 54 Jun 19 00:31 libflashplayer.so -> /opt/Adobe/flash-player/flash-plugin/libflashplayer.so

flashの場合はシンボリックリンクを張っているみたいなので
そうしましょう
なので

% ln -s /opt/Adobe/Reader9/Browser/intellinux/nppdf.so /usr/lib/firefox/plugins

このようになります
そしてブラウザを再起動します
次にきちんとロードができているか確認するためにアドレスバーに

about:plugins

を打って開きます
Adobe Readerの文字があれば恐らくロードができているので後は適当なpdfが開けることを確認すれば終了です
google

filetype:pdf

と検索するのが手っ取り早く適当なpdfファイルを用意できます

後書き

正直なところこんなに冗長的な文章を書く必要なかった気がする
実際、書いてる途中でプラグインの実体がどれか薄々気づいていたので
さっさとfirefoxのドキュメントでも読んでいたほうが良かった気がする

*1:locateコマンドはsys-apps/mlocateで入ります