创建PDF模板


本文档描述了如何创建自己的PDF文档生成模板,以便生成自定义文档(报价单、发票等)。它以报价单为例,但适用于任何类型的文档。

要了解如何生成ODT文档模板,请参阅 Create an ODT document template 页面。创建PDF模板需要PHP编程知识,但创建ODT模板不需要PHP编程知识。

前提条件

  • Dolibarr: 3.0+
  • PHP 开发知识

查找最接近您需求的现有模板

在Dolibarr中,通过进入模块配置页面、并单击模板行末尾的“预览”图标查看预览来测试现有模板。查看每个可用的模板。

在现有模板中,留意最接近您需求的模板。在本例中是azur模板(对应文件 pdf_propale_azur.modules.php)。

有关信息,所有模板都在htdocs/core/modules的相应子目录中,如报价单的propale子目录、发票的facture子目录、订单的commandes子目录等,最后是doc子目录。例如,自定义报价单模板将位于 ...core/modules/propale/doc/、对于自定义发票模板,它将位于 ...core/modules/facture/doc/ 等等...

创建新模板

参考现有模板创建

为了安全起见,我们将保留原始模板。例如,假设我们创建了一个新的报价单模块,称为“mycompanyblue”,其灵感来自“azur”模板:

  • 复制并粘贴文件 pdf_propale_azur.modules.php
  • 将该副本重命名为 pdf_propale_masocietebleu.modules.php
  • 编辑它并在代码中进行以下更改:
  1. 把“Class pdf_propale_azur { ”替换为“Class pdf_propale_mycompanyblue { ”(重要提示:文件名和类名称必须匹配)
  2. 修改变量 $this->name 的值以反映新名称。例如,对于模板“azur”,更改行 '$this->name = "azur";' 为 '$this->name = "mycompanyblue";'。(在构造函数中)
  3. 保存:“masocietebleu”模板可在Dolibarr的propales模板列表中找到
  • 通过在与模板相关的模块配置页面(即我们示例中的报价单模块配置页面)中激活此模板,并显示预览来测试此模板...

将您创建的新文档模板添加到表 llx_document_model 中。

使用模块生成器创建

使用 v12.0 中的模块生成器创建新模块。输入要创建的新对象的名称时,可以选中复选框以表示要管理此类新对象的文档。在这种情况下,将自动生成两个模板(一个 ODT 模板和一个 PDF 模板)。

生成的模板将保存在如下路径中:

  • custom/mymodule/core/modules/doc/pdf_standard_myobject.class.php
  • custom/mymodule/core/modules/doc/doc_generic_myobject_odt.class.php

自定义您的新模板

通过修改代码来自定义您创建的模板:

在 pdf_propale_mycompanyblue.modules.php 中查找函数 _pagehead() 。它负责管理标题的显示。

查找函数 _pagefooter() 。它负责管理页脚的显示。

查找函数 write_file() 。它显示PDF的正文。

用于PDF操作的库

用于创建PDF文档的库被称为TCPDF,可以在htdocs/includes/tcpdf/tcpdf.class.php中找到。在这个类中,您还可以找到许多用于生成文档的不同元素的方法。

PDF生成模板通过调用 pdf_getInstance() 来实例化PDF对象,然后将其方法与发票、订单或其他对象中的数据结合使用。

在文档创建脚本中通常会发现以下调用:

  • $pdf->SetFont() - 指定用于后续文本的字体
  • $pdf->SetXY() - 指定以X、Y坐标绘制下一个文本的起点,以页面的毫米为单位
  • $pdf->MultiCell() - 绘制一个可以包含文本的框,其中必须首先给出宽度和高度-非常常用
  • $pdf->GetY() - 返回Y的当前位置
  • $pdf->SetDrawColor() - 指定用于下一个要写入的文本的颜色-通常为黑色(0,0,0)或白色 (255,255,255)
  • $pdf->Rect() - 绘制一个矩形,其左上角位于前两个参数指示的点,右下角在前两个参数的相对模式下使用最后两个参数

脚本结构

用于生成PDF文档的脚本在模板类中具有以下方法(以“crabe”模板为例):

  • pdf_crabe() - PDF对象的构造函数
  • write_pdf_file() - 生成文件的通用函数。此方法在初始化一些变量后调用以下所有变量
  • _pagehead() - 绘制文档标题的函数,通常包括徽标、文档标题(和日期)以及文档发送者和接收者的框架
  • _tableau() - 详细信息表(产品、服务等)的绘制方法
  • _tableau_info() - 绘制包含发票上信息列表的表格的方法
  • _tableau_tot() - 绘制总计表的方法
  • _tableau_versement() - 绘制支付规则表的方法
  • _pagefoot() - 绘制页脚的方法

个性化示例

  • 添加说明
$pdf->Image('\www\htdocs\dolibarr\document\societe\logo.jpg', 10, 5, 60.00);

在示例中:10=横坐标,5=纵坐标,60=logo宽度

  • 如果logo位于现有文本的下方或上方,请通过注释掉显示信息的代码或更改其位置来删除现有文本。

在发票页面底部插入签名或其他内容

  • 打开要编辑和插入的.php文件
$pdf->Image(DOL_DOCUMENT_ROOT.'/mydir/signature.jpg',120,250,74);

图像(74mm宽)显示在页脚前的右栏中。

  • 将图像复制到目录。具有透明度的PNG图像似乎是有问题的。
  • 生成PDF时,将显示签名。

插入文本

使用的主要功能

$pdf->setX(float a); // set current x position
$pdf->setY(float b); // set current y position
$pdf->setXY(float a,float b); // fixe les positions x et y courantes
$pdf->SetTextColor(0,0,200); // fixe la couleur du texte
$pdf->SetFont('Arial','B',14); // fixe la police, le type ( 'B' pour gras, 'I' pour italique, '' pour normal,...)
$pdf->MultiCell(60, 8, 'Mon texte", 0, 'L'); // imprime 'Mon texte' avec saut de ligne

提醒:setXY 函数的原点位于页面的左上角

添加PDF批注(注释)

页面左侧围绕中间:

$pdf->Annotation(102, 202, 10, 10, "this is the comment text", array('Subtype'=>'Text', 'Name' => 'Comment', 'T' => 'this is comment author', 'Subj' => 'this is comment title', 'C' => array(255, 255, 0)));

页面右侧围绕中间:

$pdf->Annotation(202, 102, 10, 10, "this is the comment text", array('Subtype'=>'Text', 'Name' => 'Comment', 'T' => 'this is comment author', 'Subj' => 'this is comment title', 'C' => array(255, 255, 0)));

添加补充属性(额外字段)

一个专门的页面为您提供了一些建议,如何将补充属性(额外字段)集成到Dolibarr的PDF模板中:在PDF模板上添加额外字段

如需了解更多信息

通过模块提供您的模板

如果制作的模板打算通过Dolibarr扩展模块交付(请参阅文档以创建Dolibarr模块),则您的模板文件将不与其他模板文件位于同一目录中,因此不会被自动检测到。要使其可被检测到,您需要在扩展模块的初始化函数中添加以下行:

sql=array("INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$MODELNAME."','".$MODEL_TARGET_MODULE."',".$conf->entity." )");

前面

 return $this->_init($sql,$option);

之后,前往 主页 => 设置 => 模块/应用 => 模板所在的模块=>配置

  • 激活应该出现在可用模块中的您的模块
  • 可以将其设置为默认建议的模板

关于该主题的视频

故障排除

问题:我的PDF模板无法识别外语字符,它会将它们输出为 ???

这可能是字体的问题,当前用于生成PDF的字体无法处理您试图打印的外语字符。所以,请尝试使用另一种字体。

您将在您的Dolibarr文件夹中找到Dolibarr用于打印PDF的字体:.../includes/tcpdf/fonts/

要更改用于生成PDF的字体,您需要编辑您正在使用的语言的“main.lang”文件(例如,如果您使用英语,您可以在您的 Dolibarr.../langs/en_US/main.lang 中找到该文件)

  • 编辑文件 main.lang
  • 找到文件开头的常量FONTFORPDF,并将值更改为FONTFORPDF=dejavusans,例如,如果您想使用dejavusan。请注意,有时FONTFORPDF可能会丢失,在这种情况下,您应该将其添加到文件的开头。
  • 保存文件,然后再次尝试生成PDF。

如果你运气不好,你可以尝试使用更多的字体,只需访问TCPDF网站 sourceforge.net/projects/TCPDF/files/ 并下载最新的zip包。然后只从zip中提取“fonts”文件夹。最后复制到Dolibarr安装中的 .../includes/tcpdf/fonts/,这样您将获得更多可供使用的字体。

此外,请在修改之前备份您的文件。

如果这不起作用,请选择:确保Translation类已正确安装,并在PDF模板中加载了正确的语言(存储在$langs或$outputlangs变量中)。

感谢 Humphrey 的提示。