HTMLに直接PDFを埋め込む際、単純に <iframe> を使うと「スマホで1ページ目しか表示されない」といった問題が発生します。
今回は、どのデバイスでも安定して表示ができるJavaScriptライブラリ「PDF.js」を使用した実装方法をご紹介します。
注意点
今回、最新バージョンを試したところ、「PCのChromeでは問題なく表示されるが、スマホや一部のブラウザではUIだけ表示されてPDFが表示されない」という現象に直面しました。
■原因
最新バージョンでは.mjsファイル(ES Modules)が使用されています。 これがサーバー環境によっては、ブラウザがJavaScriptとして正しく認識できず、読み込みエラーになっていました。
■対応
.htaccessに.mjsをJavascriptファイルだと認識させるための記述を試したところ、スマホでは表示されましたが、PCの一部ブラウザでは改善されなかったため、最終的に.js版の旧バージョンを使用することで解決しました。
▼旧バージョンのダウンロードはこちら(pdfjs-2.6.347-dist.zipをダウンロードします)
https://github.com/mozilla/pdf.js/releases/tag/v2.6.347
実装の流れ
①PDF.jsをサーバーに設置する
ダウンロードしたzipを解凍し、サーバー上にアップします。 フォルダ名は任意ですが、今回はpdfjsとしています。以下のようなディレクトリ構造になりました。
├── pdfjs/ (ライブラリ一式)
│ ├── build/
│ └── web/
│ └── viewer.html
└── pdf/
└── mtradblog.pdf (表示したいファイル)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>HTMLにPDFを埋め込む</title>
<style>
/* 画面いっぱいに表示するためのスタイル */
html, body { margin: 0; height: 100%; overflow: hidden; }
iframe { width: 100%; height: 100%; border: none; }
</style>
</head>
<body>
<iframe src="pdfjs/web/viewer.html?file=../../pdf/mtradblog.pdf"></iframe>
</body>
</html>
実装のポイント
①viewer.htmlを読み込む
pdfjs/web/viewer.html
PDF.jsには専用のビューアが用意されています。これを経由することでPDFが正しく描画されます。
②fileパラメータでPDFを指定
?file=../../pdf/mtradblog.pdf
表示したいPDFのパスを指定します。相対パス・絶対パスどちらでもOKですが、相対パスの場合は「viewer.htmlから見たパス」になる点に注意です。
以上、PDF.jsを使用したHTMLにPDFを埋め込む方法のご紹介でした。
iframeでうまく表示できない場合でも、PDF.jsを使うことでPC・スマホ問わず安定して表示することができます。同様の現象でお困りの方は、ぜひ参考にしてみてください。

