TCPDF ＋FPDIでブラウザから表示するPDFファイルに意図した「タイトル」を表示させてサイトのSEO効果を高める

## やりたいこと
ブログやホームページなどに掲載しているPDFファイルをブラウザで表示しようとした。
すると、ブラウザでのタブに、そのPDFのファイル名やPDFのプロパティで設定されている`タイトル`が表示されてしまっている。
PDFファイルの数が少ないなら、それらを更新すれば済む。
しかし、その数が多いのであれば、`タイトル`を他のページで設定しているHTMLの`<title>`タグと統一した内容にしたり、適切なものにしたりできるプログラムを組む必要が生じる。
そのように、意図した`タイトル`を設定すればSEO効果も期待できるそうだ。
よって、PDFファイルをブラウザで表示する際に、タブに意図した`タイトル`タグの内容を表示できるプログラムを作成していく。

- [ブラウザでPDFを開く時、ファイル名ではなく「タイトル」を表示させたい！＜その方法と嬉しい効果＞ | 株式会社Ｅプレゼンス【Webマーケティング＆ブランドコンサルティング】](https://www.e-presence.jp/archives/4968)

## 失敗した方法
**考案内容: PDFファイルを表示するPHPプログラムを作成して、それに`<title>`タグを設定する**

- ブラウザのタブで表示される値は、一般的にHTMLの`<title>`タグで設定する。
  - HTMLは他のページと同じような`<title>`を記入。
- PHPでは`TCPDF`や`FPDI`といったライブラリは使用せず、`header()`関数と`readfile()`関数を使用する。

```view_pdf.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>PDFを表示する方法｜PDFを表示したいサイト</title>
</head>
</html>

<?php 
ob_clean();
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename=sample.pdf');
header('Content-Length:'.filesize('./sample.pdf'));
readfile('./sample.pdf');
?>
```

**結果: 失敗**

### 失敗要因予想

- PHPで`ob_clean()`関数使用しているから`<html>`の内容が削除されてる? 
- `ob_clean()`関数をコメントアウトしてもPDFは表示されませんでしたが。
- HTML部を削除したらPDFは問題なく表示された。タブではPDFのファイル名かプロパティにおける`タイトル`が表示されている状態。
- HTMLで`<head>`を指定してもPHPで`Content-Type`設定しているから共存できないというか、このやり方じゃダメ。

## 失敗を踏まえて

- `header`関数と`readfile()`関数を使用しないPDFファイルの読み込み方法を考える必要がある。
  - `TCPDF`と`FPDI`を使えばできるかも?
- HTMLの`<title>`タグを使う必要があるのか?
  - PDFのプロパティにおける`タイトル`がブラウザのタブに表示されているのだから、PDFのプロパティを更新すれば良いのでは?

## 解決した方法
### 改善点
- PDFの読み込みと出力には`TCPDF`と`FPDI`ライブラリを使用する。
- HTMLの`<title>`タグは使用しない。
  - PDFのプロパティにおける`タイトル`を更新する。

### コード
[PHPでPDFファイルを編集する – SAT Staff Blog](https://blog.sat.ne.jp/2020/10/22/php%E3%81%A7pdf%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B/)を参考に作成。
`TCPDF`と`FPDI`の導入方法もここを参考に。

```view_pdf.php
<?php

// TCPDFとFPDIライブラリ読み込み
require_once './TCPDF/tcpdf.php';
require_once './FPDI/src/autoload.php';

// 新規PDFを作成
$pdf = new setasign\Fpdi\Tcpdf\Fpdi();

// 新規PDFのプロパティにおけるタイトルを設定
$title = 'PDFを表示する方法｜PDFを表示したいサイト';
$pdf->SetTitle($title);

// 新規PDFのページ設定
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetMargins(0, 0, 0);
$pdf->SetCellPadding(0);

// 表示したいPDFの総ページ数取得
$pages = $pdf->setSourceFile('./sample.pdf');

// 表示したいPDFを読み込み
$pdf->setSourceFile('./sample.pdf');

// 新規PDFに表示したいPDFを反映
for($i=1; $i<$pages+1; $i++){
	$pdf->AddPage();
	$tpl = $pdf->importPage($i);
	$pdf->useTemplate($tpl,['adjustPageSize' => true]);
}

// ブラウザに出力
ob_clean();
$pdf->Output('sample.pdf', 'I');
?>
```

### コード解説
- 処理の流れとしては、新規のPDFを作成し、新規PDFのプロパティにおけるタイトルを設定、新規PDFのページを設定、新規作成されたPDFに対して表示させたいPDFの内容をコピーして、ブラウザに出力というもの。
- `TCPDF`と`FPDI`を使用すれば **`$pdf->SetTitle('ブラウザに表示させたいタイトル')`** で簡単にPDFのプロパティにおける`タイトル`を更新できる。
  - [タイトルを設定する - TCPDFの部屋](http://www.t-net.ne.jp/~cyfis/tcpdf/tcpdf/SetTitle.html)
- この解決法における一番の問題点は、新規のPDFファイルを作成しているため、既存のPDFで設定されている**サイズ設定などを反映する** 必要がある事。
  - この問題を解決しているのが `$pdf->useTemplate($tpl,['adjustPageSize' => true])` の**`['adjustPageSize' => true]`**。
    - これを有効化していることで、表示したいPDFのページサイズ設定を新規作成したPDFにそのまま反映して、出力できるようになっている。
    - [PHPでPDFファイルを出力する | IT底辺脱却ブログ](https://moewe-net.com/php/output-pdf)
    - [EC-CUBE: クラス FPDI](http://sound-acid.gonna.jp/class_f_p_d_i.html)


## 参考資料
- [ブラウザでPDFを開く時、ファイル名ではなく「タイトル」を表示させたい！＜その方法と嬉しい効果＞ | 株式会社Ｅプレゼンス【Webマーケティング＆ブランドコンサルティング】](https://www.e-presence.jp/archives/4968)
- [PHPでPDFファイルを編集する – SAT Staff Blog](https://blog.sat.ne.jp/2020/10/22/php%E3%81%A7pdf%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B/)
- [PHPでPDFファイルを出力する方法 │ ゆたブログ](https://lsd-blog.com/php-pdf/)
- [タイトルを設定する - TCPDFの部屋](http://www.t-net.ne.jp/~cyfis/tcpdf/tcpdf/SetTitle.html)
- [PHPでPDFファイルを出力する | IT底辺脱却ブログ](https://moewe-net.com/php/output-pdf)
- [EC-CUBE: クラス FPDI](http://sound-acid.gonna.jp/class_f_p_d_i.html)