使用PHP输出PDF时,有多种解决方案,例如PDFlib,FPDF和haru,但是如果要输出具有复杂布局设计的表单(如发票或交货单),则可以将现有的PDF用作您可以通过将源代码用作模板并在其中仅排列必要的字符来简化源代码。
将TCPDF和FPDI的组合作为一个库引入,该库可以读取现有的PDF作为模板,并且可以免费使用。
创建模板PDF
读取PDF的FPDI,如果不单独安装付费的解析器,则无法解析PDF 1.5或更高版本的文件。模板PDF文件必须以PDF 1.4或更低的压缩格式创建。
另外,从PHP排列字符时,由于使用了坐标(从左侧10毫米,顶部20毫米等的位置),因此使用Illustrator之类的软件更为有效。
例如,在上面的示例中,使用Illustrator创建收据模板,并在其上的X:42 mm / Y:108 mm的位置上放置一个宽度为56 mm,高度为10 mm的灰色框。文件。我将在此处使用PHP插入地址。
从Illustrator创建PDF 1.4兼容文件
对于Illustrator CC,在出现的对话框中的"文件类型"中选择" Adob??e PDF",然后在"兼容格式"中选择" Acrobat 5(PDF 1.4)"。
下载资料库
TCPDF
下载TCPDF。如果不需要任何文档,则可以选择tcpdf_min_ *。
autoload.php
1 2 3 4 5 6 7 8 | $loader = require __DIR__.'/../vendor/autoload.php'; AnnotationRegistry::registerLoader(array($loader, 'loadClass')); // include_pathを追加する set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/../lib'); return $loader; |
字体
FPDI
下载FPDI。
1 2 3 4 5 6 7 8 9 | lib/ tcpdf/ fonts/ migmix-2p-bold.ttf migmix-2p-regular.ttf fpdi.php …(ほか、FPDIのファイル群) tcpdf.php …(ほか、TCPDFのファイル群) |
使用库输出PDF
至此准备工作结束。
之后,从PHP读取PDF模板,添加字符串并输出。
以下是Symfony2的控制器,但是我当然认为其他框架也可以以相同的方式输出PDF。
PdfController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | <?php namespace Awesome\DemoBundle\Controller; // include_pathからTCPDFとFPDIを読み込む require_once('tcpdf/tcpdf.php'); require_once('tcpdf/fpdi.php'); use Doctrine\ORM\EntityManager; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class DeliveriesPdfController extends Controller { public function listAction(Request $request) { $receipt = new \FPDI(); // PDFの余白(上左右)を設定 $receipt->SetMargins(0, 0, 0); // ヘッダーの出力を無効化 $receipt->setPrintHeader(false); // フッターの出力を無効化 $receipt->setPrintFooter(false); // フォントを登録 $fontPathRegular = $this->getLibPath() . '/tcpdf/fonts/migmix-2p-regular.ttf'; $regularFont = $receipt->addTTFfont($fontPathRegular, '', '', 32); $fontPathBold = $this->getLibPath() . '/tcpdf/fonts/migmix-2p-bold.ttf'; $boldFont = $receipt->addTTFfont($fontPathBold, '', '', 32); // ページを追加 $receipt->AddPage(); // テンプレートを読み込み $receipt->setSourceFile($this->getLibPath() . '/tcpdf/tpl/receipt.pdf'); // 読み込んだPDFの1ページ目のインデックスを取得 $tplIdx = $receipt->importPage(1); // 読み込んだPDFの1ページ目をテンプレートとして使用 $receipt->useTemplate($tplIdx, null, null, null, null, true); // 書き込む文字列のフォントを指定 $receipt->SetFont($regularFont, '', 11); // 書き込む文字列の文字色を指定 $receipt->SetTextColor(255, 0, 0); // X : 42mm / Y : 108mm の位置に $receipt->SetXY(42, 108); // 文字列を書き込む $receipt->Write(0, '山田 太郎'); $response = new Response( // Output関数の第一引数にはファイル名、第二引数には出力タイプを指定する // 今回は文字列で返してほしいので、ファイル名はnull、出力タイプは S = String を選択する $receipt->Output(null, 'S'), 200, array('content-type' => 'application/pdf') ); // レスポンスヘッダーにContent-Dispositionをセットし、ファイル名をreceipt.pdfに指定 $response->headers->set('Content-Disposition', 'attachment; filename="receipt.pdf"'); return $response; } /** * @return string */ private function getLibPath() { return realpath(sprintf('%s/../lib', $this->get('kernel')->getRootDir())); } } |
您现在有了一个添加了字符串的PDF。
当然,如果按原样继续
我提到了以下页面:
有关如何使用TCPDF和FPDI
的说明