創建PDF模板

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


本文檔描述了如何創建自己的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 的提示。