Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk menjana fail PDF dalam PHP
Dalam artikel ini, kita akan membincangkan cara menjana fail PDF menggunakan PHP. Kami akan membuat dokumen PDF secara pemrograman menggunakan perpustakaan TCPDF.
Jika anda sedang membangunkan tapak web yang membenarkan pengguna memuat turun atau mencetak dokumen seperti resit pesanan, bil atau invois, anda mempunyai beberapa pilihan. Anda boleh memaparkan dokumen sebaris dalam penyemak imbas atau menyediakannya untuk dimuat turun. PDF ialah salah satu format terbaik ketika memuat turun dokumen dan sangat baik dalam mengekalkan pemformatan teks.
Jadi, jika anda ingin belajar cara menjana fail PDF di tapak web PHP anda, anda telah datang ke tempat yang betul!
Dalam bahagian ini, kita akan belajar cara memasang perpustakaan TCPDF.
Terdapat pelbagai cara untuk memasang perpustakaan TCPDF pada pelayan. Pustaka TCPDF tersedia pada Packagist dan GitHub, jadi anda boleh menggunakan Komposer atau mengklonkannya daripada GitHub. Dalam kes kami, kami akan memasangnya menggunakan Komposer.
Teruskan dan jalankan arahan berikut untuk memasang perpustakaan TCPDF menggunakan Komposer.
$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
Selepas pemasangan berjaya, anda perlu memasukkan fail autoload.php dalam skrip PHP anda seperti yang ditunjukkan dalam coretan kod berikut.
<?php require "./vendor/autoload.php"; ... ?>
Dengan cara ini, anda boleh menggunakan semua kaedah praktikal yang disediakan oleh perpustakaan TCPDF.
Dalam bahagian ini, kami akan membina contoh praktikal yang menunjukkan cara menjana invois PDF. Pustaka TCPDF menyediakan banyak templat siap pakai yang boleh anda gunakan sebagai rujukan untuk menjana dokumen PDF. Walau bagaimanapun, kami akan menjana invois dari awal.
Seperti yang telah saya nyatakan di bahagian sebelumnya, perpustakaan TCPDF menyediakan banyak templat siap sedia yang membolehkan anda menjana fail PDF universal dengan pengepala dan pengaki. Ini berguna jika anda berpuas hati dengan format dan tetapan lalai. Tetapi jika anda ingin menyesuaikan pengepala dan pengaki serta kandungan, anda mesti melanjutkan kelas TCPDF
dan mengatasi kaedah yang sepadan. 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
类的唯一目的是我们不想使用内置的页眉和页脚组件。因此,我们重写了类中的 header
和 footer
方法。
标头
方法在标题中,我们希望显示公司徽标以及所有者的姓名。让我们通过 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 方法设置文本的字体系列和字体大小,这些文本将添加到标题中。最后,我们使用 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 发票!
在上一节中,我们创建了 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
Dalam contoh kami, kami akan mencipta dua fail: customPdfGenerator.php
CustomPdfGenerator
, yang akan melanjutkan kelas TCPDF
teras dan mengatasi beberapa kaedah. Dalam fail 🎜example.php🎜 kita akan melihat cara menggunakan kelas CustomPdfGenerator
. 🎜
Kelas CustomPdfGenerator
$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);🎜Perlu diingat bahawa kelas
CustomPdfGenerator
memanjangkan kelas TCPDF
, jadi kita boleh menggunakan semua kaedah utiliti yang disediakan oleh kelas TCPDF
untuk memformat dan menjana dokumen PDF. 🎜
🎜Satu-satunya tujuan mencipta kelas kita sendiri dan bukannya menggunakan kelas TCPDF
secara langsung ialah kita tidak mahu menggunakan komponen pengepala dan pengaki terbina dalam. Oleh itu, kami mengatasi kaedah header
dan footer
dalam kelas. 🎜
Pengepala
Kaedah// start a new page $pdf->AddPage();🎜Pertama, kami melukis logo syarikat di sebelah kiri menggunakan kaedah Imej. Yang penting, anda perlu menghantar laluan mutlak imej logo anda kepada kaedah
Imej
. Seterusnya, kami menggunakan kaedah SetFont untuk menetapkan keluarga fon dan saiz fon teks yang akan ditambahkan pada tajuk. Akhir sekali, kami menggunakan kaedah Sel
untuk mencetak nama pemilik di sebelah kanan. 🎜
🎜Anda akan dapati bahawa anda boleh melepasi banyak parameter dalam kaedah ini dan saya menggalakkan anda untuk menerokanya secara terperinci kerana adalah mustahil untuk membincangkan setiap parameter dalam artikel ini. 🎜
🎜Dengan tetapan di atas, tajuk akan kelihatan seperti ini: 🎜
🎜🎜
Footer
adalah sangat mudah seperti yang ditunjukkan dalam coretan kod berikut. 🎜
// 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);🎜Bahagian pengaki kelihatan seperti ini: 🎜 🎜🎜 🎜Akhir sekali terdapat kaedah
printTable
, kita akan membincangkan kaedah ini kemudian. Kaedah printTable
adalah bebas daripada kelas TCPDF
. Sebaliknya, kaedah utiliti tersuai kami yang akan kami gunakan untuk melukis jadual untuk memaparkan maklumat projek. 🎜
🎜Ini ialah kelas CustomPdfGenerator
. Dalam bahagian seterusnya, kita akan melihat cara menggunakannya dan beberapa cara lain untuk menjana invois PDF penuh! 🎜
CustomPdfGenerator
, yang boleh kami gunakan untuk menjana fail PDF dengan pengepala dan pengaki tersuai. Dalam bahagian ini kami menunjukkan cara menggunakannya. 🎜
🎜Teruskan dan buat fail 🎜example.php🎜 dengan kandungan berikut. 🎜
// 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);🎜Mari kita lihat coretan penting daripada fail di atas. 🎜 🎜Mula-mula, kami menambah fail 🎜autoload.php🎜 untuk memastikan kelas
TCPDF
dimuatkan secara automatik. Seterusnya, kami menambah fail 🎜customPdfGenerator.php🎜 untuk memuatkan kelas tersuai kami. 🎜
接下来,我们实例化了 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 的更多信息,请查看以下链接:
Atas ialah kandungan terperinci Bagaimana untuk menjana fail PDF dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!