IEはなぜPDFを自動表示できるのか|ActiveXとレジストリの仕組みを調査した

概要

今回はIE(Internet Explorer)がPDFをどのようにして自動表示しているのかについて調査した内容を紹介していきます。

古いシステムのソースを読んでいたら、PDFを表示している箇所なのに<iframe>タグしか書かれていなくて、ちょっと不思議に思ったんですよね(- -;
Chromeなら組み込みのPDFビューアが動いているんだろうなと想像がつくと思いますが、IEの場合は少し仕組みが違いました。

調べてみると、IE自体がPDFをActiveXで自動的に開く仕組みを持っていることが分かりました。
ポイントは「MIMEタイプとActiveXコントロールを結びつけるレジストリマッピング」です。

本記事では、実際の表示フローとレジストリの確認方法を順番にまとめました。
同じように「なぜiframeだけでPDFが表示されるんだろう」と気になった方は、参考にしてみてください。

それではやっていきましょう!

目次

IEの自動関連付けの仕組み

IEは、コンテンツのMIMEタイプとActiveXコントロールを結びつけるための独自のレジストリマッピングを持っています。
具体的には、以下のレジストリキーが使われます。

1
HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/pdf

このキーの中にCLSIDという値があり、そこに例えば{CA8A9780-280D-11CF-A24D-444553540000}(=AcroPDF.PDFのGUID)のようなIDが登録されています。
ブラウザに専用のPDFビューアが組み込まれているわけではなく、OS側のレジストリ設定を参照してActiveXコントロールを呼び出しているという点が、他のモダンブラウザとの大きな違いですね。

実際のフロー

PDFがiframe内に表示されるまでの流れは、次の4ステップになっています。

  • ①iframeがxxx.pdfをロード
    • HTMLソース上は<iframe src="xxx.pdf">のような記述だけ
  • ②サーバーがContent-Type: application/pdfを返す
    • レスポンスヘッダのMIMEタイプがきっかけになる
  • ③MIMEタイプに対応するCLSIDをレジストリから取得
    • HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/pdfのCLSID値を参照
  • ④見つかったファイル(例:AcroPDF.dll)を自動的にロードし、iframeの表示領域にそのままレンダリング
    • ActiveXがOSレベルの関連付けに近い動きで起動する

つまり「IEがActiveXを自動起動する」という、OSレベルの関連付けに近い動きをしているということです。
そのためHTMLソースにはiframeタグしか書かれておらず、PDFビューア自体はページ内に一切実装されていません。
最初は、てっきりJavaScriptか何かで動的にビューアを差し込んでいるのかと思っていたので、レジストリ経由と分かったときは流石に想定外で「嘘だろ?」となりました。

流れを図にすると、以下のようになります。

IEがiframe内のPDFをActiveXで自動表示するまでの4ステップ
IEがPDFを自動表示する仕組みのフローチャート。iframeがPDFをロードし、サーバーがContent-Type: application/pdfを返し、レジストリのCLSID値からActiveXのGUIDを取得し、対応するDLL(AcroPDF.dllなど)をロードしてiframe内にレンダリングする4ステップ

レジストリの確認方法

実際にどのCLSIDが紐付いているかは、以下の手順でレジストリエディタから確認できます。

  • ①レジストリエディタを開く
    • regeditをWindowsの検索から起動する
  • ②HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/pdfを参照
    • “CLSID”のデータを取得する
  • ③取得したCLSIDを検索する
    • HKEY_CLASSES_ROOT\CLSID\{そのGUID}\InprocServer32に書かれているファイルが、IEのPDF表示時に使用されるActiveXコントロールの実体

環境によってはAdobe Acrobat/Readerの有無、または他社製PDFビューアのインストール状況によって、ここに登録されるCLSIDやDLLが変わります。
自分の環境で確認する際は、実際にレジストリエディタで値を追いながら確認するのが確実です。

締め

いかがでしたか?

IE自体はサポート終了済みですが、社内システムなどでは今もIEモード経由で似たような仕組みが動いていることがあるので、古いPDF埋め込みの挙動で詰まったときは、まずHKEY_CLASSES_ROOT\MIME\Database\Content Type\application/pdfのCLSIDマッピングを確認するとよさそうです。

ieはモダンブラウザしか使用していない自分からすると、特殊な実装が多すぎてエンジニア泣かせですね…
新規開発はないとはいえ、現行保守の方は対応するしかない
会社としては移行するためのリスクと費用がバカにならないので、なかなかやりたがりませんもんね。

あと普通に移行しようとすると画面差分が出過ぎて炎上する(- -

ie君とは適切に付き合っていきましょ!

以上となります。
この調査に数時間かけた工数がもったいない…
それではお疲れさまでした。