やりたいこと
ブログやホームページなどに掲載しているPDFファイルをブラウザで表示しようとした。
すると、ブラウザでのタブに、そのPDFのファイル名やPDFのプロパティで設定されているタイトルが表示されてしまっている。
PDFファイルの数が少ないなら、それらを更新すれば済む。
しかし、その数が多いのであれば、タイトルを他のページで設定しているHTMLの<title>タグと統一した内容にしたり、適切なものにしたりできるプログラムを組む必要が生じる。
そのように、意図したタイトルを設定すればSEO効果も期待できるそうだ。
よって、PDFファイルをブラウザで表示する際に、タブに意図したタイトルタグの内容を表示できるプログラムを作成していく。
失敗した方法
考案内容: PDFファイルを表示するPHPプログラムを作成して、それに<title>タグを設定する
- ブラウザのタブで表示される値は、一般的にHTMLの
<title>タグで設定する。- HTMLは他のページと同じような
<title>を記入。
- HTMLは他のページと同じような
- 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のプロパティにおける
解決した方法
改善点
- PDFの読み込みと出力には
TCPDFとFPDIライブラリを使用する。 - HTMLの
<title>タグは使用しない。- PDFのプロパティにおける
タイトルを更新する。
- PDFのプロパティにおける
コード
PHPでPDFファイルを編集する – SAT Staff Blogを参考に作成。
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のプロパティにおけるタイトルを更新できる。 - この解決法における一番の問題点は、新規のPDFファイルを作成しているため、既存のPDFで設定されているサイズ設定などを反映する 必要がある事。
- この問題を解決しているのが
$pdf->useTemplate($tpl,['adjustPageSize' => true])の**['adjustPageSize' => true]**。- これを有効化していることで、表示したいPDFのページサイズ設定を新規作成したPDFにそのまま反映して、出力できるようになっている。
- PHPでPDFファイルを出力する | IT底辺脱却ブログ
- EC-CUBE: クラス FPDI
- この問題を解決しているのが