創建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 的提示。