在本文中,我们将讨论如何使用 PHP 生成 PDF 文件。我们将使用 TCPDF 库以编程方式创建 PDF 文档。
如果您正在开发一个允许用户下载或打印订单收据、帐单或发票等文档的网站,您有多种选择。您可以在浏览器中内联显示文档或提供下载。在下载文档时,PDF 是最好的格式之一,并且在保留文本格式方面非常出色。
因此,如果您想学习如何在 PHP 网站上生成 PDF 文件,那么您来对地方了!
在本节中,我们将了解如何安装 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 库提供的所有实用方法了。
在本节中,我们将构建一个实际示例,演示如何生成 PDF 发票。 TCPDF 库提供了许多现成的模板,您可以将其用作生成 PDF 文档的参考。但是,我们将从头开始生成发票。
正如我在上一节中已经提到的,TCPDF 库提供了许多现成的模板,可让您生成带有页眉和页脚的通用 PDF 文件。如果您对默认格式和设置感到满意,这将非常有用。但如果您想自定义页眉和页脚以及内容,则必须扩展 TCPDF
类并重写相应的方法。
在我们的示例中,我们将创建两个文件:customPdfGenerator.php 和 example.php。在 customPdfGenerator.php 文件中,我们将创建 CustomPdfGenerator
类,它将扩展核心 TCPDF
类并重写几个方法。在 example.php 文件中,我们将了解如何使用 CustomPdfGenerator
类,它将扩展核心
CustomPdfGenerator
文件中,我们将了解如何使用 类
继续创建包含以下内容的 CustomPdfGenerator
类扩展了 TCPDF
类,因此我们可以使用 TCPDF
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'); } }
TCPDF
类的唯一目的是我们不想使用内置的页眉和页脚组件。因此,我们重写了类中的 header
和 footer
需要注意的是, 类扩展了 标头
类提供的所有实用方法来格式化和生成 PDF 文档。创建我们自己的类而不是直接使用
类的唯一目的是我们不想使用内置的页眉和页脚组件。因此,我们重写了类中的header
和 footer
方法。
Image
方法。接下来,我们使用 SetFont 方法设置文本的字体系列和字体大小,这些文本将添加到标题中。最后,我们使用 Cell
在标题中,我们希望显示公司徽标以及所有者的姓名。让我们通过 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'); }
方法在右侧打印所有者姓名。
您会注意到,您可以在这些方法中传递很多参数,我鼓励您详细探索它们,因为不可能在本文中讨论每个参数。
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
printTable
方法,我们稍后再讨论这个方法。 printTable
方法与
CustomPdfGenerator
这就是
example.php 文件
在上一节中,我们创建了包装类,我们可以使用它来生成具有自定义页眉和页脚的 PDF 文件。在本节中,我们将演示如何使用它。
继续创建包含以下内容的 example.php 文件。TCPDF
<?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');
接下来,我们实例化了 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);
我们在上面代码片段中使用的常量已在 tcpdf_autoconfig.php 文件中定义。要覆盖这些常量之一,您只需在脚本中定义它,TCPDF 库将使用您的值。例如,PDF_PAGE_ORIENTATION
常量的默认值为 P
(纵向),如果要将其更改为 L
(横向),则只需包含 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'); }
首先,在实际开始打印发票表的标题行之前,我们调用了几个方法来设置字体大小、填充颜色、线宽和文本颜色。接下来,我们在 Cell
方法的帮助下循环遍历 $header
数组并打印表头标题。
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');
最后,我们使用 Output
方法将 PDF 文件保存到磁盘。如果您不想将 PDF 文件保存在磁盘上,而只想将其发送到浏览器,则需要在 Output
方法的第二个参数中使用 I
。
继续运行 example.php
文件,它应该生成如下屏幕截图所示的 PDF 文件。
这就是如何使用 TCPDF 库在 PHP 中创建 PDF 文档。我们创建了一个真实示例来演示 TCPDF 库提供的一些不同的 API。
TCPDF 官方文档提供了许多现成的模板,您可以探索它们以了解内置 API,我鼓励您探索它!
如果您想了解有关在网站中包含 PDF 的更多信息,请查看以下链接:
以上是PHP中生成PDF文件的方法的详细内容。更多信息请关注PHP中文网其他相关文章!