• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何在PHP中生成PDF文件

在本文中,我们将讨论如何在 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方法在右侧打印所有者名称。

您会注意到,您可以在这些方法中传递很多参数,我鼓励您详细研究它们,因为在本文中不可能讨论每个参数。

使用上述设置,标题将如下所示

如何在PHP中生成PDF文件  第1张

页脚方法

在页脚中,我们想要显示一些静态文本,因此该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');
}

页脚部分如下所示:

如何在PHP中生成PDF文件  第2张最后,还有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,如上面的代码片段所示。在我们的例子中,我们希望显示正确对齐的收单地址。

让我们快速看看到目前为止我们已经构建了什么。

如何在PHP中生成PDF文件  第3张

接下来,我们有一个片段可以完成打印项目信息表的繁重工作。

// 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多次调用该方法来打印总金额。

表格的快速预览应如下所示:

如何在PHP中生成PDF文件  第4张现在,让我们回到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 文件,如下面的屏幕截图所示。

如何在PHP中生成PDF文件  第5张

结论

这就是您可以使用 TCPDF 库在 PHP 中创建 PDF 文档的方法。我们创建了一个真实的示例来演示TCPDF 库提供的一些不同的api

TCPDF 官方文档 提供了很多现成的模板,您可以探索以了解内置 API,我鼓励您探索它!


文章目录
  • 如何安装 TCPDF 库
  • 如何使用 TCPDF 库
    • CustomPdfGenerator班级_
      • Header方法_
      • 页脚方法
    • example.php 文件
  • 结论