PHP Manual
Prev |  | Next

# LXXIV. PDF functions

# Introduction

The PDF functions in PHP can create PDF files using the PDFlib library created by Thomas Merz. PDFlib is available for download at http://www.pdflib.com/pdflib/index.html, but requires that you purchase a license for commercial use. The JPEG and TIFF libraries are required to compile this extension. Please see the PDFlib installation section for more information about compiling PDF support into PHP.

The documentation in this section is only meant to be an overview of the available functions in the PDFlib library and should not be considered an exhaustive reference. Please consult the documentation included in the source distribution of PDFlib for the full and detailed explanation of each function here. It provides a very good overview of what PDFlib is capable of doing and contains the most up-to-date documentation of all functions.

All of the functions in PDFlib and the PHP module have identical function names and parameters. You will need to understand some of the basic concepts of PDF and PostScript to efficiently use this extension. All lengths and coordinates are measured in PostScript points. There are generally 72 PostScript points to an inch, but this depends on the output resolution. Please see the PDFlib documentation included with the source distribution of PDFlib for a more thorough explanation of the coordinate system used.

Please note that most of the PDF functions require a `pdf object` as it's first parameter. Please see the examples below for more information.

> Note: An alternative PHP module for PDF document creation based on FastIO's ClibPDF is available. Please see the ClibPDF section for details. Note that ClibPDF has a slightly different API compared to PDFlib.

# Confusion with old PDFlib versions

Starting with PHP 4.0.5, the PHP extension for PDFlib is officially supported by PDFlib GmbH. This means that all the functions described in the PDFlib manual (V3.00 or greater) are supported by PHP 4 with exactly the same meaning and the same parameters. Only the return values may differ from the PDFlib manual, because the PHP convention of returning `FALSE` was adopted. For compatibility reasons this binding for PDFlib still supports the old functions, but they should be replaced by their new versions. PDFlib GmbH will not support any problems arising from the use of these deprecated functions.

Table 1. Deprecated functions and its replacements

Old function | Replacement
--- | ---
pdf_put_image() | Not needed anymore.
pdf_execute_image() | Not needed anymore.
pdf_get_annotation() | pdf_get_bookmark() using the same parameters.
pdf_get_font() | pdf_get_value() passing `"font"` as the second parameter.
pdf_get_fontsize() | pdf_get_value() passing `"fontsize"` as the second parameter.
pdf_get_fontname() | pdf_get_parameter() passing `"fontname"` as the second parameter.
pdf_set_info_creator() | pdf_set_info() passing `"Creator"` as the second parameter.
pdf_set_info_title() | pdf_set_info() passing `"Title"` as the second parameter.
pdf_set_info_subject() | pdf_set_info() passing `"Subject"` as the second parameter.
pdf_set_info_author() | pdf_set_info() passing `"Author"` as the second parameter.
pdf_set_info_keywords() | pdf_set_info() passing `"Keywords"` as the second parameter.
pdf_set_leading() | pdf_set_value() passing `"leading"` as the second parameter.
pdf_set_text_rendering() | pdf_set_value() passing `"textrendering"` as the second parameter.
pdf_set_text_rise() | pdf_set_value() passing `"textrise"` as the second parameter.
pdf_set_horiz_scaling() | pdf_set_value() passing `"horizscaling"` as the second parameter.
pdf_set_text_matrix() | Not available anymore
pdf_set_char_spacing() | pdf_set_value() passing `"charspacing"` as the second parameter.
pdf_set_word_spacing() | pdf_set_value() passing `"wordspacing"` as the second parameter.
pdf_set_transition() | pdf_set_parameter() passing `"transition"` as the second parameter.
pdf_open() | pdf_new() plus an subsequent call of pdf_open_file()
pdf_set_font() | pdf_findfont() plus an subsequent call of pdf_setfont()
pdf_set_duration() | pdf_set_value() passing `"duration"` as the second parameter.
pdf_open_gif() | pdf_open_image_file() passing `"gif"` as the second parameter.
pdf_open_jpeg() | pdf_open_image_file() passing `"jpeg"` as the second parameter.
pdf_open_tiff() | pdf_open_image_file() passing `"tiff"` as the second parameter.
pdf_open_png() | pdf_open_image_file() passing `"png"` as the second parameter.
pdf_get_image_width() | pdf_get_value() passing `"imagewidth"` as the second parameter and the image as the third parameter.
pdf_get_image_height() | pdf_get_value() passing `"imageheight"` as the second parameter and the image as the third parameter.

# PDFlib 3.x Installation Hints

When using version 3.x of PDFlib, you should configure PDFlib with the option `--enable-shared-pdflib`.

# Issues with older versions of PDFlib

Any version of PHP 4 after March 9, 2000 does not support versions of PDFlib older than 3.0.

PDFlib 3.0 or greater is supported by PHP 3.0.19 and later.

# Examples

Most of the functions are fairly easy to use. The most difficult part is probably creating a very simple PDF document at all. The following example should help to get started. It creates `test.pdf` with one page. The page contains the text "Times Roman outlined" in an outlined, 30pt font. The text is also underlined.

