Maison >développement back-end >tutoriel php >Comment générer des fichiers PDF en PHP
Dans cet article, nous verrons comment générer des fichiers PDF en utilisant PHP. Nous créerons des documents PDF par programme en utilisant la bibliothèque TCPDF.
Si vous développez un site Web permettant aux utilisateurs de télécharger ou d'imprimer des documents tels que des reçus de commande, des factures ou des factures, vous disposez de plusieurs options. Vous pouvez afficher le document en ligne dans le navigateur ou le proposer en téléchargement. Le PDF est l'un des meilleurs formats pour télécharger des documents et il est excellent pour préserver le formatage du texte.
Donc, si vous souhaitez apprendre à générer des fichiers PDF sur votre site Web PHP, vous êtes au bon endroit !
Dans cette section, nous apprendrons comment installer la bibliothèque TCPDF.
Il existe plusieurs façons d'installer la bibliothèque TCPDF sur le serveur. La bibliothèque TCPDF est disponible sur Packagist et GitHub, vous pouvez donc utiliser Composer ou la cloner depuis GitHub. Dans notre cas, nous l'installerons à l'aide de Composer.
Allez-y et exécutez la commande suivante pour installer la bibliothèque TCPDF à l'aide de Composer.
$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
Après une installation réussie, vous devez inclure le fichier autoload.php dans votre script PHP, comme indiqué dans l'extrait de code suivant.
<?php require "./vendor/autoload.php"; ... ?>
De cette façon, vous pouvez utiliser toutes les méthodes pratiques fournies par la bibliothèque TCPDF.
Dans cette section, nous allons construire un exemple pratique qui montre comment générer une facture PDF. La bibliothèque TCPDF fournit de nombreux modèles prêts à l'emploi que vous pouvez utiliser comme référence pour générer des documents PDF. Cependant, nous générerons la facture à partir de zéro.
Comme je l'ai déjà mentionné dans la section précédente, la bibliothèque TCPDF fournit de nombreux modèles prêts à l'emploi qui vous permettent de générer des fichiers PDF universels avec des en-têtes et des pieds de page. Ceci est utile si vous êtes satisfait du format et des paramètres par défaut. Mais si vous souhaitez personnaliser l'en-tête et le pied de page ainsi que le contenu, vous devez étendre la classe TCPDF
et remplacer les méthodes correspondantes.
Dans notre exemple, nous allons créer deux fichiers : customPdfGenerator.php et example.php. Dans le fichier customPdfGenerator.php, nous allons créer la classe CustomPdfGenerator
类,它将扩展核心 TCPDF
类并重写几个方法。在 example.php 文件中,我们将了解如何使用 CustomPdfGenerator
qui étendra la classe principale
CustomPdfGenerator
nous verrons comment utiliser la classe cours
Procédez à la création du fichier 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
Il est à noter que la classe étend la classe 标头
pour formater et générer des documents PDF. Le seul objectif de la création de nos propres classes au lieu d'utiliser directement les classes
est que nous ne voulons pas utiliser les composants d'en-tête et de pied de page intégrés. Par conséquent, nous remplaçons les méthodesheader
et footer
dans la classe.
Image
方法。接下来,我们使用 SetFont 方法设置文本的字体系列和字体大小,这些文本将添加到标题中。最后,我们使用 Cell
Dans le titre, nous souhaitons afficher le logo de l'entreprise ainsi que le nom du propriétaire. Passons en revue la méthode header pour comprendre comment elle fonctionne.
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'); }Tout d'abord, nous dessinons le logo de l'entreprise sur la gauche en utilisant la méthode Image. Surtout, vous devez transmettre le chemin absolu de l'image du logo à la méthode
pour imprimer le nom du propriétaire à droite.
Vous remarquerez que vous pouvez transmettre de nombreux paramètres dans ces méthodes et je vous encourage à les explorer en détail car il est impossible de discuter de chaque paramètre dans cet article.
Footer
Méthode du pied de page
Dans le pied de page, nous souhaitons afficher du texte statique, la méthode
est donc très simple, comme le montre l'extrait de code suivant.
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
La section pied de page ressemble à ceci :
CustomPdfGenerator
printTable
, nous reviendrons sur cette méthode plus tard. La méthode printTable
n'a rien à voir avec la classe
CustomPdfGenerator
C'est le
fichier exemple.php
Dans la section précédente, nous avons créé la classe wrapperque nous pouvons utiliser pour générer des fichiers PDF avec des en-têtes et des pieds de page personnalisés. Dans cette section, nous montrons comment l'utiliser.
Allez-y et créez le fichier example.php avec le contenu suivant. 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');Jetons un coup d'œil aux extraits importants du fichier ci-dessus. Tout d'abord, nous avons ajouté le fichier 🎜autoload.php🎜 pour garantir que les 🎜 classes sont chargées automatiquement. Ensuite, nous avons ajouté le fichier 🎜customPdfGenerator.php🎜 pour charger notre classe personnalisée. 🎜
接下来,我们实例化了 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 的更多信息,请查看以下链接:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!