98
edits
Jawaid imran (talk | contribs) (Add pdf annotation example) |
mNo edit summary |
||
| Line 1: | Line 1: | ||
{{TemplateDocDevEn}} | {{TemplateDocDevEn}} | ||
This | This page describes how to create your own document-generation module (for proposals, invoices, etc...) | ||
The tutorial uses Commercial Proposals as an example but the same process is used for any type of document. | |||
Building a PDF template requires some PHP knowledge. | |||
An ODT template does not require PHP knowledge: to build an ODT template, see this page [[Create an ODT document template]]. | |||
= Prerequisite = | = Prerequisite = | ||
| Line 11: | Line 12: | ||
= Find a | = Find a document template that is the closest to your requirements = | ||
You may review the existing templates by going to the module setup area and by clicking on the "preview" logo. | |||
Choose one that is the best match to your needs. In this example, we will use the template "azur" that corresponds to the file | |||
pdf_propale_azur.modules.php | |||
All document models are in '''htdocs/core/modules''', in subdirectories, for example | |||
propale for commercial proposals | |||
facture for invoices | |||
commandes for orders, etc... | |||
and finally '''doc''' or '''pdf'''. | |||
For instance, a customized proposal template will be located in '''...core/modules/propale/doc/''' | For instance, a customized proposal template will be located in '''...core/modules/propale/doc/''' | ||
= Create your new template = | = Create your new template = | ||
Do not modify a template. Copy the file and rename it. | |||
For this example, we will call the new template 'mycompanyblue', based on the template 'azur': | |||
* Copy and paste file pdf_propale_azur.modules.php | * Copy and paste file pdf_propale_azur.modules.php | ||
* Rename the copy | * Rename the copy as pdf_propale_mycompanyblue.modules.php | ||
* Edit and make the following changes in the code: | * Edit and make the following changes in the code: | ||
# Rename 'Class pdf_propale_azur { ' | # Rename 'Class pdf_propale_azur { ' to 'Class pdf_propale_mycompanyblue { ' | ||
# Rename 'Function pdf_propale_azur ($db=0)' | # Rename 'Function pdf_propale_azur ($db=0)' to 'Function pdf_propale_mycompanyblue ($db=0)' . This may not exist. | ||
# Rename constant $this->name to match your new template name. For example for 'azur' template, change line '$this->name = "azur";' | # Rename constant $this->name to match your new template name. | ||
# Save file. Now template | For example for 'azur' template, change line '$this->name = "azur";' to '$this->name = "mycompanyblue";'. | ||
# Save file. Now the template will be available in the list of models in Dolibarr. | |||
# Test this model (see previous section) before going further ... | # Test this model (see previous section) before going further ... | ||
= Customize content of your new template = | = Customize content of your new template = | ||
Customize the template | Customize the new template. In file pdf_propale_mycompanyblue.modules.php, search for function | ||
'Function _pagehead (&$pdf, $fac)'. This defines the header. | |||
== Library for PDF manipulation == | == Library for PDF manipulation == | ||
The library used to create PDF documents in PHP | The library used to create PDF documents in PHP is called FPDF and can be found in htdocs/includes/tcpdf/tcpdf.class.php. This class contains the methods used to generate different parts of documents. | ||
Templates instantiate | Templates instantiate the FPDF class and use its methods combined with the specific data of the invoice, order etc. | ||
We can | We can generally find the following calls into templates that generate PDF documents: | ||
* $pdf->SetFont() - ''Define the font to use for the text'' | * $pdf->SetFont() - ''Define the font to use for the text'' | ||
* $pdf->SetXY() - ''Define position (X,Y) for next text that will be output onto page'' | * $pdf->SetXY() - ''Define position (X,Y) for next text that will be output onto page'' | ||
| Line 45: | Line 54: | ||
* $pdf->GetY() - ''Return current Y position'' | * $pdf->GetY() - ''Return current Y position'' | ||
* $pdf->SetDrawColor() - ''Set the color to use for new text to write - ie black (0,0,0) or white (255,255,255)'' | * $pdf->SetDrawColor() - ''Set the color to use for new text to write - ie black (0,0,0) or white (255,255,255)'' | ||
* $pdf->Rect() - '' | * $pdf->Rect() - ''Draw a rectangle whose top left corner coordinates are defined by two first parameters and bottom right corner is defined by two following parameters that are relative values'' | ||
| Line 67: | Line 76: | ||
</source> | </source> | ||
With this example: 10=abscissa, 5=ordinate, 60=with of logo | With this example: 10=abscissa, 5=ordinate, 60=with of logo | ||
* If logo is on or outside existing text, remove | * If the logo is on or outside existing text, remove existing text by commenting the code that outputs the text or by changing its position. | ||
=== Insert text === | === Insert text === | ||
Most | Most common function to use | ||
<source lang="php"> | <source lang="php"> | ||
$pdf->setX(float a); // set current x position | $pdf->setX(float a); // set current x position | ||
| Line 107: | Line 116: | ||
== Q: My PDF template doesn't understand foreign characters, it outputs them as ??? == | == Q: My PDF template doesn't understand foreign characters, it outputs them as ??? == | ||
This is probably a font problem, the current font used for generating the PDF cannot handle the foreign characters you are trying to print. So just try to use another | This is probably a font problem, the current font used for generating the PDF cannot handle the foreign characters you are trying to print. So just try to use another font. | ||
You will find the fonts used by Dolibarr to print PDF inside your Dolibarr folder.../includes/tcpdf/fonts/ | You will find the fonts used by Dolibarr to print PDF inside your Dolibarr folder.../includes/tcpdf/fonts/ | ||
| Line 119: | Line 128: | ||
If you are unlucky, you can try with more fonts, just go to the TCPDF website sourceforge.net/projects/tcpdf/files/ and download the latest zip package. Then extract only the 'fonts' folder from the zip. Then copy the files in your Dolibarr installation .../includes/tcpdf/fonts/ so you will get more fonts to play with. | If you are unlucky, you can try with more fonts, just go to the TCPDF website sourceforge.net/projects/tcpdf/files/ and download the latest zip package. Then extract only the 'fonts' folder from the zip. Then copy the files in your Dolibarr installation .../includes/tcpdf/fonts/ so you will get more fonts to play with. | ||
Also, please make a backup of your files | Also, please make a backup of your files modification. | ||
Alternative if this doesn't work: make sure the Translation class is correctly | Alternative if this doesn't work: make sure the Translation class is correctly instantiated and loaded with the correct language inside your PDF templates (stored inside the $langs or $outputlangs variable). | ||
Thanks to Humphrey for the tip. | |||
edits