PHPプログラミング

レシピ

mPDFライブラリ

mPDFでHTMLからPDFを作成する

mPDFライブラリでHTML&CSSの内容をそのままPDF出力する方法について解説します。

この記事のポイント

  • HTMLファイルからPDFファイルを作成する
  • メディアクエリでPDF出力用のCSSを読み込む

目次

HTMLをそのままPDFファイルとして出力する

今回は、mPDFライブラリを使ってHTML&CSSからPDFファイルを作成します。
次のような流れで解説を進めていきます。

  • 出力するHTMLの確認
  • PDFファイルを作成
  • 不要なタグを取り除いてPDFファイルを最適化

mPDFライブラリはすでにインストールされていることを前提に進めます。
インストールや基本的な使い方については、「mPDFライブラリでPDFファイルを作成する」を参照ください。

こちらで解説している内容は公式リファレンスを元にしています。
リファレンスを参照したい方はこちらをご覧ください。
mPDF Manual (英語)

PDFファイルに出力するHTMLとCSSを確認

PDFを作成する前に、まずはPDFに出力したいHTMLとCSSの内容を確認します。
HTMLは「test.html」、CSSは「style.css」です。

test.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="description" content="テストページです。">
<title>HTMLからPDFを作成する</title>
<link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
	<h1><span>PDF出力のテスト</span></h1>
	<p>こちらはテスト用のHTMLページです。特に意味はありません。</p>
	<figure><img src="pic.jpg"></figure>
</body>
</html>

このHTMLでは次の「style.css」を読み込みます。

style.css

/* Reset CSS
------------------------- */
html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code,
del, dfn, em, img, ins, kbd, q, samp,
small, strong, sub, sup, var,
b, i,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video {
    margin:0;
    padding:0;
    border:0;
    outline:0;
    font-size:100%;
    vertical-align:baseline;
    background:transparent;
}

body {
    line-height:1;
}

article,aside,details,figcaption,figure,
footer,header,hgroup,menu,nav,section { 
    display:block;
}

nav ul {
    list-style:none;
}

blockquote, q {
    quotes:none;
}

blockquote:before, blockquote:after,
q:before, q:after {
    content:'';
    content:none;
}

a {
    margin:0;
    padding:0;
    font-size:100%;
    vertical-align:baseline;
    background:transparent;
}

/* change colours to suit your needs */
ins {
    background-color:#ff9;
    color:#000;
    text-decoration:none;
}

/* change colours to suit your needs */
mark {
    background-color:#ff9;
    color:#000; 
    font-style:italic;
    font-weight:bold;
}

del {
    text-decoration: line-through;
}

abbr[title], dfn[title] {
    border-bottom:1px dotted;
    cursor:help;
}

table {
    border-collapse:collapse;
    border-spacing:0;
}

hr {
    display:block;
    height:1px;
    border:0;   
    border-top:1px solid #cccccc;
    margin:1em 0;
    padding:0;
}

input, select {
    vertical-align:middle;
}


/* CSS
------------------------- */
body {
	padding: 20px;
	color: #333;
	background-color: #f7f7f7;
}

h1 {
	margin-bottom: 40px;
	padding: 10px 0;
	font-size: 129%;
	color: #fff;
	text-align: center;
	background: #0088cf;
}

p {
	margin-bottom: 20px;
}

figure {
	margin-bottom: 40px;
	width: 100%;
}
	figure img {
		max-width: 100%;
		height: auto;
		line-height: 1.0em;
		vertical-align: top;
	}

このHTMLをブラウザで表示すると次のようになります。

ブラウザの表示例

この表示をそのままPDFファイルとして出力していきます。

PDFファイルを作成する

PDFを作成する以下のコードを「mpdf.php」に書きます。

mpdf.php

<?php
require_once __DIR__.'/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf([
	'fontdata' => [
	    'ipa' => [
		    'R' => 'ipag.ttf'
		]
	],
	'format' => 'B5-P'
]);

// HTMLファイルの読み込み
$html_doc = new DOMDocument();
$html_doc->loadHTMLFile('test.html');

// PDFファイルにHTMLをセット
$mpdf->WriteHTML( $html_doc->saveHTML());

// PDFファイルとして出力
$mpdf->Output();
return;

このコードを実行すると、読み込んだHTMLをそのままPDFファイルとして出力します。

PDF出力例

コードを上から順に解説していきます。

2〜11行目まではmPDFライブラリの読み込み、mPDFクラスのインスタンス作成という基本設定を行っています。

require_once __DIR__.'/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf([
	'fontdata' => [
	    'ipa' => [
		    'R' => 'ipag.ttf'
		]
	],
	'format' => 'B5-P'
]);

続く13〜15行目では、先述のHTMLファイルをそれぞれ読み込む指定です。

// HTMLファイルの読み込み
$html_doc = new DOMDocument();
$html_doc->loadHTMLFile('test.html');

HTMLファイルの読み込みには、まずDOMDocumentクラスのインスタンスを作成します。
その後に、loadHTMLFileメソッドで読み込みたいHTMLファイルを指定し、読み込みを行います。

// PDFファイルにHTMLをセット
$mpdf->WriteHTML( $html_doc->saveHTML());

最後に、OutputメソッドでPDFファイルを出力して終了です。

// PDFファイルとして出力
$mpdf->Output();
return;

PDFのタイトルは、HTMLのhead要素内にあるtitleタグから自動的に設定されます。

複数のCSSを読み込む

先ほどのHTMLでは1つのCSSを読み込んでいますが、通常のHTMLページ同様に複数のCSSを読み込むことも可能です。
次の例では「reset.css」「style.css」「test.css」の3つのCSSを読み込んでいます。

test.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="description" content="テストページです。">
<title>HTMLからPDFを作成する</title>
<link type="text/css" rel="stylesheet" href="reset.css">
<link type="text/css" rel="stylesheet" href="style.css">
<link type="text/css" rel="stylesheet" href="test.css">
</head>
<body>
	<h1><span>PDF出力のテスト</span></h1>
	<p>こちらはテスト用のHTMLページです。特に意味はありません。</p>
	<figure><img src="pic.jpg"></figure>
</body>
</html>

HTML&CSSがPDF出力以外の場所でも使用している場合などに、もしPDF出力にのみ適用したいCSSがあるときはメディアクエリ「print」で印刷用CSSを用意するのも1つの方法です。

<link type="text/css" rel="stylesheet" href="style.css">
<link type="text/css" rel="stylesheet" media="print" href="pdf.css">

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。