pdf

Small Yii extension, that wraps a few PHP libraries (mPDF and HTML2PDF) to convert HTML to PDF
57 followers

Yii-PDF Extension

Small Yii extension, that wraps a few PHP libraries (mPDF and HTML2PDF so far) to convert HTML to PDF

Resources

  • Extension's GitHub repository
  • mPDF - is a PHP class to generate PDF files from HTML with Unicode/UTF-8 and CJK support
  • HTML2PDF - is a PHP class using FPDF for the PHP4 release, and TCPDF for the PHP5 release. It can convert valid HTML and xHTML to PDF

Requirements

  • Yii 1.1.9 or above
  • mPDF version 5.3 (has been released 2011-07-21) or above
  • HTML2PDF version 4.03 (has been released 2011-05-27) or above

Official documentation and examples

Installation

  • Download and extract extension to the directory protected/extensions/yii-pdf
  • Download and extract library (mPDF and/or HTML2PDF) to own directory in catalog protected/vendors or set new value for 'librarySourcePath' parameter in 'params' array
  • Array 'defaultParams' - this is an array of constructor's default params of selected library. If you want to change default params - you can set them in config file (like shown below). If you do so - you must keep the order of array items!
  • In your protected/config/main.php, add the following:
//...
'components'=>array(
    //...
    'ePdf' => array(
        'class'         => 'ext.yii-pdf.EYiiPdf',
        'params'        => array(
            'mpdf'     => array(
                'librarySourcePath' => 'application.vendors.mpdf.*',
                'constants'         => array(
                    '_MPDF_TEMP_PATH' => Yii::getPathOfAlias('application.runtime'),
                ),
                'class'=>'mpdf', // the literal class filename to be loaded from the vendors folder
                /*'defaultParams'     => array( // More info: http://mpdf1.com/manual/index.php?tid=184
                    'mode'              => '', //  This parameter specifies the mode of the new document.
                    'format'            => 'A4', // format A4, A5, ...
                    'default_font_size' => 0, // Sets the default document font size in points (pt)
                    'default_font'      => '', // Sets the default font-family for the new document.
                    'mgl'               => 15, // margin_left. Sets the page margins for the new document.
                    'mgr'               => 15, // margin_right
                    'mgt'               => 16, // margin_top
                    'mgb'               => 16, // margin_bottom
                    'mgh'               => 9, // margin_header
                    'mgf'               => 9, // margin_footer
                    'orientation'       => 'P', // landscape or portrait orientation
                )*/
            ),
            'HTML2PDF' => array(
                'librarySourcePath' => 'application.vendors.html2pdf.*',
                'classFile'         => 'html2pdf.class.php', // For adding to Yii::$classMap
                /*'defaultParams'     => array( // More info: http://wiki.spipu.net/doku.php?id=html2pdf:en:v4:accueil
                    'orientation' => 'P', // landscape or portrait orientation
                    'format'      => 'A4', // format A4, A5, ...
                    'language'    => 'en', // language: fr, en, it ...
                    'unicode'     => true, // TRUE means clustering the input text IS unicode (default = true)
                    'encoding'    => 'UTF-8', // charset encoding; Default is UTF-8
                    'marges'      => array(5, 5, 5, 8), // margins by default, in order (left, top, right, bottom)
                )*/
            )
        ),
    ),
    //...
)
//...

Usage

...
    public function actionIndex()
    {
        # mPDF
        $mPDF1 = Yii::app()->ePdf->mpdf();
 
        # You can easily override default constructor's params
        $mPDF1 = Yii::app()->ePdf->mpdf('', 'A5');
 
        # render (full page)
        $mPDF1->WriteHTML($this->render('index', array(), true));
 
        # Load a stylesheet
        $stylesheet = file_get_contents(Yii::getPathOfAlias('webroot.css') . '/main.css');
        $mPDF1->WriteHTML($stylesheet, 1);
 
        # renderPartial (only 'view' of current controller)
        $mPDF1->WriteHTML($this->renderPartial('index', array(), true));
 
        # Renders image
        $mPDF1->WriteHTML(CHtml::image(Yii::getPathOfAlias('webroot.css') . '/bg.gif' ));
 
        # Outputs ready PDF
        $mPDF1->Output();
 
        ////////////////////////////////////////////////////////////////////////////////////
 
        # HTML2PDF has very similar syntax
        $html2pdf = Yii::app()->ePdf->HTML2PDF();
        $html2pdf->WriteHTML($this->renderPartial('index', array(), true));
        $html2pdf->Output();
 
        ////////////////////////////////////////////////////////////////////////////////////
 
        # Example from HTML2PDF wiki: Send PDF by email
        $content_PDF = $html2pdf->Output('', EYiiPdf::OUTPUT_TO_STRING);
        require_once(dirname(__FILE__).'/pjmail/pjmail.class.php');
        $mail = new PJmail();
        $mail->setAllFrom('webmaster@my_site.net', "My personal site");
        $mail->addrecipient('mail_user@my_site.net');
        $mail->addsubject("Example sending PDF");
        $mail->text = "This is an example of sending a PDF file";
        $mail->addbinattachement("my_document.pdf", $content_PDF);
        $res = $mail->sendmail();
    }
