在本文中,我们将讨论如何在 php中生成pdf文件。我们将使用TCPDF 库以编程方式创建 PDF 文档。
如果您在一个允许用户下载或打印订单收据、账单或***等文档的网站上工作,您有几个选择。您可以在浏览器中内联显示文档或提供下载。在下载文档时,PDF 是最好的格式之一,并且在保留文本格式方面表现出色。
因此,如果您想学习如何在您的 PHP 网站上生成 PDF 文件,那么您来对地方了!
如何安装 TCPDF 库
在本节中,我们将了解如何安装 TCPDF 库。
有多种方法可以在您的服务器上安装 TCPDF 库。TCPDF 库在 Packagist 和 GitHub 上可用,因此您可以使用 Composer 或从 GitHub 克隆它。在我们的例子中,我们将使用 Composer 安装它。
继续运行以下命令以使用 Composer 安装 TCPDF 库。
$composer require tecnickcom/tcpdf Using version ^6.3 for tecnickcom/tcpdf ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing tecnickcom/tcpdf (6.3.5): Downloading (100%) Writing lock file Generating autoload files
成功安装后,您需要在 PHP 脚本中包含autoload.php文件,如以下代码段所示。
<?php require "./vendor/autoload.php"; ... ?>
这样,您就可以使用 TCPDF 库提供的所有实用方法了。
如何使用 TCPDF 库
在本节中,我们将构建一个真实示例,演示如何生成 PDF ***。TCPDF 库提供了许多现成的模板,您可以将它们用作生成 PDF 文档的参考。但是,我们将从头开始生成***。
正如我在上一节中已经提到的,TCPDF 库提供了许多现成的模板,允许您生成带有页眉和页脚的通用 PDF 文件。如果您对默认格式和设置感到满意,这将非常有用。但是,如果您想自定义页眉和页脚以及内容,则必须扩展TCPDF类并覆盖相应的方法。
在我们的示例中,我们将创建两个文件:customPdfGenerator.php和example.php。在customPdfGenerator.php文件中,我们将创建一个CustomPdfGenerator类,它将扩展核心TCPDF类并覆盖几个方法。在example.php文件中,我们将看到如何使用CustomPdfGenerator该类。
CustomPdfGenerator班级_
继续并使用以下内容创建customPdfGenerator.php文件。
<?php class CustomPdfGenerator extends TCPDF { public function Header() { $image_file = '/web/logo.png'; $this->Image($image_file, 10, 3, 25, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false); $this->Setfont('helvetica', 'B', 20); $this->Cell(0, 15, '', 0, false, 'C', 0, '', 0, false, 'M', 'M'); $this->Ln(); $this->Cell(0, 15, 'Katie A Falk', 0, false, 'R', 0, '', 0, false, 'M', 'M'); } public function Footer() { $this->SetY(-15); $this->SetFont('helvetica', 'I', 15); $this->Cell(0, 10, 'Thank you for your business!', 0, false, 'C', 0, '', 0, false, 'T', 'M'); } public function printTable($header, $data) { $this->SetFillColor(0, 0, 0); $this->SetTextColor(255); $this->SetDrawColor(128, 0, 0); $this->SetLineWidth(0.3); $this->SetFont('', 'B', 12); $w = array(110, 17, 25, 30); $num_headers = count($header); for($i = 0; $i < $num_headers; ++$i) { $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1); } $this->Ln(); // Color and font restoration $this->SetFillColor(224, 235, 255); $this->SetTextColor(0); $this->SetFont(''); // table data $fill = 0; $total = 0; foreach($data as $row) { $this->Cell($w[0], 6, $row[0], 'LR', 0, 'L', $fill); $this->Cell($w[1], 6, $row[1], 'LR', 0, 'R', $fill); $this->Cell($w[2], 6, number_format($row[2]), 'LR', 0, 'R', $fill); $this->Cell($w[3], 6, number_format($row[3]), 'LR', 0, 'R', $fill); $this->Ln(); $fill=!$fill; $total+=$row[3]; } $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill); $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill); $this->Cell($w[2], 6, '', 'LR', 0, 'L', $fill); $this->Cell($w[3], 6, '', 'LR', 0, 'R', $fill); $this->Ln(); $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill); $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill); $this->Cell($w[2], 6, 'TOTAL:', 'LR', 0, 'L', $fill); $this->Cell($w[3], 6, $total, 'LR', 0, 'R', $fill); $this->Ln(); $this->Cell(array_sum($w), 0, '', 'T'); } }
需要注意的重要一点是CustomPdfGenerator该类扩展了TCPDF该类,因此我们可以使用TCPDF该类提供的所有实用方法来格式化和生成 PDF 文档。
创建我们自己的类而不是直接使用TCPDF该类的唯一目的是我们不想使用内置的页眉和页脚组件。因此,我们重写了类中的headerandfooter方法。
Header方法_
在标题中,我们希望显示公司徽标以及所有者的姓名。让我们通过 header 方法来了解它是如何工作的。
public function Header() { $image_file = '/web/logo.png'; $this->Image($image_file, 10, 3, 25, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false); $this->SetFont('helvetica', 'B', 20); $this->Cell(0, 15, '', 0, false, 'C', 0, '', 0, false, 'M', 'M'); $this->Ln(); $this->Cell(0, 15, 'Katie A Falk', 0, false, 'R', 0, '', 0, false, 'M', 'M'); }
首先,我们使用Image 方法在左侧绘制了公司徽标。您需要将徽标图像的绝对路径传递给该Image方法,这一点很重要。接下来,我们使用SetFont 方法来设置文本的 font-family 和font-size,它们将被添加到标题中。最后,我们使用该Cell方法在右侧打印所有者名称。
您会注意到,您可以在这些方法中传递很多参数,我鼓励您详细研究它们,因为在本文中不可能讨论每个参数。
使用上述设置,标题将如下所示
页脚方法
在页脚中,我们想要显示一些静态文本,因此该Footer方法非常简单,如下面的代码片段所示。
public function Footer() { $this->SetY(-15); $this->SetFont('helvetica', 'I', 15); $this->Cell(0, 10, 'Thank you for your business!', 0, false, 'C', 0, '', 0, false, 'T', 'M'); }
页脚部分如下所示:
最后,还有printTable方法,我们稍后再讨论。该printTable方法与类无关TCPDF。相反,它是我们的自定义实用程序方法,我们将使用它来绘制表格以显示项目信息。
这就是CustomPdfGenerator课堂。在下一节中,我们将了解如何使用它以及其他一些方法来生成完整的 PDF ***!
example.php 文件
在上一节中,我们创建了CustomPdfGenerator包装类,我们可以使用它来生成带有自定义页眉和页脚的 PDF 文件。在本节中,我们将演示如何使用它。
继续并使用以下内容创建example.php文件。
<?php require "./vendor/autoload.php"; require "./customPdfGenerator.php"; $pdf = new CustomPdfGenerator(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); $pdf->setFontSubsetting(true); $pdf->SetFont('dejavusans', '', 12, '', true); // start a new page $pdf->AddPage(); // date and invoice no $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0); $pdf->writehtml("<b>DATE:</b> 01/01/2021"); $pdf->writeHTML("<b>INVOICE#</b>12"); $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0); // address $pdf->writeHTML("84 Norton Street,"); $pdf->writeHTML("NORMANHURST,"); $pdf->writeHTML("New South Wales, 2076"); $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0); // bill to $pdf->writeHTML("<b>BILL TO:</b>", true, false, false, false, 'R'); $pdf->writeHTML("22 South Molle Boulevard,", true, false, false, false, 'R'); $pdf->writeHTML("KOOROOMOOL,", true, false, false, false, 'R'); $pdf->writeHTML("Queensland, 4854", true, false, false, false, 'R'); $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0); // invoice table starts here $header = array('DESCRIPTION', 'UNITS', 'RATE $', 'AMOUNT'); $data = array( array('Item #1','1','100','100'), array('Item #2','2','200','400') ); $pdf->printTable($header, $data); $pdf->Ln(); // comments $pdf->SetFont('', '', 12); $pdf->writeHTML("<b>OTHER COMMENTS:</b>"); $pdf->writeHTML("Method of payment: <i>PAYPAL</i>"); $pdf->writeHTML("PayPal ID: <i>katie@paypal.com"); $pdf->Write(0, "\n\n\n", '', 0, 'C', true, 0, false, false, 0); $pdf->writeHTML("If you have any questions about this invoice, please contact:", true, false, false, false, 'C'); $pdf->writeHTML("Katie A Falk, (07) 4050 2235, katie@sks.com", true, false, false, false, 'C'); // save pdf file $pdf->Output(__DIR__ . '/invoice#12.pdf', 'F');
让我们浏览一下上述文件中的重要片段。
首先,我们已经包含了autoload.php文件以确保TCPDF该类是自动加载的。接下来,我们包含了customPdfGenerator.php文件来加载我们的自定义类。
接下来,我们已经实例化了CustomPdfGenerator该类以及默认设置。在我们真正开始写入 PDF 文件之前,我们还调用了几个方法来进行默认设置。
$pdf = new CustomPdfGenerator(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); $pdf->setFontSubsetting(true); $pdf->SetFont('dejavusans', '', 12, '', true);
我们在上面的代码片段中使用的const ant 已经在tcpdf_autoconfig.php文件中定义了。要覆盖这些常量之一,您只需在脚本中定义它,TCPDF 库将使用您的值。例如,PDF_PAGE_ORIENTATION常量的默认值是P(portrait),如果你想把它改成L(landscape),你只需要define ('PDF_PAGE_ORIENTATION', 'L');在你的脚本中包含。
接下来,有一个重要的片段调用AddPage方法,它实际上在 PDF 文档中添加了一个新页面。
// start a new page $pdf->AddPage();
所以我们现在已经添加了一个页面,我们可以开始在这个页面上写了。
接下来,我们使用Write和writeHTML方法在左侧打印日期和***编号。
// date and invoice no $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0); $pdf->writeHTML("<b>DATE:</b> 01/01/2021"); $pdf->writeHTML("<b>INVOICE#</b>12"); $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
该Write方法从当前位置打印文本,您可以使用它打印纯文本。另一方面,该writeHTML方法允许您在文本中保留 HTML 格式。尽管该writeHTML方法提供有限的 HTML 格式支持,但它涵盖了日常开发中经常使用的所有 HTML 标记。
同样,我们在该writeHTML方法的帮助下打印了地址和收款人地址。
// address $pdf->writeHTML("84 Norton Street,"); $pdf->writeHTML("NORMANHURST,"); $pdf->writeHTML("New South Wales, 2076"); $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0); // bill to $pdf->writeHTML("<b>BILL TO:</b>", true, false, false, false, 'R'); $pdf->writeHTML("22 South Molle Boulevard,", true, false, false, false, 'R'); $pdf->writeHTML("KOOROOMOOL,", true, false, false, false, 'R'); $pdf->writeHTML("Queensland, 4854", true, false, false, false, 'R'); $pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
默认情况下,该writeHTML方法在左侧打印文本。如果要打印右对齐文本,可以作为方法R的最后一个参数传递writeHTML,如上面的代码片段所示。在我们的例子中,我们希望显示正确对齐的收单地址。
让我们快速看看到目前为止我们已经构建了什么。
接下来,我们有一个片段可以完成打印项目信息表的繁重工作。
// invoice table starts here $header = array('DESCRIPTION', 'UNITS', 'RATE $', 'AMOUNT'); $data = array( array('Item #1','1','100','100'), array('Item #2','2','200','400') ); $pdf->printTable($header, $data); $pdf->Ln();
还记得我们在customPdfGenerator.php类printTable中定义的方法吗?现在是时候详细探索它了。让我们拉入方法的代码。printTable
public function printTable($header, $data) { $this->SetFillColor(0, 0, 0); $this->SetTextColor(255); $this->SetDrawColor(128, 0, 0); $this->SetLineWidth(0.3); $this->SetFont('', 'B', 12); $w = array(110, 17, 25, 30); $num_headers = count($header); for($i = 0; $i < $num_headers; ++$i) { $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1); } $this->Ln(); // Color and font restoration $this->SetFillColor(224, 235, 255); $this->SetTextColor(0); $this->SetFont(''); // table data $fill = 0; $total = 0; foreach($data as $row) { $this->Cell($w[0], 6, $row[0], 'LR', 0, 'L', $fill); $this->Cell($w[1], 6, $row[1], 'LR', 0, 'R', $fill); $this->Cell($w[2], 6, number_format($row[2]), 'LR', 0, 'R', $fill); $this->Cell($w[3], 6, number_format($row[3]), 'LR', 0, 'R', $fill); $this->Ln(); $fill=!$fill; $total+=$row[3]; } $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill); $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill); $this->Cell($w[2], 6, '', 'LR', 0, 'L', $fill); $this->Cell($w[3], 6, '', 'LR', 0, 'R', $fill); $this->Ln(); $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill); $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill); $this->Cell($w[2], 6, 'TOTAL:', 'LR', 0, 'L', $fill); $this->Cell($w[3], 6, $total, 'LR', 0, 'R', $fill); $this->Ln(); $this->Cell(array_sum($w), 0, '', 'T'); }
首先,在实际开始打印***表的标题行之前,我们调用了几个方法来设置字体大小、填充颜色、线宽和文本颜色。接下来,我们在该方法$header的帮助下遍历数组并打印表头标题。Cell
该Cell方法允许您打印带有可选边框、背景颜色和字符串的单元格(矩形区域)。您还可以指定打印在单元格中的文本的对齐方式。因此,该方法是构建表的完美候选者。Cell
打印表头标题后,我们循环遍历$data数组并打印它以完成整个表。最后,我们Cell多次调用该方法来打印总金额。
表格的快速预览应如下所示:
现在,让我们回到example.php文件来查看最后几行代码。
在***的末尾,我们将打印一些评论和联系信息,如以下代码段所示。
// comments $pdf->SetFont('', '', 12); $pdf->writeHTML("<b>OTHER COMMENTS:</b>"); $pdf->writeHTML("Method of payment: <i>PAYPAL</i>"); $pdf->writeHTML("PayPal ID: <i>katie@paypal.com"); $pdf->Write(0, "\n\n\n", '', 0, 'C', true, 0, false, false, 0); $pdf->writeHTML("If you have any questions about this invoice, please contact:", true, false, false, false, 'C'); $pdf->writeHTML("Katie A Falk, (07) 4050 2235, katie@sks.com", true, false, false, false, 'C');
最后,我们使用了将 PDF 文件保存到磁盘的Output方法。如果您不想将 PDF 文件保存在磁盘上,而只想将其发送到浏览器,则需要I在方法的第二个参数中使用Output。
继续运行该example.php文件,它应该会生成 PDF 文件,如下面的屏幕截图所示。
结论
这就是您可以使用 TCPDF 库在 PHP 中创建 PDF 文档的方法。我们创建了一个真实的示例来演示TCPDF 库提供的一些不同的api 。
TCPDF 官方文档 提供了很多现成的模板,您可以探索以了解内置 API,我鼓励您探索它!
- CustomPdfGenerator班级_
- Header方法_
- 页脚方法
- example.php 文件