创建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
- 编辑它并在代码中进行以下更改:
- 把“Class pdf_propale_azur { ”替换为“Class pdf_propale_mycompanyblue { ”(重要提示:文件名和类名称必须匹配)
- 修改变量 $this->name 的值以反映新名称。例如,对于模板“azur”,更改行 '$this->name = "azur";' 为 '$this->name = "mycompanyblue";'。(在构造函数中)
- 保存:“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() - 绘制页脚的方法
个性化示例
插入 logo
- 添加说明
$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模板上添加额外字段
如需了解更多信息
- http://www.fpdf.org/?lang=en
- TCPDF函数清单:https://tcpdf.org/docs/srcdoc/
通过模块提供您的模板
如果制作的模板打算通过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 的提示。