[PHP] PDF를 TCPDF+FPDI로 출력해 보는 이야기
입문
제목과 같이
TCPDF 및 FPDI 라이브러리를 사용하여 PDF를 내보냅니다.
이번에는 명령행에서 실행하려고 한다.
정편
환경 구축
PHP, Composer에서 사용할 수 있는 환경을 원하는 대로 준비하십시오.
Docker
이번에 사용한 Docker 환경은 다음과 같습니다.
./docker-compose.ymlversion: '3'
services:
php:
build: ./php
volumes:
- ./work:/home/work
./php/dockerfileFROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/
# Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');" \
&& mv composer.phar /usr/local/bin/composer
./php/php.inidate.timezone = "Asia/Tokyo"
Composer
시작 완료 후 php 용기 진입
Composer에 라이브러리를 설치합니다.
또 라이브러리 외에 오토로드의 기재도 추가됐다.
/home/work/src/composer.json{
"require": {
"setasign/fpdi": "^2.3",
"tecnickcom/tcpdf": "^6.3"
},
"autoload": {
"psr-4": {
"Classes\\" : "classes/"
}
}
}
설치가 끝나면 완성됩니다.# cd /home/work/src
# composer install
실시
파일 구성
# cd /home/work/
# ls /home/work/output/pdf/fileYYYYmmdd-HHiiss #PDF出力ファイル
# ls /home/work/src/resources/font/ipam.ttf #フォントの格納先
# ls /home/work/src/resources/pdf/templete.pdf #PDFテンプレートの格納先
# ls /home/work/bin/make-pdf.php #コマンドラインで実行するソース
# ls /home/work/src/bootstrap.php # 起動用ファイル(割愛)
# ls /home/work/src/classes/MyTcpdf.php # TCPDF利用クラス
# ls /home/work/src/classes/common/DynamicProperty.php # 動的クラス(割愛)
# ls /home/work/src/classes/MyTcpdf/FontColor.php # フォントカラークラス(割愛)
거푸집
매우 간단한 PDF 템플릿 파일입니다.
출처
/home/work/bin/make-pdf.php<?php
require_once __DIR__ . '/../src/bootstrap.php';
use Classes\MyTcpdf;
use Classes\MyTcpdf\FontColor;
// テンプレートを使用せずに出力
$myTcpdf = new MyTcpdf();
$myTcpdf->addPage();
$myTcpdf->setText('テンプレートを使用せずに出力', 10, 20, new FontColor(0, 255, 0));
$myTcpdf->outputPdfFile();
// テンプレートを使用して出力
$myTcpdfTmp = new MyTcpdf();
$myTcpdfTmp->addPageWithTemplete(1);
$myTcpdfTmp->setText('テンプレートを使用して出力', 10, 20, new FontColor(255, 0, 0));
$myTcpdfTmp->outputPdfFile();
/home/work/src/classes/MyTcpdf.php<?php
namespace Classes;
use TCPDF_FONTS;
use setasign\Fpdi\Tcpdf\Fpdi;
use Classes\MyTcpdf\FontColor;
class MyTcpdf
{
// 出力ファイル
const OUTPUT_FORMAT_CHAR = 'F';
const OUTPUT_FILE_DIR = __DIR__.'/../../output/pdf/';
const OUTPUT_FILE_NAME = 'file';
// PDF
const PDF_ORIENTATION = 'P';
const PDF_UNIT = 'mm';
const PDF_SIZE = 'A4';
const PDF_TEMPLETE = __DIR__.'/../resources/pdf/templete.pdf';
// フォントファイル
const FONT_FILE_NAME = __DIR__.'/../resources/font/ipam.ttf';
/**
* コンストラクタ
*/
public function __construct()
{
$this->fpdi = new Fpdi(self::PDF_ORIENTATION, self::PDF_UNIT, self::PDF_SIZE);
$this->fpdi->SetMargins(0, 0, 0);
$this->fpdi->SetFont($this->getFont(), '', 32);
}
/**
* 出力文字を設定する
* @param _text 文字列
* @param _x X座標
* @param _y Y座標
* @param _h 高さ
*/
public function setText(string $_text, int $_x, int $_y, FontColor $_fontColor, int $_h = 0)
{
$this->fpdi->SetTextColor($_fontColor->R, $_fontColor->G, $_fontColor->B);
$this->fpdi->SetXY($_x, $_y);
$this->fpdi->Write($_h, $_text);
}
/**
* 追加するフォントを取得する
*/
private function getFont()
{
return TCPDF_FONTS::addTTFfont(self::FONT_FILE_NAME);
}
/**
* 出力するファイル名を取得する
* @return string ファイル名
*/
private function getOutputFilename()
{
return self::OUTPUT_FILE_DIR . self::OUTPUT_FILE_NAME . date("Ymd-His"). '.pdf';
}
/**
* ページを追加する
*/
public function addPage()
{
$this->fpdi->AddPage();
}
/**
* テンプレートベースのページを追加する
*/
public function addPageWithTemplete($_pageNum)
{
$this->fpdi->SetSourceFile(self::PDF_TEMPLETE);
$page = $this->fpdi->importPage($_pageNum);
$this->fpdi->AddPage();
$this->fpdi->useTemplate($page, null, null, null, null, true);
}
/**
* PDFファイル出力
*/
public function outputPdfFile()
{
$this->fpdi->Output(
$this->getOutputFilename(),
self::OUTPUT_FORMAT_CHAR
);
}
}
명령을 집행하다
php /home/work/bin/make-pdf.php
실행 결과
다음과 같이 파일을 내보냅니다.
템플릿 없음
템플릿 있음
끝날 때
PDF 템플릿에서 텍스트를 내보낼 수 있으므로 형식을 변경하지 않고 필요한 정보만 내보낼 수 있습니다.
업무표, 계산서, 영수증 등 특정 부분만 변동된 서류에서 활용할 수 있다.
Reference
이 문제에 관하여([PHP] PDF를 TCPDF+FPDI로 출력해 보는 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/suupoo/items/0eb0f42c70bf535a66c3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
환경 구축
PHP, Composer에서 사용할 수 있는 환경을 원하는 대로 준비하십시오.
Docker
이번에 사용한 Docker 환경은 다음과 같습니다.
./docker-compose.yml
version: '3'
services:
php:
build: ./php
volumes:
- ./work:/home/work
./php/dockerfileFROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/
# Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');" \
&& mv composer.phar /usr/local/bin/composer
./php/php.inidate.timezone = "Asia/Tokyo"
Composer
시작 완료 후 php 용기 진입
Composer에 라이브러리를 설치합니다.
또 라이브러리 외에 오토로드의 기재도 추가됐다.
/home/work/src/composer.json
{
"require": {
"setasign/fpdi": "^2.3",
"tecnickcom/tcpdf": "^6.3"
},
"autoload": {
"psr-4": {
"Classes\\" : "classes/"
}
}
}
설치가 끝나면 완성됩니다.# cd /home/work/src
# composer install
실시
파일 구성
# cd /home/work/
# ls /home/work/output/pdf/fileYYYYmmdd-HHiiss #PDF出力ファイル
# ls /home/work/src/resources/font/ipam.ttf #フォントの格納先
# ls /home/work/src/resources/pdf/templete.pdf #PDFテンプレートの格納先
# ls /home/work/bin/make-pdf.php #コマンドラインで実行するソース
# ls /home/work/src/bootstrap.php # 起動用ファイル(割愛)
# ls /home/work/src/classes/MyTcpdf.php # TCPDF利用クラス
# ls /home/work/src/classes/common/DynamicProperty.php # 動的クラス(割愛)
# ls /home/work/src/classes/MyTcpdf/FontColor.php # フォントカラークラス(割愛)
거푸집
매우 간단한 PDF 템플릿 파일입니다.
출처
/home/work/bin/make-pdf.php
<?php
require_once __DIR__ . '/../src/bootstrap.php';
use Classes\MyTcpdf;
use Classes\MyTcpdf\FontColor;
// テンプレートを使用せずに出力
$myTcpdf = new MyTcpdf();
$myTcpdf->addPage();
$myTcpdf->setText('テンプレートを使用せずに出力', 10, 20, new FontColor(0, 255, 0));
$myTcpdf->outputPdfFile();
// テンプレートを使用して出力
$myTcpdfTmp = new MyTcpdf();
$myTcpdfTmp->addPageWithTemplete(1);
$myTcpdfTmp->setText('テンプレートを使用して出力', 10, 20, new FontColor(255, 0, 0));
$myTcpdfTmp->outputPdfFile();
/home/work/src/classes/MyTcpdf.php<?php
namespace Classes;
use TCPDF_FONTS;
use setasign\Fpdi\Tcpdf\Fpdi;
use Classes\MyTcpdf\FontColor;
class MyTcpdf
{
// 出力ファイル
const OUTPUT_FORMAT_CHAR = 'F';
const OUTPUT_FILE_DIR = __DIR__.'/../../output/pdf/';
const OUTPUT_FILE_NAME = 'file';
// PDF
const PDF_ORIENTATION = 'P';
const PDF_UNIT = 'mm';
const PDF_SIZE = 'A4';
const PDF_TEMPLETE = __DIR__.'/../resources/pdf/templete.pdf';
// フォントファイル
const FONT_FILE_NAME = __DIR__.'/../resources/font/ipam.ttf';
/**
* コンストラクタ
*/
public function __construct()
{
$this->fpdi = new Fpdi(self::PDF_ORIENTATION, self::PDF_UNIT, self::PDF_SIZE);
$this->fpdi->SetMargins(0, 0, 0);
$this->fpdi->SetFont($this->getFont(), '', 32);
}
/**
* 出力文字を設定する
* @param _text 文字列
* @param _x X座標
* @param _y Y座標
* @param _h 高さ
*/
public function setText(string $_text, int $_x, int $_y, FontColor $_fontColor, int $_h = 0)
{
$this->fpdi->SetTextColor($_fontColor->R, $_fontColor->G, $_fontColor->B);
$this->fpdi->SetXY($_x, $_y);
$this->fpdi->Write($_h, $_text);
}
/**
* 追加するフォントを取得する
*/
private function getFont()
{
return TCPDF_FONTS::addTTFfont(self::FONT_FILE_NAME);
}
/**
* 出力するファイル名を取得する
* @return string ファイル名
*/
private function getOutputFilename()
{
return self::OUTPUT_FILE_DIR . self::OUTPUT_FILE_NAME . date("Ymd-His"). '.pdf';
}
/**
* ページを追加する
*/
public function addPage()
{
$this->fpdi->AddPage();
}
/**
* テンプレートベースのページを追加する
*/
public function addPageWithTemplete($_pageNum)
{
$this->fpdi->SetSourceFile(self::PDF_TEMPLETE);
$page = $this->fpdi->importPage($_pageNum);
$this->fpdi->AddPage();
$this->fpdi->useTemplate($page, null, null, null, null, true);
}
/**
* PDFファイル出力
*/
public function outputPdfFile()
{
$this->fpdi->Output(
$this->getOutputFilename(),
self::OUTPUT_FORMAT_CHAR
);
}
}
명령을 집행하다
php /home/work/bin/make-pdf.php
실행 결과
다음과 같이 파일을 내보냅니다.
템플릿 없음
템플릿 있음
끝날 때
PDF 템플릿에서 텍스트를 내보낼 수 있으므로 형식을 변경하지 않고 필요한 정보만 내보낼 수 있습니다.
업무표, 계산서, 영수증 등 특정 부분만 변동된 서류에서 활용할 수 있다.
Reference
이 문제에 관하여([PHP] PDF를 TCPDF+FPDI로 출력해 보는 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/suupoo/items/0eb0f42c70bf535a66c3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)