PHP로 PDF를 작성할 때는 phpwkhtmltopdf로 싸움 [2016년도판]

8854 단어 PHPPDFwkhtmltopdf

PDF는 여전히 어려움



브라우저의 인쇄 기능에 PDF 변환이 구현되어 오랜, 기원 2016년.
지금도 아직 여러가지 가려움에 밀린 PHPer들의 불모한 싸움은 계속되고 있습니다.
벌써 해의 세입니다만 내년도 PDF와 싸워 가기 위한 정보를 전달합니다.

wkhtmltopdf와 phpwkhtmltopdf로 행복해지자



wkhtmltopdf



htp // wkhtml 및 pdf. rg/

HTML을 Webkit로 해석하여 PDF로 변환하는 Google 근제 도구입니다.
HTML5도 CSS3도 어렵게 해석합니다.
2016년 12월 현재 최신 버전은 0.12.4입니다.

mikehaertl/phpwkhtmltopdf



htps : // Pac cross st. rg / pac 게이 s / 미케하에 rtl / phpwkhtml 및 pdf

wkhtmltopdf를 PHP로 처리하는 래퍼 클래스입니다.
packagist로 배포됩니다.

도입 방법



wkhtmltopdf는 64bit 버전의 Linux용 바이너리를 사용합니다.
배포 환경은 CentOS 6.5 (64bit 버전)의 가정입니다.
다른 환경의 경우 본가 사이트에서 적절한 버전을 구하십시오.
또한 이미 composer를 도입하고 있는 프로젝트를 전제로 하여 이야기를 진행합니다.

wkhtmltopdf 설치



우선은 wkhtmltopdf의 인스톨로부터 진행해 갑니다.
이번 이용하는 버전은 0.12.4입니다.
$ cd /usr/local/bin
$ wget http://download.gna.org/wkhtmltopdf/0.12/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
$ xz -dv wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
$ tar -xf wkhtmltox-0.12.4_linux-generic-amd64.tar

위의 작업을 마치면 wkhtmltox 디렉터리가 압축 해제됩니다.
실행 파일의 전체 경로는 /usr/local/bin/wkhtmltox/bin/wkhtmltopdf입니다.
버전 점검 명령을 실행하여 wkhtmltopdf를 확인합니다.
$ /usr/local/bin/wkhtmltox/bin/wkhtmltopdf --version
wkhtmltopdf 0.12.4 (with patched qt)

※ 대개 이하의 패키지가 부족하게 화나므로, 추가로 인스톨 해 주세요
$ yum install -y libXrender libXext

일본어 글꼴 설치



wkhtmltopdf에는 일본어 폰트가 들어 있지 않으므로, 일본어를 통과하면 그 부분만이 하얗게 됩니다.
반드시 일본어 폰트를 별도로 설치합시다.

이번은 IPA 폰트의 신세가 되기로 하겠습니다.
ht tp // // 가파퉁 t. 가득. . jp/이파에 x후 t/도 w응아 d. HTML
$ wget http://dl.ipafont.ipa.go.jp/IPAexfont/IPAexfont00301.zip
$ unzip IPAexfont00301.zip
$ mv IPAexfont00301 /usr/share/fonts

mikehaertl/phpwkhtmltopdf 설치



composer로 설치합니다.
배포하려는 프로젝트에서 다음 명령을 실행합니다.
$ composer require mikehaertl/phpwkhtmltopdf

PDF 출력 샘플



mikehaertl\wkhtmlto\Pdf를 인스턴스화하고 addPage() HTML을 던지면 페이지가 추가됩니다.
HTML 파일의 위치를 ​​전체 경로로 전달할 수도 있습니다.
send()를 두드리면 브라우저에 PDF가 표시됩니다.
또한 send('xxx.pdf')와 같이 첫 번째 인수를 지정하면 정의한 파일 이름으로 PDF가 다운로드됩니다.

pdf.php
require './vendor/autoload.php';

$html = <<<EOF
<!DOCTYPE html>
<html>
    <style>
    body {
        padding: 7px;
        background-color: black;
    }
    .red {
        color: red;
        font-size: 50px;
    }
    .opacity {
        opacity: 0.3;
    }
    </style>

    <body>
        <div class="red">
            <p>PDF化してください!</p>
            <p class="opacity">何でもしますから!</p>
        </div>
    </body>
</html>
EOF;

use mikehaertl\wkhtmlto\Pdf;


$pdf = new Pdf([

     // バイナリの位置とエンコード形式
    'binary'   => '/usr/local/bin/wkhtmltox/bin/wkhtmltopdf',
    'encoding' => 'utf-8',

    // 以下の指定があるとPDFをページ端まで利用できる
    'margin-top'    => 0,
    'margin-right'  => 0,
    'margin-bottom' => 0,
    'margin-left'   => 0,
    'no-outline',

]);

// ページを追加
$pdf->addPage($html);

// ブラウザにPDFを表示
$pdf->send();



확장하고 편리하게



바이너리의 위치와 인코딩 형식을 초기 설정.

pdf.php
use mikehaertl\wkhtmlto\Pdf as BasePdf;

class Pdf extends BasePdf
{
    const DEFAULT_OPTIONS = [
        'binary'   => '/usr/local/bin/wkhtmltox/bin/wkhtmltopdf',
        'encoding' => 'utf-8',
    ];

    public function __construct($options = null)
    {
        $this->setOptions(self::DEFAULT_OPTIONS);
        parent::__construct($options);
    }
}

example.php
(new Pdf($html))->send();

사용상의 주의점



htps : // 기주 b. 이 m / wkhtml, pdf / wkhtml 및 pdf / 이스에 s / 1524

wkhtmltopdf는 테이블을 사용하면, 2페이지째 이후에도 자동으로 헤더를 부여해 줍니다만,
그것이 어긋나거나 다음 열과 쓰면서 디자인이 크게 무너집니다.
이 스타일을 부여하면 해결할 수 있습니다.

style.css
tr {
    page-break-inside: avoid;
}

요약



이전에 쓴 이쪽의 기사로부터 1년이 지나, 여러가지 변경이 볼 수 있는 개정판이었습니다.
PHP로 PDF를 만들 때는 wkhtmltopdf + snappy로 싸워라.

v 0.12.3에서 wkhtmltopdf 설치 방법이 변경되었으며 아카이브를 압축 해제하고 배치 할 수 있습니다.
IPA 폰트가 이전의 URL에서는 다운로드 할 수 없게 되어 있거나,
Snappy가 팔로우하지 않았던 HTTP 헤더의 출력까지 랩핑한 phpwkhtmltopdf의 존재를 알거나.
단 1년 만에 여러가지 일어나는 것입니다.

앞으로도 PHP로 PDF를 조작하는 방법은 정기적으로 조사해 가겠습니다.
뭔가 깨달은 점이 있으면 편집 요청도 기다리고 있습니다.

좋은 웹페이지 즐겨찾기