HTMLだけでPDFを画面全体に表示する

:::note warn
この内容は主に**PCのブラウザ**でPDFを表示することを意図しています。**モバイルのブラウザ**では対応していない内容も多くあるようです。
:::

## 要約
`<embed>`タグなどを使うことでページにPDFを埋め込むことができます。

また、`src`のURLにオプションを指定することで、表示を調整することもできるようです。

https://pdfobject.com/pdf/pdf_open_parameters_acro8.pdf

画面全体での表示は以下のようなHTMLで実装できました。


<details>

<summary>画面全体でPDFを表示するHTML</summary>

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Test PDF</title>
  <style>
    body {
      margin: 0;
      overflow: hidden;
    }
  
    embed {
      width: 100vw;
      height: 100vh;
    }
  </style>
</head>
<body>
  <embed src="https://pdfobject.com/pdf/sample-3pp.pdf#toolbar=0&view=Fit" type="application/pdf">
</body>
</html>
```

</details>

## 背景
**PDFをWebページ上に埋め込んで表示したい**ということがありました。よくあるPDFの表示といえば、リンクをクリックして**別タブでPDFが開かれる**といった形かと思いますが、そうではなく**同じタブの同じHTML内に埋め込む**ということを実装したかったです。

PDFを表示するJSライブラリなどもありますが、学習コストもできるだけ抑えたいので、ライブラリなしでいじれたらなーという思いがありました。

そこで色々と調べていると以下のドキュメントに辿り着きました。

https://pdfobject.com/static/

曰く、`<embed>`タグや`<iframe>`タグ、`<object>`タグを使うことで、プレーンなHTMLでもPDFが埋め込めるようです。

## 実装
以後、動作確認は**MacBookのChrome**で閲覧しています。

### HTMLだけでPDFを表示してみる
実際にHTMLを以下のように記述してみます。表示するPDFは先ほどのサイトで用意されているサンプルのものです。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Test PDF</title>
</head>
<body>
  <embed src="https://pdfobject.com/pdf/sample-3pp.pdf" type="application/pdf">
</body>
</html>
```

![browser_pdf-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351104/2a071674-c92e-f5be-3e59-1ab2bda2ca78.png)

全画面にするためにスタイルも追加しておきます。

```html:index.html(追加分だけ)
<style>
  body {
    margin: 0;
    overflow: hidden;
  }

  embed {
    width: 100vw;
    height: 100vh;
  }
</style>
```

![browser_pdf-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351104/f57e1189-c239-000b-9726-959780d08feb.png)

よく見るChromeのPDF表示と同じになりましたね。でもこれはHTMLで表示しています。なので、表示枠のボックスに対してにはなりますが、CSSのスタイルだったり、DOM操作を行えます。

一方で、**ファイル名とかページのプレビューとかが上と左に表示されています**。コンテンツだけ表示したいという時には、これらの情報はない方が望ましいです。

### PDFのコンテンツだけ表示する
そこでさらに調べてみると、**PDFのソースにオプションを指定する**ことで表示を制御できると書かれたドキュメントにヒットしました。Acrobat® SDKの2007年に出されたドキュメントのようでしょうか…？

https://pdfobject.com/pdf/pdf_open_parameters_acro8.pdf

中のパラメータを色々見てみて、HTMLを以下のように修正しました。オプションのパラメータは`<embed>`タグの`src`に渡すURLで、`{URL}#key1=value1&key2=value2...`といった形式で指定できるようです。

```diff_html:index.html
-  <embed src="https://pdfobject.com/pdf/sample-3pp.pdf" type="application/pdf">
+  <embed src="https://pdfobject.com/pdf/sample-3pp.pdf#toolbar=0&view=Fit" type="application/pdf">
```

![browser_pdf-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351104/c2482d30-9a42-3c7c-1c44-8aecc7e2aeb3.png)

綺麗にページの全画面で表示することができました。指定したオプションは、`toolbar=0`と`view=Fit`です。`toolbar=0`では、**上部のファイル名や、左のページプレビューを非表示に設定**しています。`view=Fit`では、**表示コンテンツを表示領域にフィットするようにスケールします**。これにより、ちょうど1ページが綺麗に収まって表示されました。

本当はグレーの背景色も消したかったのですが、その方法は分かりませんでした…。表示コンテンツとしては問題ないので、ここは一旦許容することにしました。

### その他のオプション
他にも指定できるオプションはいくつかあるようです。例えば`page=2`のようにページ数を指定すると、そのページが表示されます。

![browser_pdf-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351104/e2c21d29-2566-30f3-ffaa-2f58a637e36e.png)

他のオプションは、先ほどのドキュメントを参照してもらえればと思います。

https://pdfobject.com/pdf/pdf_open_parameters_acro8.pdf

## 終わりに
今回のソースは以下のリポジトリにも保存しています。必要に応じて参照してください。

https://github.com/mochi-yu/qiita-material/tree/main/pdf-embed

## 参考

https://www.intwk.co.jp/2023/03/14/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%81%ABpdf%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E6%96%B9%E6%B3%95/

https://pdf.wondershare.jp/info/html-embed-pdf.html

https://pdfobject.com/static/