...

License

  • mPDF has GNU General Public License version 2
  • HTML2PDF has GNU Library or Lesser General Public License (LGPL)
  • This extension was released under the New BSD License

Change Log

  • Version 0.3.2 (2013-04-05)

    • func_get_args() is using through a variable now (for PHP < 5.3.0)
  • Version 0.3 (2012-07-07)

    • Fixed default constructor's params [thanks to zitter]
  • Version 0.2a (2012-02-05)

    • Fixed method name (mpdf - now it's lower-case) for some case-sensitive *nix OS filesystems (it may cause for some errors) [thanks to Hylke]
  • Version 0.2 (2012-01-24)

  • Version 0.2 (2012-01-18)
    • Parameter 'defaultParams' is not required anymore (will be used constructor's default params of selected library)
    • Added a few helper constants for Output() method (detailed info located in extension's class)
class EYiiPdf extends CApplicationComponent
{
    ...
    const OUTPUT_TO_BROWSER = "I";
    const OUTPUT_TO_DOWNLOAD = "D";
    const OUTPUT_TO_FILE = "F";
    const OUTPUT_TO_STRING = "S";
    ...
}
 
#Example (make sure that target directory is writable)
$html2pdf->Output('/path/to/file.pdf', EYiiPdf::OUTPUT_TO_FILE);
  • Version 0.1 (2012-01-16)
    • Initial release

Total 20 comments

#13192 report it
staticblue at 2013/05/13 03:49am
Hi

Hi Borales,

Thanks for your answer. What do you mean by "applied correctly in the given scope" ?

I tried doing render instead of renderPartial, but this gives me a blank (empty) PDF ... any ideas ?

Jonathan

#13030 report it
Borales at 2013/04/29 09:46am
Re

staticblue, are you sure your CSS rules are applied correctly in the given scope? Try to render a whole page (renderPartial -> render).

#12952 report it
staticblue at 2013/04/23 04:08am
here is my current code :
# mPDF
        $mPDF1 = Yii::app()->ePdf->mpdf();
 
        # Load a stylesheet
        $stylesheet = file_get_contents(Yii::getPathOfAlias('webroot.css') . '/screen.css');
        $mPDF1->WriteHTML($stylesheet, 1);
 
        $mPDF1->WriteHTML($this->renderPartial('view', array(
                'model' => $model,
                'items' => $items,
                'order' => $order,
        ), true));
 
            $mPDF1->Output();

It definitely finds my screen.css, but doesn't seem to apply any of the styles ?

#12951 report it
Borales at 2013/04/23 03:24am
Re

staticblue, can you show your code with CSS part here?

#12950 report it
staticblue at 2013/04/23 02:59am
Thanks !

Thanks for this awesome extension !

For some reason, with mPDF, I cannot get my CSS to be used in the PDF. I don't get any "file not found" error so I am guessing my path is correct, but still the CSS is not used. Any suggestions ?

Thanks, Jonathan

#11596 report it
Accelm at 2013/01/22 10:07am
Landscape Orientation

Just in case anyone was wondering, I was able to get the landscape orientation to work by using this method of declaring the class

$pdf = Yii::app()->ePdf->mpdf('', 'A4-L', '','','','','','','','','L');
#9170 report it
Steven Ly at 2012/07/25 08:34pm
To the Point..

Just exactly what I need for.. Thank you!

#8879 report it
Andra at 2012/07/05 10:41pm
Invalid argument supplied for foreach()

I have some report to export to pdf. If the report only need 1 page, it can render the pdf. but if my data make the report more then 1 page. i get this error.. Please help me to fix this...

If i use Html2PDF how to include the css in it..

#8508 report it
wonk4rol at 2012/06/08 06:02am
You must set parameters first

i have edit my EYiiPdf.php like this:

public function mPDF()
    {
        $params = func_get_args();
        $this->initLibrary(__FUNCTION__, $params);
        return $this->_mPDF;
    }
 
    /**
     * @return HTML2PDF
     */
    public function HTML2PDF()
    {
        $params = func_get_args();
        $this->initLibrary(__FUNCTION__, $params);
        return $this->_HTML2PDF;
    }

but i still get error "You must set parameters first "

#8362 report it
ShiblY KhaN at 2012/05/29 03:50am
Great One

How could I give a page break?

#8212 report it
Borales at 2012/05/18 06:26am
RE: Small change for me

zitter, thanks. I will fix this asap.

#8211 report it
zitter at 2012/05/18 05:44am
Small change for me

I've changed

# Merging params arrays (preserving params' indexes)
    if(isset($this->params[$library_name]['defaultParams'])) echo "settato!";
        $args = isset($this->params[$library_name]['defaultParams'])
              ? $constructorClassArgs + array_values($this->params[$library_name]['defaultParams'])
              : array();

to

# Merging params arrays (preserving params' indexes)
    if(isset($this->params[$library_name]['defaultParams'])) echo "settato!";
        $args = isset($this->params[$library_name]['defaultParams'])
              ? $constructorClassArgs + array_values($this->params[$library_name]['defaultParams'])
              : $constructorClassArgs; // <-- Note here

to make it work with parameters passed on constructor.

#8047 report it
jiaming at 2012/05/05 10:33pm
Hi

Thanks for your extension. Can I use it to convert images/documents(doc,ppt,etc) to pdf file ?

Thanks

#7540 report it
MrLe at 2012/03/28 06:06pm
RE: Landscape Orientation

borales, thanks for your reply. Tried out your suggestion but got error: "Fatal error: Cannot pass parameter 2 by reference" ie. _setPageSize('A4', 'L')

    $pdf = Yii::app()->ePdf->mpdf();
    $pdf->_setPageSize('A4', 'L');
#7523 report it
Borales at 2012/03/28 01:55am
RE: Landscape Orientation

MrLe, try to do like this:

$mpdf = Yii::app()->ePdf->mpdf(); // keep default params or set them after constructor
$mpdf->_setPageSize('A4', 'L');
#7522 report it
MrLe at 2012/03/27 09:10pm
Landscape Orientation

I've tried setting orientation to 'L', but the generated pdf file still remains portrait. The only way I could do it was to manually set the variables as follows. Anyone manage to get landscape orientation working or is this a known bug in mpdf.php?

Code example produces landscape 11.69 x 8.26 inch:

            $pdf = Yii::app()->ePdf->mpdf('', 'A4', '','','','','','','','','P');

            $pdf->writeHTMLfooter=false;
            $pdf->writeHTMLheader=false;
            $pdf->DeflMargin=5;
            $pdf->DefrMargin=5;
            $pdf->tMargin=5;
            $pdf->bMargin=5;

            $pdf->w=297;   //manually set width
            $pdf->h=209.8; //manually set height
#7239 report it
bennouna at 2012/03/06 07:17am
Great - works also with Yii 1.1.8

Thanks for the great extension. And thanks also for letting me know about mPDF and HTML2PDF — I thought the world was spinning around TCPDF and Zend_Pdf :)

Just FYI, I tested it on a not-so-basic view (with relative divs, photos, and UTF8) on Yii 1.1.8 and it works like a charm. I tried it also on 1.1.9.

Well I may have now to test with HTML2PDF and TCPDF before maybe digging into mPDF options, in order to compare the three as per size and performance.

Edit: Maybe someone would be interested on a display-or-generate snippet:

public function actionPdf($id)
{
    (code to generate / retrieve the file name depending on $id)
    $fileName = 'someName'; // without the extension, I add it later. The idea is to get the fileName from the db for instance or generate it dynamically
    $file = Yii::getPathOfAlias('webroot') . '/targetPath/' . $fileName . '.pdf';
    if(!file_exists($file)) {
        $mPDF1 = Yii::app()->ePdf->mpdf();
        $stylesheet = file_get_contents(Yii::getPathOfAlias('webroot.css') . '/screen.css');
        $mPDF1->WriteHTML($stylesheet, 1);
        $stylesheet = file_get_contents(Yii::getPathOfAlias('webroot.css') . '/custom.css');
        $mPDF1->WriteHTML($stylesheet, 1);
        $mPDF1->WriteHTML($this->renderPartial('view', array('model' => $this->loadModel($id)), true));
        $mPDF1->Output($file, EYiiPdf::OUTPUT_TO_FILE);
    }
    header('Content-Type: application/pdf');
    readfile($file);
}
#6934 report it
jjmf at 2012/02/14 11:50am
Minor adjust to use with PHP versions prior to 5.3

Replace

public function mpdf()
{
    $this->initLibrary(__FUNCTION__, func_get_args());
    return $this->_mpdf;
}

With

public function mpdf()
{
    $params = func_get_args();
    $this->initLibrary(__FUNCTION__, $params);
    return $this->_mpdf;
}

Do the same for the HTML2PDF() function just bellow the mpdf() function.

#6728 report it
yiimann at 2012/02/01 10:34am
Thanks

Thanks for this cool extension !

Leave a comment

Please to leave your comment.

Create extension