Re: Web Reporting Tools

From: Denis <star-dragon_at_usa.net>
Date: Mon, 09 Aug 1999 10:02:30 +0400
Message-ID: <37AE6EF6.4D904574_at_usa.net>


Carfield Yim wrote:
>
> Can you tell more about how to output to .pdf

I not use output to pdf in real project,but may write part readme from PHP doc:
( Sorry, if very big write. )



You can use the PDF functions in PHP to create PDF files if you have the PDF library by Thomas Merz (available at http://www.ifconnection.de/~tm/). Please consult the excelent documentation for pdflib shipped with the source distribution of pdflib or available at
http://www.ifconnection.de/~tm/software/pdflib/PDFlib-0.6.pdf. It
provides a very good overview of what pdflib capable of doing. Most of
the functions in pdflib and the PHP module have the same name. The
parameters are also identical. You should also understand some of the concepts of PDF or Postscript to efficiently use this module. 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.
There is another PHP module for pdf document creation based on FastIO's ClibPDF. It has a slightly different API. Check the ClibPDF functions section for details.
Currently two versions of pdflib are supported: 0.6 and 2.0. It is recommended that you use the newer version since it has more features and fixes some problems which required a patch for the old version. Unfortunately, the changes of the pdflib API in 2.0 have been so severe that even some PHP functions had to be altered. Here is a list of changes:
The Info structure does not exist anymore. Therefore the function
pdf_get_info() is obsolete and the functions pdf_set_info_creator(),
pdf_set_info_title(), pdf_set_info_author(), pdf_set_info_subject() and
pdf_set_info_keywords() do not take the info structure as the first
parameter but the pdf document. This also means that the pdf document must be opened before these functions can be called. The way a new document is opened has changed. The function pdf_open() takes only one parameter which is the file handle of a file opened with fopen().
The pdf module introduces two new types of variables (if pdflib 2.0 is used it is only one new type). They are called pdfdoc and pdfinfo (pdfinfo is not existent if pdflib 2.0 is used. pdfdoc is a pointer to a pdf document and almost all functions need it as its first parameter. pdfinfo contains meta data about the PDF document. It has to be set before pdf_open() is called.
In order to output text into a PDF document you will need to provide the afm file for each font. Afm files contain font metrics for a Postscript font. By default these afm files are searched for in a directory named 'fonts' relative to the directory where the PHP script is located. (Again, this was true for pdflib 0.6, newer versions do not not neccessarily need the afm files.)
Most of the functions are fairly easy to use. The most difficult part is probably to create a very simple pdf document at all. The following example should help to get started. It uses the PHP functions for pdflib 0.6. It creates the file test.pdf with one page. The page contains the text "Times-Roman" in an outlined 30pt font. The text is also underlined.
Example 1. Creating a PDF document with pdflib 0.6 <?php
$fp = fopen("test.pdf", "w");
$info = PDF_get_info();
pdf_set_info_author($info, "Uwe Steinmann");
PDF_set_info_title($info, "Test for PHP wrapper of PDFlib 0.6");
PDF_set_info_author($info, "Name of Author");
pdf_set_info_creator($info, "See Author");
pdf_set_info_subject($info, "Testing");

$pdf = PDF_open($fp, $info);
PDF_begin_page($pdf, 595, 842);
PDF_add_outline($pdf, "Page 1");
pdf_set_font($pdf, "Times-Roman", 30, 4);
pdf_set_text_rendering($pdf, 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);

fclose($fp);
echo "<A HREF=getpdf.php3>finished</A>"; ?>    

 The PHP script getpdf.php3 just outputs the pdf document. <?php
$fp = fopen("test.pdf", "r");

header("Content-type: application/pdf"); fpassthru($fp);
fclose($fp);
?>

     Doing the same with pdflib 2.0 looks like the following: Example 2. Creating a PDF document with pdflib 2.0 <?php
$fp = fopen("test.pdf", "w");
$pdf = PDF_open($fp);

pdf_set_info_author($pdf, "Uwe Steinmann");
PDF_set_info_title($pdf, "Test for PHP wrapper of PDFlib 2.0");
PDF_set_info_author($pdf, "Name of Author");
pdf_set_info_creator($pdf, "See Author");
pdf_set_info_subject($pdf, "Testing");
PDF_begin_page($pdf, 595, 842);
PDF_add_outline($pdf, "Page 1");
pdf_set_font($pdf, "Times-Roman", 30, 4);
pdf_set_text_rendering($pdf, 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);

fclose($fp);
echo "<A HREF=getpdf.php3>finished</A>"; ?>     

The PHP script getpdf.php3 is the same as above. The pdflib distribution contains a more complex example which creates a serious of pages with an analog clock. This example converted into PHP using pdflib 2.0 looks as the following (you can see the same example in the documentation for the clibpdf module): Example 3. pdfclock example from pdflib 2.0 distribution <?php
$pdffilename = "clock.pdf";
$radius = 200;
$margin = 20;
$pagecount = 40;

$fp = fopen($pdffilename, "w");
$pdf = pdf_open($fp);

pdf_set_info_creator($pdf, "pdf_clock.php3");
pdf_set_info_author($pdf, "Uwe Steinmann");
pdf_set_info_title($pdf, "Analog Clock");

while($pagecount-- > 0) {

    pdf_begin_page($pdf, 2 * ($radius + $margin), 2 * ($radius +
$margin));

    pdf_set_transition($pdf, 4); /* wipe */     pdf_set_duration($pdf, 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);
}

$pdf = pdf_close($pdf);

fclose($fp);
echo "<A HREF=getpdf.php3?filename=".$pdffilename.">finished</A>"; ?>     

The PHP script getpdf.php3 just outputs the pdf document. <?php
$fp = fopen($filename, "r");

header("Content-type: application/pdf"); fpassthru($fp);
fclose($fp);
?>      

Table of Contents

PDF_get_info  Returns a default info structure for a pdf document
PDF_set_info_creator  Fills the creator field of the info structure
PDF_set_info_title  Fills the title field of the info structure
PDF_set_info_subject  Fills the subject field of the info structure
PDF_set_info_keywords  Fills the keywords field of the info structure
PDF_set_info_author  Fills the author field of the info structure
PDF_open  Opens a new pdf document
PDF_close  Closes a pdf document
PDF_begin_page  Starts new page
PDF_end_page  Ends a page
PDF_show  Output text at current position
PDF_show_xy  Output text at given position
PDF_set_font  Selects a font face and size
PDF_set_leading  Sets distance between text lines
PDF_set_text_rendering  Determines how text is rendered
PDF_set_horiz_scaling  Sets horizontal scaling of text
PDF_set_text_rise  Sets the text rise
PDF_set_text_matrix  Sets the text matrix
PDF_set_text_pos  Sets text position
PDF_set_char_spacing  Sets character spacing
PDF_set_word_spacing  Sets spacing between words
PDF_continue_text  Outputs text in next line
PDF_stringwidth  Returns width of text using current font
PDF_save  Saves the current environment
PDF_restore  Restores formerly saved environment
PDF_translate  Sets origin of coordinate system
PDF_scale  Sets scaling
PDF_rotate  Sets rotation
PDF_setflat  Sets flatness
PDF_setlinejoin  Sets linejoin parameter
PDF_setlinecap  Sets linecap parameter
PDF_setmiterlimit  Sets miter limit
PDF_setlinewidth  Sets line width
PDF_setdash  Sets dash pattern
PDF_moveto  Sets current point
PDF_curveto  Draws a curve
PDF_lineto  Draws a line
PDF_circle  Draws a circle
PDF_arc  Draws an arc
PDF_rect  Draws a rectangle
PDF_closepath  Closes path
PDF_stroke  Draws line along path
PDF_closepath_stroke  Closes path and draws line along path
PDF_fill  Fills current path
PDF_fill_stroke  Fills and strokes current path
PDF_closepath_fill_stroke  Closes, fills and strokes current path
PDF_endpath  Ends current path
PDF_clip  Clips to current path
PDF_setgray_fill  Sets filling color to gray value
PDF_setgray_stroke  Sets drawing color to gray value
PDF_setgray  Sets drawing and filling color to gray value
PDF_setrgbcolor_fill  Sets filling color to rgb color value
PDF_setrgbcolor_stroke  Sets drawing color to rgb color value
PDF_setrgbcolor  Sets drawing and filling color to rgb color value
PDF_add_outline  Adds bookmark for current page
PDF_set_transition  Sets transition between pages
PDF_set_duration  Sets duration between pages
PDF_open_gif  Opens a GIF image
PDF_open_memory_image  Opens an image created with PHP's image
functions
PDF_open_jpeg  Opens a JPEG image
PDF_close_image  Closes an image
PDF_place_image  Places an image on the page
PDF_put_image  Stores an image in the PDF for later use
PDF_execute_image  Places a stored image on the page
----------------------------------------------------------------------------------------------
> Denis wrote:
> 
> > sja wrote:
> > >
> > > I am currently investigating tools for the generation of reports from
> > > multiple databases to an Intranet. If anybody knows of a suitable tool or
> > > better still has any personal experience of a suitable tool, I would be
> > > grateful for your input. Evaluations and links most welcome.
> > >
> > > Please copy any responses to sja_at_tinet.ie
> > >
> > We use Apache www server and PHP modules. PHP is a server-side
> > HTML-embedded scripting language.Connect to Oracle,DBASE,Sybase.Output
> > format txt,dbf,pdf,html.
> >
> >                                 Denis (star-dragon_at_usa.net)
Received on Mon Aug 09 1999 - 08:02:30 CEST

Original text of this message