如何使用PHP输出PDF表单(TCPDF FPDI)


使用PHP输出PDF时,有多种解决方案,例如PDFlib,FPDF和haru,但是如果要输出具有复杂布局设计的表单(如发票或交货单),则可以将现有的PDF用作您可以通过将源代码用作模板并在其中仅排列必要的字符来简化源代码。

将TCPDF和FPDI的组合作为一个库引入,该库可以读取现有的PDF作为模板,并且可以免费使用。

创建模板PDF

读取PDF的FPDI,如果不单独安装付费的解析器,则无法解析PDF 1.5或更高版本的文件。模板PDF文件必须以PDF 1.4或更低的压缩格式创建。

另外,从PHP排列字符时,由于使用了坐标(从左侧10毫米,顶部20毫米等的位置),因此使用Illustrator之类的软件更为有效。

ss1.jpg

例如,在上面的示例中,使用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_ *。

  • 我解压缩了下载的文件,并将其放在文件夹名为tcpdf的PHP的include_path上。与Symfony2一起使用时,请创建一个lib文件夹等,并将其添加到autoload.php中,如下所示。
  • 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;

    字体

  • 我想使用日语字体,所以这次我将使用MigMix字体。下载MigMix 2P后,将其解压缩并将migmix-2p-bold.ttfmigmix-2p-regular.ttf放在tcpdf/fonts/文件夹中。
  • tcpdf/fonts/文件夹要求PHP执行用户具有写权限,因此请更改该权限。

  • FPDI

  • 下载FPDI。

  • 解压缩下载的文件并将其放在放置TCPDF的tcpdf文件夹中。此时,tcpdf文件夹应如下所示:
  • 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。

    ss2.jpg

    当然,如果按原样继续$receipt->AddPage();,则还可以将收据输出为PDF。

    我提到了以下页面:
    有关如何使用TCPDF和FPDI

    的说明