やりたいこと
ブログやホームページなどに掲載している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
- この問題を解決しているのが