Example 1. Creating a PDF document with PDFlib
    <?php
    $pdf = pdf_new();
    pdf_open_file($pdf, "test.pdf");
    pdf_set_info($pdf, "Author", "Uwe Steinmann");
    pdf_set_info($pdf, "Title", "Test for PHP wrapper of PDFlib 2.0");
    pdf_set_info($pdf, "Creator", "See Author");
    pdf_set_info($pdf, "Subject", "Testing");
    pdf_begin_page($pdf, 595, 842);
    pdf_add_outline($pdf, "Page 1");
    pdf_set_font($pdf, "Times-Roman", 30, "host");
    pdf_set_value($pdf, "textrendering", 1);
    pdf_show_xy($pdf, "Times Roman outlined", 50, 750);
    pdf_moveto($pdf, 50, 740);
    pdf_lineto($pdf, 330, 740);
    pdf_stroke($pdf);
    pdf_end_page($pdf);
    pdf_close($pdf);
    pdf_delete($pdf);
    echo "<A HREF=getpdf.php>finished</A>";
    ?>
The script `getpdf.php` just returns the pdf document.
    <?php
    $len = filesize($filename);
    header("Content-type: application/pdf");
    header("Content-Length: $len");
    header("Content-Disposition: inline; filename=foo.pdf");
    readfile($filename);
    ?>

The PDFlib distribution contains a more complex example which creates a page with an analog clock. Here we use the in memory creation feature of PDFlib to alleviate the need to use temporary files. The example, converted to PHP from the PDFlib example, is as follows: (The same example is available in the CLibPDF documentation.)

Example 2. pdfclock example from PDFlib distribution
    <?php
    $radius = 200;
    $margin = 20;
    $pagecount = 10;

    $pdf = pdf_new();

    if (!pdf_open_file($pdf, "")) {
        print error;
        exit;
    };

    pdf_set_parameter($pdf, "warning", "true");

    pdf_set_info($pdf, "Creator", "pdf_clock.php");
    pdf_set_info($pdf, "Author", "Uwe Steinmann");
    pdf_set_info($pdf, "Title", "Analog Clock");

    while($pagecount-- > 0) {
        pdf_begin_page($pdf, 2 * ($radius + $margin), 2 * ($radius + $margin));

        pdf_set_parameter($pdf, "transition", "wipe");
        pdf_set_value($pdf, "duration", 0.5);

        pdf_translate($pdf, $radius + $margin, $radius + $margin);
        pdf_save($pdf);
        pdf_setrgbcolor($pdf, 0.0, 0.0, 1.0);

        /* minute strokes */
        pdf_setlinewidth($pdf, 2.0);
        for ($alpha = 0; $alpha < 360; $alpha += 6) {
            pdf_rotate($pdf, 6.0);
            pdf_moveto($pdf, $radius, 0.0);
            pdf_lineto($pdf, $radius-$margin/3, 0.0);
            pdf_stroke($pdf);
        }

        pdf_restore($pdf);
        pdf_save($pdf);

        /* 5 minute strokes */
        pdf_setlinewidth($pdf, 3.0);
        for ($alpha = 0; $alpha < 360; $alpha += 30) {
            pdf_rotate($pdf, 30.0);
            pdf_moveto($pdf, $radius, 0.0);
            pdf_lineto($pdf, $radius-$margin, 0.0);
            pdf_stroke($pdf);
        }

        $ltime = getdate();

        /* draw hour hand */
        pdf_save($pdf);
        pdf_rotate($pdf,-(($ltime['minutes']/60.0)+$ltime['hours']-3.0)*30.0);
        pdf_moveto($pdf, -$radius/10, -$radius/20);
        pdf_lineto($pdf, $radius/2, 0.0);
        pdf_lineto($pdf, -$radius/10, $radius/20);
        pdf_closepath($pdf);
        pdf_fill($pdf);
        pdf_restore($pdf);

        /* draw minute hand */
        pdf_save($pdf);
        pdf_rotate($pdf,-(($ltime['seconds']/60.0)+$ltime['minutes']-15.0)*6.0);
        pdf_moveto($pdf, -$radius/10, -$radius/20);
        pdf_lineto($pdf, $radius * 0.8, 0.0);
        pdf_lineto($pdf, -$radius/10, $radius/20);
        pdf_closepath($pdf);
        pdf_fill($pdf);
        pdf_restore($pdf);

        /* draw second hand */
        pdf_setrgbcolor($pdf, 1.0, 0.0, 0.0);
        pdf_setlinewidth($pdf, 2);
        pdf_save($pdf);
        pdf_rotate($pdf, -(($ltime['seconds'] - 15.0) * 6.0));
        pdf_moveto($pdf, -$radius/5, 0.0);
        pdf_lineto($pdf, $radius, 0.0);
        pdf_stroke($pdf);
        pdf_restore($pdf);

        /* draw little circle at center */
        pdf_circle($pdf, 0, 0, $radius/30);
        pdf_fill($pdf);

        pdf_restore($pdf);

        pdf_end_page($pdf);

        # to see some difference
        sleep(1);
    }

    pdf_close($pdf);

    $buf = pdf_get_buffer($pdf);
    $len = strlen($buf);

    header("Content-type: application/pdf");
    header("Content-Length: $len");
    header("Content-Disposition: inline; filename=foo.pdf");
    print $buf;

    pdf_delete($pdf);
    ?>

Prev | Home | Next
overload | Up | pdf_add_annotation