home *** CD-ROM | disk | FTP | other *** search
- <?php
- /* $Id: fpdf.php,v 2.1 2003/11/20 16:31:51 garvinhicking Exp $ */
- // vim: expandtab sw=4 ts=4 sts=4:
-
- /****************************************************************************
- * Software : FPDF *
- * Version : 1.51 *
- * Date : 2002/08/03 *
- * Author : Olivier PLATHEY *
- * Website : http://www.fpdf.org *
- * Licence : Freeware *
- * *
- * You are entitled to modify this soft as you want to. *
- ****************************************************************************/
-
-
- $FPDF_version = (string) '1.51';
-
-
- /**
- * The FPDF class
- */
- class FPDF
- {
- /**
- * Defines private properties
- */
- var $page; // current page number
- var $n; // current object number
- var $offsets; // array of object offsets
- var $buffer; // buffer holding in-memory PDF
- var $pages; // array containing pages
- var $state; // current document state
- var $compress; // compression flag
- var $DefOrientation; // default orientation
- var $CurOrientation; // current orientation
- var $OrientationChanges; // array indicating orientation changes
- var $fwPt, $fhPt; // dimensions of page format in points
- var $fw, $fh; // dimensions of page format in user unit
- var $wPt, $hPt; // current dimensions of page in points
- var $k; // scale factor (number of points in user unit)
- var $w, $h; // current dimensions of page in user unit
- var $lMargin; // left margin
- var $tMargin; // top margin
- var $rMargin; // right margin
- var $bMargin; // page break margin
- var $cMargin; // cell margin
- var $x, $y; // current position in user unit for cell positionning
- var $lasth; // height of last cell printed
- var $LineWidth; // line width in user unit
- var $CoreFonts; // array of standard font names
- var $fonts; // array of used fonts
- var $FontFiles; // array of font files
- var $diffs; // array of encoding differences
- var $images; // array of used images
- var $PageLinks; // array of links in pages
- var $links; // array of internal links
- var $FontFamily; // current font family
- var $FontStyle; // current font style
- var $CurrentFont; // current font info
- var $FontSizePt; // current font size in points
- var $FontSize; // current font size in user unit
- var $DrawColor; // commands for drawing color
- var $FillColor; // commands for filling color
- var $TextColor; // commands for text color
- var $ColorFlag; // indicates whether fill and text colors are different
- var $ws; // word spacing
- var $underline; // whether underline is current state or not
- var $AutoPageBreak; // automatic page breaking
- var $PageBreakTrigger; // threshold used to trigger page breaks
- var $InFooter; // flag set when processing footer
- var $ZoomMode; // zoom display mode
- var $LayoutMode; // layout display mode
- var $title; // title
- var $subject; // subject
- var $author; // author
- var $keywords; // keywords
- var $creator; // creator
- var $AliasNbPages; // alias for total number of pages
-
-
-
- /**************************************************************************
- * *
- * Public methods below are used by some private ones. Then they *
- * are placed at the top of the class. *
- * *
- **************************************************************************/
-
- /**
- * Gets the width of a string in the current font
- *
- * @param string The string to check
- *
- * @return double The string width
- *
- * @access public
- */
- function GetStringWidth($s)
- {
- $s = (string) $s;
- // loic1: PHP3 compatibility
- // $cw = &$this->CurrentFont['cw'];
- $w = 0;
- $l = strlen($s);
- for ($i = 0; $i < $l; $i++) {
- // $w += $cw[$s[$i]];
- $w += $this->CurrentFont['cw'][$s[$i]];
- } // end for
-
- return $w * $this->FontSize / 1000;
- } // end of the "GetStringWidth()" method
-
-
- /**
- * Displays an error message then exists
- *
- * @param string The error message
- *
- * @access public
- */
- function Error($msg)
- {
- die('<b>FPDF error: </b>' . $msg);
- } // end of the "Error()" method
-
-
-
- /**************************************************************************
- * *
- * Private methods *
- * *
- **************************************************************************/
-
- /**
- * Adds a line to the document
- *
- * @param string The string to add
- *
- * @access private
- */
- function _out($s)
- {
- if ($this->state == 2) {
- $this->pages[$this->page] .= $s . "\n";
- } else {
- $this->buffer .= $s . "\n";
- }
- } // end of the "_out()" method
-
-
- /**
- * Starts a new object
- *
- * @access private
- */
- function _newobj()
- {
- $this->n++;
- $this->offsets[$this->n] = strlen($this->buffer);
- $this->_out($this->n . ' 0 obj');
- } // end of the "_newobj()" method
-
-
- /**
- * Adds a "\" before "\", "(" and ")" characters
- *
- * @param string The string to slash
- *
- * @return integer The slashed string
- *
- * @access private
- */
- function _escape($s)
- {
- return str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $s)));
- } // end of the "_escape()" method
-
-
- /**
- * Formats a text stringrs
- *
- * @param string The string to format
- *
- * @return integer The formatted string
- *
- * @access private
- *
- * @see _escape()
- */
- function _textstring($s)
- {
- return '(' . $this->_escape($s) . ')';
- } // end of the "_textstring()" method
-
-
- /**
- * Outputs a stream
- *
- * @param string The stream to ouput
- *
- * @access private
- *
- * @see _out()
- */
- function _putstream($s)
- {
- $this->_out('stream');
- $this->_out($s);
- $this->_out('endstream');
- } // end of the "_putstream()" method
-
-
- /**
- * Starts document
- *
- * @access private
- */
- function _begindoc()
- {
- $this->state = 1;
- $this->_out('%PDF-1.3');
- } // end of the "_begindoc()" method
-
-
- /**
- * Puts pages
- *
- * @access private
- */
- function _putpages()
- {
- $nb = $this->page;
-
- if (!empty($this->AliasNbPages)) {
- // Replaces number of pages
- for ($n = 1; $n <= $nb; $n++) {
- $this->pages[$n] = str_replace($this->AliasNbPages, $nb, $this->pages[$n]);
- }
- }
- if ($this->DefOrientation == 'P') {
- $wPt = $this->fwPt;
- $hPt = $this->fhPt;
- } else {
- $wPt = $this->fhPt;
- $hPt = $this->fwPt;
- }
- $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
-
- for ($n=1; $n <= $nb; $n++) {
- // Page
- $this->_newobj();
- $this->_out('<</Type /Page');
- $this->_out('/Parent 1 0 R');
- if (isset($this->OrientationChanges[$n])) {
- $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]', $hPt, $wPt));
- }
- $this->_out('/Resources 2 0 R');
- if (isset($this->PageLinks[$n])) {
- // Links
- $annots = '/Annots [';
- reset($this->PageLinks[$n]);
- while (list(, $pl) = each($this->PageLinks[$n])) {
- $rect = sprintf('%.2f %.2f %.2f %.2f', $pl[0], $pl[1], $pl[0] + $pl[2], $pl[1] - $pl[3]);
- $annots .= '<</Type /Annot /Subtype /Link /Rect [' . $rect . '] /Border [0 0 0] ';
- if (is_string($pl[4])) {
- $annots .= '/A <</S /URI /URI ' . $this->_textstring($pl[4]) . '>>>>';
- }
- else {
- $l = $this->links[$pl[4]];
- $h = isset($this->OrientationChanges[$l[0]]) ? $wPt : $hPt;
- $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>', 1 + 2 * $l[0], $h - $l[1] * $this->k);
- }
- } // end while
- $this->_out($annots . ']');
- } // end if
- $this->_out('/Contents ' . ($this->n+1).' 0 R>>');
- $this->_out('endobj');
-
- // Page content
- $p = ($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
- $this->_newobj();
- $this->_out('<<' . $filter . '/Length ' . strlen($p) . '>>');
- $this->_putstream($p);
- $this->_out('endobj');
- } // end for
-
- // Pages root
- $this->offsets[1]=strlen($this->buffer);
- $this->_out('1 0 obj');
- $this->_out('<</Type /Pages');
- $kids = '/Kids [';
- for ($i = 0; $i < $nb; $i++) {
- $kids .= (3 + 2 * $i) . ' 0 R ';
- }
- $this->_out($kids . ']');
- $this->_out('/Count ' . $nb);
- $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]', $wPt, $hPt));
- $this->_out('>>');
- $this->_out('endobj');
- } // end of the "_putpages()" method
-
-
- /**
- * Puts font faces
- *
- * @access private
- */
- function _putfonts()
- {
- $nf = $this->n;
-
- foreach($this->diffs AS $diff) {
- // Encodings
- $this->_newobj();
- $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [' . $diff . ']>>');
- $this->_out('endobj');
- } // end while
-
- $mqr = get_magic_quotes_runtime();
- set_magic_quotes_runtime(0);
-
- foreach($this->FontFiles AS $file => $info) {
- // Font file embedding
- $this->_newobj();
- $this->FontFiles[$file]['n'] = $this->n;
- if (isset($GLOBALS['FPDF_font_path'])) {
- $file = $GLOBALS['FPDF_font_path'] . $file;
- }
- $size = filesize($file);
- if (!$size) {
- $this->Error('Font file not found');
- }
- $this->_out('<</Length ' . $size);
- if (substr($file, -2) == '.z') {
- $this->_out('/Filter /FlateDecode');
- }
- $this->_out('/Length1 ' . $info['length1']);
- if (isset($info['length2'])) {
- $this->_out('/Length2 ' . $info['length2'] . ' /Length3 0');
- }
- $this->_out('>>');
- $f = fopen($file, 'rb');
- $this->_putstream(fread($f, $size));
- fclose($f);
- $this->_out('endobj');
- } // end while
- set_magic_quotes_runtime($mqr);
-
- foreach($this->fonts AS $k => $font) {
- // Font objects
- $this->_newobj();
- $this->fonts[$k]['n'] = $this->n;
- $name = $font['name'];
- $this->_out('<</Type /Font');
- $this->_out('/BaseFont /' . $name);
- if ($font['type'] == 'core') {
- // Standard font
- $this->_out('/Subtype /Type1');
- if ($name != 'Symbol' && $name != 'ZapfDingbats') {
- $this->_out('/Encoding /WinAnsiEncoding');
- }
- }
- else {
- // Additional font
- $this->_out('/Subtype /' . $font['type']);
- $this->_out('/FirstChar 32');
- $this->_out('/LastChar 255');
- $this->_out('/Widths ' . ($this->n + 1) . ' 0 R');
- $this->_out('/FontDescriptor ' . ($this->n + 2) . ' 0 R');
- if ($font['enc']) {
- if (isset($font['diff'])) {
- $this->_out('/Encoding ' . ($nf + $font['diff']) . ' 0 R');
- } else {
- $this->_out('/Encoding /WinAnsiEncoding');
- }
- }
- } // end if... else...
- $this->_out('>>');
- $this->_out('endobj');
- if ($font['type'] != 'core') {
- // Widths
- $this->_newobj();
- $s = '[';
- for ($i = 32; $i <= 255; $i++) {
- $s .= $font['cw'][chr($i)] . ' ';
- }
- $this->_out($s . ']');
- $this->_out('endobj');
- // Descriptor
- $this->_newobj();
- $s = '<</Type /FontDescriptor /FontName /' . $name;
- foreach($font['desc'] AS $k => $v) {
- $s .= ' /' . $k . ' ' . $v;
- }
- $file = $font['file'];
- if ($file) {
- $s .= ' /FontFile' . ($font['type'] == 'Type1' ? '' : '2') . ' ' . $this->FontFiles[$file]['n'] . ' 0 R';
- }
- $this->_out($s . '>>');
- $this->_out('endobj');
- } // end if
- } // end while
- } // end of the "_putfonts()" method
-
-
- /**
- * Puts images
- *
- * @access private
- */
- function _putimages()
- {
- $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
-
- foreach($this->images AS $file => $info) {
- $this->_newobj();
- $this->images[$file]['n'] = $this->n;
- $this->_out('<</Type /XObject');
- $this->_out('/Subtype /Image');
- $this->_out('/Width ' . $info['w']);
- $this->_out('/Height ' . $info['h']);
- if ($info['cs'] == 'Indexed') {
- $this->_out('/ColorSpace [/Indexed /DeviceRGB ' . (strlen($info['pal'])/ 3 - 1) . ' ' . ($this->n + 1) . ' 0 R]');
- }
- else {
- $this->_out('/ColorSpace /' . $info['cs']);
- if ($info['cs'] == 'DeviceCMYK') {
- $this->_out('/Decode [1 0 1 0 1 0 1 0]');
- }
- } // end if... else...
- $this->_out('/BitsPerComponent ' . $info['bpc']);
- $this->_out('/Filter /' . $info['f']);
- if (isset($info['parms'])) {
- $this->_out($info['parms']);
- }
- if (isset($info['trns']) && is_array($info['trns'])) {
- $trns = '';
- $trns_cnt = count($info['trns']);
- for ($i = 0; $i < $trns_cnt; $i++) {
- $trns .= $info['trns'][$i] . ' ' . $info['trns'][$i] . ' ';
- }
- $this->_out('/Mask [' . $trns . ']');
- } // end if
- $this->_out('/Length ' . strlen($info['data']) . '>>');
- $this->_putstream($info['data']);
- $this->_out('endobj');
-
- // Palette
- if ($info['cs'] == 'Indexed') {
- $this->_newobj();
- $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal'];
- $this->_out('<<' . $filter . '/Length ' . strlen($pal) . '>>');
- $this->_putstream($pal);
- $this->_out('endobj');
- } // end if
- } // end while
- } // end of the "_putimages()" method
-
-
- /**
- * Puts resources
- *
- * @access private
- */
- function _putresources()
- {
- $this->_putfonts();
- $this->_putimages();
- // Resource dictionary
- $this->offsets[2] = strlen($this->buffer);
- $this->_out('2 0 obj');
- $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
- $this->_out('/Font <<');
- foreach($this->fonts AS $font) {
- $this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
- }
- $this->_out('>>');
- if (count($this->images)) {
- $this->_out('/XObject <<');
- foreach($this->images AS $image) {
- $this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
- }
- $this->_out('>>');
- }
- $this->_out('>>');
- $this->_out('endobj');
- } // end of the "_putresources()" method
-
-
- /**
- * Puts document informations
- *
- * @access private
- */
- function _putinfo()
- {
- // loic1: PHP3 compatibility
- // $this->_out('/Producer ' . $this->_textstring('FPDF ' . FPDF_VERSION));
- $this->_out('/Producer ' . $this->_textstring('FPDF ' . $GLOBALS['FPDF_version']));
- if (!empty($this->title)) {
- $this->_out('/Title ' . $this->_textstring($this->title));
- }
- if (!empty($this->subject)) {
- $this->_out('/Subject ' . $this->_textstring($this->subject));
- }
- if (!empty($this->author)) {
- $this->_out('/Author ' . $this->_textstring($this->author));
- }
- if (!empty($this->keywords)) {
- $this->_out('/Keywords ' . $this->_textstring($this->keywords));
- }
- if (!empty($this->creator)) {
- $this->_out('/Creator ' . $this->_textstring($this->creator));
- }
- $this->_out('/CreationDate ' . $this->_textstring('D:' . date('YmdHis')));
- } // end of the "_putinfo()" method
-
-
- /**
- * Puts catalog informations
- *
- * @access private
- */
- function _putcatalog()
- {
- $this->_out('/Type /Catalog');
- $this->_out('/Pages 1 0 R');
- if ($this->ZoomMode == 'fullpage') {
- $this->_out('/OpenAction [3 0 R /Fit]');
- } else if ($this->ZoomMode == 'fullwidth') {
- $this->_out('/OpenAction [3 0 R /FitH null]');
- } else if ($this->ZoomMode == 'real') {
- $this->_out('/OpenAction [3 0 R /XYZ null null 1]');
- } else if (!is_string($this->ZoomMode)) {
- $this->_out('/OpenAction [3 0 R /XYZ null null ' . ($this->ZoomMode / 100) . ']');
- }
- if ($this->LayoutMode == 'single') {
- $this->_out('/PageLayout /SinglePage');
- } else if ($this->LayoutMode == 'continuous') {
- $this->_out('/PageLayout /OneColumn');
- } else if ($this->LayoutMode == 'two') {
- $this->_out('/PageLayout /TwoColumnLeft');
- }
- } // end of the "_putcatalog()" method
-
-
- /**
- * Puts trailer
- *
- * @access private
- */
- function _puttrailer()
- {
- $this->_out('/Size ' . ($this->n + 1));
- $this->_out('/Root ' . $this->n . ' 0 R');
- $this->_out('/Info ' . ($this->n - 1) . ' 0 R');
- } // end of the "_puttrailer()" method
-
-
- /**
- * Terminates document
- *
- * @access private
- */
- function _enddoc()
- {
- $this->_putpages();
- $this->_putresources();
-
- // Info
- $this->_newobj();
- $this->_out('<<');
- $this->_putinfo();
- $this->_out('>>');
- $this->_out('endobj');
-
- // Catalog
- $this->_newobj();
- $this->_out('<<');
- $this->_putcatalog();
- $this->_out('>>');
- $this->_out('endobj');
-
- // Cross-ref
- $o = strlen($this->buffer);
- $this->_out('xref');
- $this->_out('0 ' . ($this->n + 1));
- $this->_out('0000000000 65535 f ');
- for ($i = 1; $i <= $this->n; $i++) {
- $this->_out(sprintf('%010d 00000 n ', $this->offsets[$i]));
- }
-
- // Trailer
- $this->_out('trailer');
- $this->_out('<<');
- $this->_puttrailer();
- $this->_out('>>');
- $this->_out('startxref');
- $this->_out($o);
- $this->_out('%%EOF');
- $this->state=3;
- } // end of the "_enddoc()" method
-
-
- /**
- * Starts a new page
- *
- * @param string The page orientation
- *
- * @access private
- */
- function _beginpage($orientation)
- {
- $this->page++;
- $this->pages[$this->page] = '';
- $this->state = 2;
- $this->x = $this->lMargin;
- $this->y = $this->tMargin;
- $this->lasth = 0;
- $this->FontFamily = '';
-
- // Page orientation
- if (!$orientation) {
- $orientation = $this->DefOrientation;
- } else {
- $orientation = strtoupper($orientation[0]);
- }
- if ($orientation != $this->DefOrientation) {
- $this->OrientationChanges[$this->page] = TRUE;
- }
- if ($orientation != $this->CurOrientation) {
- // Changes orientation
- if ($orientation == 'P') {
- $this->wPt = $this->fwPt;
- $this->hPt = $this->fhPt;
- $this->w = $this->fw;
- $this->h = $this->fh;
- }
- else {
- $this->wPt = $this->fhPt;
- $this->hPt = $this->fwPt;
- $this->w = $this->fh;
- $this->h = $this->fw;
- }
- $this->PageBreakTrigger = $this->h - $this->bMargin;
- $this->CurOrientation = $orientation;
- } // end if
- } // end of the "_beginpage()" method
-
-
- /**
- * Ends page contents
- *
- * @access private
- */
- function _endpage()
- {
- $this->state=1;
- } // end of the "_endpage()" method
-
-
- /**
- * Underlines text
- *
- * @param double The x position
- * @param double The y position
- * @param string The text
- *
- * @return string The underlined text
- *
- * @access private
- */
- function _dounderline($x,$y,$txt)
- {
- $up = $this->CurrentFont['up'];
- $ut = $this->CurrentFont['ut'];
- $w = $this->GetStringWidth($txt) + $this->ws * substr_count($txt, ' ');
-
- return sprintf('%.2f %.2f %.2f %.2f re f', $x * $this->k, ($this->h - ($y - $up / 1000 * $this->FontSize)) * $this->k, $w * $this->k, -$ut / 1000 * $this->FontSizePt);
- } // end of the "_dounderline()" method
-
-
- /**
- * Extracts info from a JPEG file
- *
- * @param string The file name and path
- *
- * @return array The images informations
- *
- * @access private
- */
- function _parsejpg($file)
- {
- $a = GetImageSize($file);
- if (!$a) {
- $this->Error('Missing or incorrect image file: ' . $file);
- }
- if ($a[2] != 2) {
- $this->Error('Not a JPEG file: ' . $file);
- }
- if (!isset($a['channels']) || $a['channels'] == 3) {
- $colspace = 'DeviceRGB';
- }
- else if($a['channels'] == 4) {
- $colspace = 'DeviceCMYK';
- }
- else {
- $colspace = 'DeviceGray';
- }
- $bpc = isset($a['bits']) ? $a['bits'] : 8;
-
- // Reads whole file
- $f = fopen($file, 'rb');
- $data = fread($f, filesize($file));
- fclose($f);
-
- return array('w' => $a[0],
- 'h' => $a[1],
- 'cs' => $colspace,
- 'bpc' => $bpc,
- 'f' => 'DCTDecode',
- 'data' => $data);
- } // end of the "_parsejpg()" method
-
-
- /**
- * Reads a 4-byte integer from a file
- *
- * @param string The file name and path
- *
- * @return integer The 4-byte integer
- *
- * @access private
- *
- * @see _parsepng()
- */
- function _freadint($f)
- {
- $i = ord(fread($f, 1)) << 24;
- $i += ord(fread($f, 1)) << 16;
- $i += ord(fread($f, 1)) << 8;
- $i += ord(fread($f, 1));
-
- return $i;
- } // end of the "_freadint()" method
-
-
- /**
- * Extracts info from a PNG file
- *
- * @param string The file name and path
- *
- * @return array The images informations
- *
- * @access private
- *
- * @see _freadint()
- */
- function _parsepng($file)
- {
- $f = fopen($file, 'rb');
- if (!$f) {
- $this->Error('Can\'t open image file: ' . $file);
- }
-
- // Checks signature
- if (fread($f, 8) != chr(137) . 'PNG' . chr(13) . chr(10) . chr(26) . chr(10)) {
- $this->Error('Not a PNG file: ' . $file);
- }
-
- // Reads header chunk
- fread($f,4);
- if (fread($f, 4) != 'IHDR') {
- $this->Error('Incorrect PNG file: ' . $file);
- }
- $w = $this->_freadint($f);
- $h = $this->_freadint($f);
- $bpc = ord(fread($f,1));
- if ($bpc > 8) {
- $this->Error('16-bit depth not supported: ' . $file);
- }
- $ct = ord(fread($f, 1));
- if ($ct == 0) {
- $colspace = 'DeviceGray';
- }
- else if ($ct == 2) {
- $colspace = 'DeviceRGB';
- }
- else if ($ct == 3) {
- $colspace = 'Indexed';
- }
- else {
- $this->Error('Alpha channel not supported: ' . $file);
- }
- if (ord(fread($f, 1)) != 0) {
- $this->Error('Unknown compression method: ' . $file);
- }
- if (ord(fread($f, 1)) != 0) {
- $this->Error('Unknown filter method: ' . $file);
- }
- if (ord(fread($f, 1)) != 0) {
- $this->Error('Interlacing not supported: ' . $file);
- }
- fread($f, 4);
- $parms = '/DecodeParms <</Predictor 15 /Colors ' . ($ct == 2 ? 3 : 1)
- . ' /BitsPerComponent ' . $bpc
- . ' /Columns ' . $w . '>>';
-
- // Scans chunks looking for palette, transparency and image data
- $pal = '';
- $trns = '';
- $data = '';
- do {
- $n = $this->_freadint($f);
- $type = fread($f, 4);
- if ($type == 'PLTE') {
- // Reads palette
- $pal = fread($f, $n);
- fread($f, 4);
- }
- else if ($type == 'tRNS') {
- // Reads transparency info
- $t = fread($f, $n);
- if ($ct == 0) {
- $trns = array(ord(substr($t, 1, 1)));
- }
- else if ($ct == 2) {
- $trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1)));
- }
- else {
- $pos = strpos(' ' . $t, chr(0));
- if ($pos) {
- $trns = array($pos - 1);
- }
- fread($f,4);
- } // end if... else if... else
- }
- else if ($type == 'IDAT') {
- // Reads image data block
- $data .= fread($f, $n);
- fread($f, 4);
- }
- else if ($type == 'IEND') {
- break;
- }
- else {
- fread($f, $n + 4);
- } // end if... else if... else
- } while($n); // end do
-
- if ($colspace == 'Indexed' && empty($pal)) {
- $this->Error('Missing palette in ' . $file);
- }
- fclose($f);
-
- return array('w' => $w,
- 'h' => $h,
- 'cs' => $colspace,
- 'bpc' => $bpc,
- 'f' => 'FlateDecode',
- 'parms' => $parms,
- 'pal' => $pal,
- 'trns' => $trns,
- 'data' => $data);
- } // end of the "_parsepng()" method
-
-
-
- /**************************************************************************
- * *
- * Public methods *
- * *
- **************************************************************************/
-
- /**
- * Sets auto page break mode and triggering margin
- *
- * @param string The auto page break mode
- * @param double Maximum size till the bottom of the page to start adding
- * page break
- *
- * @access public
- */
- function SetAutoPageBreak($auto, $margin = 0)
- {
- $this->AutoPageBreak = $auto;
- $this->bMargin = $margin;
- $this->PageBreakTrigger = $this->h - $margin;
- } // end of the "SetAutoPageBreak()" method
-
-
- /**
- * Sets display mode in viewer
- *
- * @param mixed The zoom mode (fullpage, fullwidth, real, default,
- * zoom or an zoom factor -real-)
- * @param string The layout mode (single, continuous, two or default)
- *
- * @access public
- */
- function SetDisplayMode($zoom = 'default', $layout = 'continuous')
- {
- if (is_string($zoom)) {
- $zoom = strtolower($zoom);
- }
- $layout = strtolower($layout);
-
- // Zoom mode
- if ($zoom == 'fullpage' || $zoom == 'fullwidth' || $zoom == 'real' || $zoom == 'default'
- || !is_string($zoom)) {
- $this->ZoomMode = $zoom;
- } else if ($zoom == 'zoom') {
- $this->ZoomMode = $layout;
- } else {
- $this->Error('Incorrect zoom display mode: ' . $zoom);
- } // end if... else if... else...
-
- // Layout mode
- if ($layout == 'single' || $layout == 'continuous' || $layout=='two' || $layout=='default') {
- $this->LayoutMode = $layout;
- } else if ($zoom != 'zoom') {
- $this->Error('Incorrect layout display mode: ' . $layout);
- } // end if... else if...
- } // end of the "SetDisplayMode()" method
-
-
- /**
- * Sets page compression
- *
- * @param boolean whether to compress file or not
- *
- * @access public
- */
- function SetCompression($compress)
- {
- if (function_exists('gzcompress')) {
- $this->compress = $compress;
- } else {
- $this->compress = FALSE;
- } // end if... else...
- } // end of the "SetCompression()" method
-
-
- /**
- * Sets page margins
- *
- * @param double The left margin
- * @param double The top margin
- * @param double The right margin
- *
- * @access public
- */
- function SetMargins($left, $top, $right = -1)
- {
- $this->lMargin = $left;
- $this->tMargin = $top;
- if ($right == -1) {
- $right = $left;
- }
- $this->rMargin = $right;
- } // end of the "SetMargins()" method
-
-
- /**
- * The FPDF constructor
- *
- * @param string The page orientation (p, portrait, l or landscape)
- * @param string The unit for sizes (pt, mm, cm or in)
- * @param mixed The page format (A3, A4, A5, letter, legal or an array
- * with page sizes)
- *
- * @access public
- */
- function FPDF($orientation = 'P', $unit = 'mm', $format = 'A4')
- {
- // Check for PHP locale-related bug
- if (1.1 == 1) {
- $this->Error('Don\'t call setlocale() before including class file');
- }
-
- // Initialization of properties
- $this->page = 0;
- $this->n = 2;
- $this->buffer = '';
- $this->pages = array();
- $this->OrientationChanges = array();
- $this->state = 0;
- $this->fonts = array();
- $this->FontFiles = array();
- $this->diffs = array();
- $this->images = array();
- $this->links = array();
- $this->InFooter = FALSE;
- $this->FontFamily = '';
- $this->FontStyle = '';
- $this->FontSizePt = 12;
- $this->underline = FALSE;
- $this->DrawColor = '0 G';
- $this->FillColor = '0 g';
- $this->TextColor = '0 g';
- $this->ColorFlag = FALSE;
- $this->ws = 0;
-
- // Standard fonts
- $this->CoreFonts['courier'] = 'Courier';
- $this->CoreFonts['courierB'] = 'Courier-Bold';
- $this->CoreFonts['courierI'] = 'Courier-Oblique';
- $this->CoreFonts['courierBI'] = 'Courier-BoldOblique';
- $this->CoreFonts['helvetica'] = 'Helvetica';
- $this->CoreFonts['helveticaB'] = 'Helvetica-Bold';
- $this->CoreFonts['helveticaI'] = 'Helvetica-Oblique';
- $this->CoreFonts['helveticaBI'] = 'Helvetica-BoldOblique';
- $this->CoreFonts['times'] = 'Times-Roman';
- $this->CoreFonts['timesB'] = 'Times-Bold';
- $this->CoreFonts['timesI'] = 'Times-Italic';
- $this->CoreFonts['timesBI'] = 'Times-BoldItalic';
- $this->CoreFonts['symbol'] = 'Symbol';
- $this->CoreFonts['zapfdingbats'] = 'ZapfDingbats';
-
- // Scale factor
- if ($unit == 'pt') {
- $this->k = 1;
- } else if ($unit == 'mm') {
- $this->k = 72/25.4;
- } else if ($unit == 'cm') {
- $this->k = 72/2.54;
- } else if ($unit == 'in') {
- $this->k = 72;
- } else {
- $this->Error('Incorrect unit: ' . $unit);
- } // end if... else if... else...
-
- // Page format
- if (is_string($format)) {
- // 2002-07-24 - Nicola Asuni (info@tecnick.com)
- // Added new page formats (45 standard ISO paper formats and 4
- // american common formats).
- // Paper cordinates are calculated in this way:
- // (inches * 72) where (1 inch = 2.54 cm)
- switch (strtoupper($format)) {
- case '4A0':
- $format = array(4767.87, 6740.79);
- break;
- case '2A0':
- $format = array(3370.39, 4767.87);
- break;
- case 'A0':
- $format = array(2383.94, 3370.39);
- break;
- case 'A1':
- $format = array(1683.78, 2383.94);
- break;
- case 'A2':
- $format = array(1190.55, 1683.78);
- break;
- case 'A3':
- $format = array(841.89, 1190.55);
- break;
- case 'A4':
- $format = array(595.28, 841.89);
- break;
- case 'A5':
- $format = array(419.53, 595.28);
- break;
- case 'A6':
- $format = array(297.64, 419.53);
- break;
- case 'A7':
- $format = array(209.76, 297.64);
- break;
- case 'A8':
- $format = array(147.40, 209.76);
- break;
- case 'A9':
- $format = array(104.88, 147.40);
- break;
- case 'A10':
- $format = array(73.70, 104.88);
- break;
- case 'B0':
- $format = array(2834.65, 4008.19);
- break;
- case 'B1':
- $format = array(2004.09, 2834.65);
- break;
- case 'B2':
- $format = array(1417.32, 2004.09);
- break;
- case 'B3':
- $format = array(1000.63, 1417.32);
- break;
- case 'B4':
- $format = array(708.66, 1000.63);
- break;
- case 'B5':
- $format = array(498.90, 708.66);
- break;
- case 'B6':
- $format = array(354.33, 498.90);
- break;
- case 'B7':
- $format = array(249.45, 354.33);
- break;
- case 'B8':
- $format = array(175.75, 249.45);
- break;
- case 'B9':
- $format = array(124.72, 175.75);
- break;
- case 'B10':
- $format = array(87.87, 124.72);
- break;
- case 'C0':
- $format = array(2599.37, 3676.54);
- break;
- case 'C1':
- $format = array(1836.85, 2599.37);
- break;
- case 'C2':
- $format = array(1298.27, 1836.85);
- break;
- case 'C3':
- $format = array(918.43, 1298.27);
- break;
- case 'C4':
- $format = array(649.13, 918.43);
- break;
- case 'C5':
- $format = array(459.21, 649.13);
- break;
- case 'C6':
- $format = array(323.15, 459.21);
- break;
- case 'C7':
- $format = array(229.61, 323.15);
- break;
- case 'C8':
- $format = array(161.57, 229.61);
- break;
- case 'C9':
- $format = array(113.39, 161.57);
- break;
- case 'C10':
- $format = array(79.37, 113.39);
- break;
- case 'RA0':
- $format = array(2437.80, 3458.27);
- break;
- case 'RA1':
- $format = array(1729.13, 2437.80);
- break;
- case 'RA2':
- $format = array(1218.90, 1729.13);
- break;
- case 'RA3':
- $format = array(864.57, 1218.90);
- break;
- case 'RA4':
- $format = array(609.45, 864.57);
- break;
- case 'SRA0':
- $format = array(2551.18, 3628.35);
- break;
- case 'SRA1':
- $format = array(1814.17, 2551.18);
- break;
- case 'SRA2':
- $format = array(1275.59, 1814.17);
- break;
- case 'SRA3':
- $format = array(907.09, 1275.59);
- break;
- case 'SRA4':
- $format = array(637.80, 907.09);
- break;
- case 'LETTER':
- $format = array(612.00, 792.00);
- break;
- case 'LEGAL':
- $format = array(612.00, 1008.00);
- break;
- case 'EXECUTIVE':
- $format = array(521.86, 756.00);
- break;
- case 'FOLIO':
- $format = array(612.00, 936.00);
- break;
- default:
- $this->Error('Unknown page format: ' . $format);
- break;
- } // end switch
- $this->fwPt = $format[0];
- $this->fhPt = $format[1];
- }
- else {
- $this->fwPt = $format[0] * $this->k;
- $this->fhPt = $format[1] * $this->k;
- } // end if... else...
- $this->fw = $this->fwPt / $this->k;
- $this->fh = $this->fhPt / $this->k;
-
- // Page orientation
- $orientation = strtolower($orientation);
- if ($orientation == 'p' || $orientation == 'portrait') {
- $this->DefOrientation = 'P';
- $this->wPt = $this->fwPt;
- $this->hPt = $this->fhPt;
- }
- else if ($orientation == 'l' || $orientation == 'landscape') {
- $this->DefOrientation = 'L';
- $this->wPt = $this->fhPt;
- $this->hPt = $this->fwPt;
- }
- else {
- $this->Error('Incorrect orientation: ' . $orientation);
- } // end if... else if... else...
- $this->CurOrientation = $this->DefOrientation;
- $this->w = $this->wPt / $this->k;
- $this->h = $this->hPt / $this->k;
-
- // Page margins (1 cm)
- $margin = 28.35 / $this->k;
- $this->SetMargins($margin, $margin);
-
- // Interior cell margin (1 mm)
- $this->cMargin = $margin / 10;
-
- // Line width (0.2 mm)
- $this->LineWidth = .567 / $this->k;
-
- // Automatic page break
- $this->SetAutoPageBreak(TRUE, 2 * $margin);
-
- // Full width display mode
- $this->SetDisplayMode('fullwidth');
-
- // Compression
- $this->SetCompression(TRUE);
- } // end of the "FPDF()" constructor
-
-
- /**
- * Sets left margin of the page
- *
- * @param double The left margin
- *
- * @access public
- */
- function SetLeftMargin($margin)
- {
- $this->lMargin = $margin;
- if ($this->page > 0 && $this->x < $margin) {
- $this->x = $margin;
- }
- } // end of the "SetLeftMargin()" method
-
-
- /**
- * Sets top margin of the page
- *
- * @param double The top margin
- *
- * @access public
- */
- function SetTopMargin($margin)
- {
- $this->tMargin = $margin;
- } // end of the "SetTopMargin()" method
-
-
- /**
- * Sets right margin of the page
- *
- * @param double The right margin
- *
- * @access public
- */
- function SetRightMargin($margin)
- {
- $this->rMargin = $margin;
- } // end of the "SetRightMargin()" method
-
-
- /**
- * Sets the title of the document (among the document properties)
- *
- * @param string The title of the document
- *
- * @access public
- */
- function SetTitle($title)
- {
- $this->title = $title;
- } // end of the "SetTitle()" method
-
-
- /**
- * Sets the subject of the document (among the document properties)
- *
- * @param string The subject of the document
- *
- * @access public
- */
- function SetSubject($subject)
- {
- $this->subject = $subject;
- } // end of the "SetSubject()" method
-
-
- /**
- * Sets the author of the document (among the document properties)
- *
- * @param string The author of the document
- *
- * @access public
- */
- function SetAuthor($author)
- {
- $this->author = $author;
- } // end of the "SetAuthor()" method
-
-
- /**
- * Sets keywords of the document (among the document properties)
- *
- * @param string The keyword list for the document
- *
- * @access public
- */
- function SetKeywords($keywords)
- {
- $this->keywords = $keywords;
- } // end of the "SetKeywords()" method
-
-
- /**
- * Sets the creator of the document (among the document properties)
- *
- * @param string The creator of the document
- *
- * @access public
- */
- function SetCreator($creator)
- {
- $this->creator = $creator;
- } // end of the "SetCreator()" method
-
-
- /**
- * Defines an alias for the total number of pages
- *
- * @param string The alias string
- *
- * @access public
- */
- function AliasNbPages($alias = '{nb}')
- {
- $this->AliasNbPages = $alias;
- } // end of the "AliasNbPages()" method
-
-
- /**
- * Selects a font
- *
- * @param string The font name
- * @param string The font style (B, I, BI)
- * @param double The font size (in points)
- *
- * @global double The character width
- *
- * @access public
- */
- function SetFont($family, $style = '', $size = 0)
- {
- global $fpdf_charwidths;
-
- $family = strtolower($family);
- if ($family == '') {
- $family = $this->FontFamily;
- }
- if ($family == 'arial') {
- $family = 'helvetica';
- }
- else if ($family == 'symbol' || $family == 'zapfdingbats') {
- $style = '';
- }
- $style = strtoupper($style);
-
- if (strpos(' ' . $style, 'U')) {
- $this->underline = TRUE;
- $style = str_replace('U', '', $style);
- } else {
- $this->underline = FALSE;
- }
- if ($style == 'IB') {
- $style = 'BI';
- }
- if ($size == 0) {
- $size = $this->FontSizePt;
- }
-
- // Tests if the font is already selected
- if ($this->FontFamily == $family && $this->FontStyle == $style && $this->FontSizePt == $size) {
- return;
- }
-
- // Tests if used for the first time
- $fontkey = $family . $style;
- if (!isset($this->fonts[$fontkey])) {
- // Checks if one of the standard fonts
- if (isset($this->CoreFonts[$fontkey])) {
- if (!isset($fpdf_charwidths[$fontkey])) {
- // Loads metric file
- $file = $family;
- if ($family == 'times' || $family == 'helvetica') {
- $file .= strtolower($style);
- }
- $file .= '.php';
- if (isset($GLOBALS['FPDF_font_path'])) {
- $file = $GLOBALS['FPDF_font_path'] . $file;
- }
- include($file);
- if (!isset($fpdf_charwidths[$fontkey])) {
- $this->Error('Could not include font metric file');
- }
- } // end if
- $i = count($this->fonts) + 1;
- $this->fonts[$fontkey] = array('i' => $i,
- 'type' => 'core',
- 'name' => $this->CoreFonts[$fontkey],
- 'up' => -100,
- 'ut' => 50,
- 'cw' => $fpdf_charwidths[$fontkey]);
- }
- else {
- $this->Error('Undefined font: ' . $family . ' ' . $style);
- } // end if... else...
- } // end if
-
- // Selects it
- $this->FontFamily = $family;
- $this->FontStyle = $style;
- $this->FontSizePt = $size;
- $this->FontSize = $size / $this->k;
- $this->CurrentFont = &$this->fonts[$fontkey];
- if ($this->page > 0) {
- $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
- }
- } // end of the "SetFont()" method
-
-
- /**
- * Sends the header of the page
- *
- * This method has to be implemented in your own inherited class
- *
- * @access public
- */
- function Header()
- {
- // void
- } // end of the "Header()" method
-
-
- /**
- * Sends the footer of the page
- *
- * This method has to be implemented in your own inherited class
- *
- * @access public
- */
- function Footer()
- {
- // void
- } // end of the "Footer()" method
-
-
- /**
- * Begin the document
- *
- * @access public
- */
- function Open()
- {
- $this->_begindoc();
- } // end of the "Open()" method
-
-
- /**
- * Starts a new page
- *
- * @param string The page orientation (p, portrait, l or landscape)
- *
- * @access public
- */
- function AddPage($orientation = '')
- {
- // Backups some core variables
- $family = $this->FontFamily;
- $style = $this->FontStyle . ($this->underline ? 'U' : '');
- $size = $this->FontSizePt;
- $lw = $this->LineWidth;
- $dc = $this->DrawColor;
- $fc = $this->FillColor;
- $tc = $this->TextColor;
- $cf = $this->ColorFlag;
-
- // If a page is already defined close it before starting the new one
- if ($this->page > 0) {
- // Page footer
- $this->InFooter = TRUE;
- $this->Footer();
- $this->InFooter = FALSE;
- // Close page
- $this->_endpage();
- }
-
- // Do start the new page
- $this->_beginpage($orientation);
- // Sets line cap style to square
- $this->_out('2 J');
- // Sets line width
- $this->LineWidth = $lw;
- $this->_out(sprintf('%.2f w', $lw * $this->k));
- // Sets font
- if ($family) {
- $this->SetFont($family, $style, $size);
- }
- // Sets colors
- $this->DrawColor = $dc;
- if ($dc != '0 G') {
- $this->_out($dc);
- }
- $this->FillColor = $fc;
- if ($fc != '0 g') {
- $this->_out($fc);
- }
- $this->TextColor = $tc;
- $this->ColorFlag = $cf;
- // Sets Page header
- $this->Header();
- // Restores line width
- if ($this->LineWidth != $lw) {
- $this->LineWidth = $lw;
- $this->_out(sprintf('%.2f w', $lw * $this->k));
- }
- // Restores font
- if ($family) {
- $this->SetFont($family, $style, $size);
- }
- // Restores colors
- if ($this->DrawColor!=$dc) {
- $this->DrawColor = $dc;
- $this->_out($dc);
- }
- if ($this->FillColor!=$fc) {
- $this->FillColor = $fc;
- $this->_out($fc);
- }
- $this->TextColor = $tc;
- $this->ColorFlag = $cf;
- } // end of the "AddPage()" method
-
-
- /**
- * Terminates and closes the document
- *
- * @access public
- */
- function Close()
- {
- // Terminates document
- if ($this->page == 0) {
- $this->AddPage();
- }
-
- // Displays the page footer
- $this->InFooter = TRUE;
- $this->Footer();
- $this->InFooter = FALSE;
-
- // Closes page and document
- $this->_endpage();
- $this->_enddoc();
- } // end of the "Close()" method
-
-
- /**
- * Gets the current page number
- *
- * @return integer The current page number
- *
- * @access public
- */
- function PageNo()
- {
- return $this->page;
- } // end of the "PageNo()" method
-
-
- /**
- * Sets color for all stroking operations
- *
- * @param integer The red level (0 to 255)
- * @param integer The green level (0 to 255)
- * @param integer The blue level (0 to 255)
- *
- * @access public
- */
- function SetDrawColor($r, $g = -1, $b = -1)
- {
- if (($r == 0 && $g == 0 && $b == 0) || $g == -1) {
- $this->DrawColor = sprintf('%.3f G', $r / 255);
- } else {
- $this->DrawColor = sprintf('%.3f %.3f %.3f RG', $r / 255, $g / 255, $b / 255);
- } // end if... else...
-
- // If a page is defined, applies this property
- if ($this->page > 0) {
- $this->_out($this->DrawColor);
- }
- } // end of the "SetDrawColor()" method
-
-
- /**
- * Sets color for all filling operations
- *
- * @param integer The red level (0 to 255)
- * @param integer The green level (0 to 255)
- * @param integer The blue level (0 to 255)
- *
- * @access public
- */
- function SetFillColor($r, $g = -1, $b =-1)
- {
- if (($r == 0 && $g == 0 && $b == 0) || $g == -1) {
- $this->FillColor = sprintf('%.3f g', $r / 255);
- } else {
- $this->FillColor = sprintf('%.3f %.3f %.3f rg', $r / 255, $g / 255, $b / 255);
- } // end if... else...
-
- $this->ColorFlag = ($this->FillColor != $this->TextColor);
-
- // If a page is defined, applies this property
- if ($this->page > 0) {
- $this->_out($this->FillColor);
- }
- } // end of the "SetDrawColor()" method
-
-
- /**
- * Sets color for text
- *
- * @param integer The red level (0 to 255)
- * @param integer The green level (0 to 255)
- * @param integer The blue level (0 to 255)
- *
- * @access public
- */
- function SetTextColor($r, $g = -1, $b =-1)
- {
- if (($r == 0 && $g == 0 && $b == 0) || $g == -1) {
- $this->TextColor = sprintf('%.3f g', $r / 255);
- } else {
- $this->TextColor = sprintf('%.3f %.3f %.3f rg', $r / 255, $g / 255, $b / 255);
- } // end if... else...
-
- $this->ColorFlag = ($this->FillColor != $this->TextColor);
- } // end of the "SetTextColor()" method
-
-
- /**
- * Sets the line width
- *
- * @param double The line width
- *
- * @access public
- */
- function SetLineWidth($width)
- {
- $this->LineWidth = $width;
-
- // If a page is defined, applies this property
- if ($this->page > 0) {
- $this->_out(sprintf('%.2f w', $width * $this->k));
- }
- } // end of the "SetLineWidth()" method
-
-
- /**
- * Draws a line
- *
- * @param double The horizontal position of the starting point
- * @param double The vertical position of the starting point
- * @param double The horizontal position of the ending point
- * @param double The vertical position of the ending point
- *
- * @access public
- */
- function Line($x1, $y1, $x2, $y2)
- {
- $this->_out(sprintf('%.2f %.2f m %.2f %.2f l S', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k));
- } // end of the "Line()" method
-
-
- /**
- * Draws a rectangle
- *
- * @param double The horizontal position of the top left corner
- * @param double The vertical position of the top left corner
- * @param double The horizontal position of the bottom right corner
- * @param double The vertical position of the bottom right corner
- * @param string The rectangle style
- *
- * @access public
- */
- function Rect($x, $y, $w, $h, $style = '')
- {
- if ($style == 'F') {
- $op = 'f';
- } else if ($style == 'FD' || $style=='DF') {
- $op = 'B';
- } else {
- $op = 'S';
- } // end if... else if... else
-
- $this->_out(sprintf('%.2f %.2f %.2f %.2f re %s', $x * $this->k, ($this->h - $y) * $this->k, $w * $this->k, -$h * $this->k, $op));
- } // end of the "Rect()" method
-
-
- /**
- * Adds a TrueType or Type1 font
- *
- * @param string The font name
- * @param string The font style (B, I, BI)
- * @param string The font file definition
- *
- * @access public
- */
- function AddFont($family, $style = '', $file = '')
- {
- $family = strtolower($family);
- if ($family == 'arial') {
- $family = 'helvetica';
- }
-
- $style = strtoupper($style);
- if ($style == 'IB') {
- $style = 'BI';
- }
- if (isset($this->fonts[$family . $style])) {
- $this->Error('Font already added: ' . $family . ' ' . $style);
- }
- if ($file == '') {
- $file = str_replace(' ', '', $family) . strtolower($style) . '.php';
- }
- if (isset($GLOBALS['FPDF_font_path'])) {
- $file = $GLOBALS['FPDF_font_path'] . $file;
- }
- include($file);
- if (!isset($name)) {
- $this->Error('Could not include font definition file');
- }
-
- $i = count($this->fonts) + 1;
- $this->fonts[$family . $style] = array('i' => $i,
- 'type' => $type,
- 'name' => $name,
- 'desc' => $desc,
- 'up' => $up,
- 'ut' => $ut,
- 'cw' => $cw,
- 'enc' => $enc,
- 'file' => $file);
- // Searches existing encodings
- if ($diff) {
- $d = 0;
- $nb = count($this->diffs);
- for ($i = 1; $i <= $nb; $i++) {
- if ($this->diffs[$i] == $diff) {
- $d = $i;
- break;
- } // end if
- } // end for
- if ($d == 0) {
- $d = $nb + 1;
- $this->diffs[$d] = $diff;
- } // end if
- $this->fonts[$family . $style]['diff'] = $d;
- } // end if
-
- if ($file) {
- if ($type == 'TrueType') {
- $this->FontFiles[$file] = array('length1' => $originalsize);
- } else {
- $this->FontFiles[$file] = array('length1' => $size1, 'length2' => $size2);
- }
- } // end if
- } // end of the "AddFont()" method
-
-
- /**
- * Sets font size
- *
- * @param double The font size (in points)
- *
- * @access public
- */
- function SetFontSize($size)
- {
- if ($this->FontSizePt == $size) {
- return;
- }
- $this->FontSizePt = $size;
- $this->FontSize = $size / $this->k;
- if ($this->page > 0) {
- $this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
- }
- } // end of the "SetFontSize()" method
-
-
- /**
- * Creates a new internal link
- *
- * @return integer The link id
- *
- * @access public
- */
- function AddLink()
- {
- $n = count($this->links) + 1;
- $this->links[$n] = array(0, 0);
- return $n;
- } // end of the "AddLink()" method
-
-
- /**
- * Sets destination of internal link
- *
- * @param integer The link id
- * @param double The y position on the page
- * @param integer The page number
- *
- * @access public
- */
- function SetLink($link, $y = 0, $page = -1)
- {
- if ($y == -1) {
- $y = $this->y;
- }
- if ($page == -1) {
- $page = $this->page;
- }
- $this->links[$link] = array($page, $y);
- } // end of the "SetLink()" method
-
-
- /**
- * Put a link inside a rectangular area of the page
- *
- * @param double The top left x position
- * @param double The top left y position
- * @param double The rectangle width
- * @param double The rectangle height
- * @param mixed The link id or an url
- *
- * @access public
- */
- function Link($x, $y, $w, $h, $link)
- {
- $this->PageLinks[$this->page][] = array($x * $this->k,
- $this->hPt - $y * $this->k,
- $w * $this->k,
- $h * $this->k,
- $link);
- } // end of the "Link()" method
-
-
- /**
- * Outputs a string
- *
- * @param double The x position
- * @param double The y position
- * @param string The string
- *
- * @access public
- */
- function Text($x, $y, $txt)
- {
- $txt = str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));
- $s = sprintf('BT %.2f %.2f Td (%s) Tj ET', $x * $this->k, ($this->h - $y) * $this->k, $txt);
- if ($this->underline && $txt != '') {
- $s .= ' ' . $this->_dounderline($x, $y, $txt);
- }
- if ($this->ColorFlag) {
- $s = 'q ' . $this->TextColor . ' ' . $s . ' Q';
- }
- $this->_out($s);
- } // end of the "Text()" method
-
-
- /**
- * Gets whether automatic page break is on or not
- *
- * @return boolean Whether automatic page break is on or not
- *
- * @access public
- */
- function AcceptPageBreak()
- {
- return $this->AutoPageBreak;
- } // end of the "AcceptPageBreak()" method
-
-
- /**
- * Output a cell
- *
- * @param double The cell width
- * @param double The cell height
- * @param string The text to output
- * @param mixed Wether to add borders or not (see the manual)
- * @param integer Where to put the cursor once the output is done
- * @param string Align mode
- * @param integer Whether to fill the cell with a color or not
- * @param mixed The link id or an url
- *
- * @access public
- */
- function Cell($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = 0, $link = '')
- {
- $k = $this->k;
-
- if ($this->y + $h > $this->PageBreakTrigger
- && !$this->InFooter
- && $this->AcceptPageBreak()) {
- $x = $this->x;
- $ws = $this->ws;
- if ($ws > 0) {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
- $this->AddPage($this->CurOrientation);
- $this->x = $x;
- if ($ws > 0) {
- $this->ws = $ws;
- $this->_out(sprintf('%.3f Tw', $ws * $k));
- }
- } // end if
-
- if ($w == 0) {
- $w = $this->w - $this->rMargin - $this->x;
- }
-
- $s = '';
- if ($fill == 1 || $border == 1) {
- if ($fill == 1) {
- $op = ($border == 1) ? 'B' : 'f';
- } else {
- $op = 'S';
- }
- $s = sprintf('%.2f %.2f %.2f %.2f re %s ', $this->x * $k, ($this->h - $this->y) * $k, $w * $k, -$h * $k, $op);
- } // end if
-
- if (is_string($border)) {
- $x = $this->x;
- $y = $this->y;
- if (strpos(' ' . $border, 'L')) {
- $s .= sprintf('%.2f %.2f m %.2f %.2f l S ', $x * $k, ($this->h - $y) * $k, $x * $k, ($this->h - ($y+$h)) * $k);
- }
- if (strpos(' ' . $border, 'T')) {
- $s .= sprintf('%.2f %.2f m %.2f %.2f l S ', $x * $k, ($this->h - $y) * $k, ($x + $w) * $k, ($this->h - $y) * $k);
- }
- if (strpos(' ' . $border, 'R')) {
- $s .= sprintf('%.2f %.2f m %.2f %.2f l S ', ($x + $w) * $k, ($this->h - $y) * $k, ($x + $w) * $k, ($this->h - ($y + $h)) * $k);
- }
- if (strpos(' ' . $border, 'B')) {
- $s .= sprintf('%.2f %.2f m %.2f %.2f l S ', $x * $k, ($this->h - ($y + $h)) * $k, ($x + $w) * $k, ($this->h - ($y + $h)) * $k);
- }
- } // end if
-
- if ($txt != '') {
- if ($align == 'R') {
- $dx = $w - $this->cMargin - $this->GetStringWidth($txt);
- }
- else if ($align == 'C') {
- $dx = ($w - $this->GetStringWidth($txt)) / 2;
- }
- else {
- $dx = $this->cMargin;
- }
- $txt = str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));
- if ($this->ColorFlag) {
- $s .= 'q ' . $this->TextColor . ' ';
- }
- $s .= sprintf('BT %.2f %.2f Td (%s) Tj ET', ($this->x + $dx) * $k, ($this->h - ($this->y + .5 * $h + .3 * $this->FontSize)) * $k, $txt);
- if ($this->underline) {
- $s .= ' ' . $this->_dounderline($this->x+$dx, $this->y + .5 * $h + .3 * $this->FontSize, $txt);
- }
- if ($this->ColorFlag) {
- $s .= ' Q';
- }
- if ($link) {
- $this->Link($this->x + $dx, $this->y + .5 * $h - .5 * $this->FontSize, $this->GetStringWidth($txt), $this->FontSize, $link);
- }
- } // end if
-
- if ($s) {
- $this->_out($s);
- }
- $this->lasth = $h;
-
- if ($ln > 0) {
- // Go to next line
- $this->y += $h;
- if ($ln == 1) {
- $this->x = $this->lMargin;
- }
- } else {
- $this->x += $w;
- }
- } // end of the "Cell()" method
-
-
- /**
- * Output text with automatic or explicit line breaks
- *
- * @param double The cell width
- * @param double The cell height
- * @param string The text to output
- * @param mixed Wether to add borders or not (see the manual)
- * @param string Align mode
- * @param integer Whether to fill the cell with a color or not
- *
- * @access public
- */
- function MultiCell($w, $h, $txt, $border = 0, $align = 'J', $fill = 0)
- {
- // loic1: PHP3 compatibility
- // $cw = &$this->CurrentFont['cw'];
- if ($w == 0) {
- $w = $this->w - $this->lMargin - $this->x;
- }
- $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
- $s = str_replace("\r", '', $txt);
- $nb = strlen($s);
- if ($nb>0 && $s[$nb - 1] == "\n") {
- $nb--;
- }
-
- $b = 0;
- if ($border) {
- if ($border == 1) {
- $border = 'LTRB';
- $b = 'LRT';
- $b2 = 'LR';
- }
- else {
- $b2 = '';
- if (strpos(' ' . $border, 'L')) {
- $b2 .= 'L';
- }
- if (strpos(' ' . $border, 'R')) {
- $b2 .= 'R';
- }
- $b = (strpos(' ' . $border, 'T')) ? $b2 . 'T' : $b2;
- } // end if... else...
- } // end if
-
- $sep = -1;
- $i = 0;
- $j = 0;
- $l = 0;
- $ns = 0;
- $nl = 1;
- while ($i < $nb) {
- // Gets next character
- $c = $s[$i];
-
- // Explicit line break
- if ($c == "\n") {
- if ($this->ws > 0) {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
- $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill);
- $i++;
- $sep = -1;
- $j = $i;
- $l = 0;
- $ns = 0;
- $nl++;
- if ($border && $nl == 2) {
- $b = $b2;
- }
- continue;
- } // end if
-
- // Space character
- if ($c == ' ') {
- $sep = $i;
- $ls = $l;
- $ns++;
- } // end if
-
- $l += $this->CurrentFont['cw'][$c];
- if ($l > $wmax) {
- // Automatic line break
- if ($sep == -1) {
- if ($i == $j) {
- $i++;
- }
- if ($this->ws > 0) {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
- $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill);
- }
- else {
- if ($align == 'J') {
- $this->ws = ($ns > 1)
- ? ($wmax - $ls) / 1000 * $this->FontSize / ($ns - 1)
- : 0;
- $this->_out(sprintf('%.3f Tw', $this->ws * $this->k));
- }
- $this->Cell($w, $h, substr($s, $j, $sep - $j), $b, 2, $align, $fill);
- $i = $sep + 1;
- } // end if... else...
-
- $sep = -1;
- $j = $i;
- $l = 0;
- $ns = 0;
- $nl++;
- if ($border && $nl == 2) {
- $b = $b2;
- }
- }
- else {
- $i++;
- } // end if... else
- } // end while
-
- // Last chunk
- if ($this->ws > 0) {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
-
- if ($border && strpos(' ' . $border, 'B')) {
- $b .= 'B';
- }
- $this->Cell($w, $h, substr($s, $j, $i), $b, 2, $align, $fill);
- $this->x = $this->lMargin;
- } // end of the "MultiCell()" method
-
-
- /**
- * Output text in flowing mode
- *
- * @param double The line height
- * @param string The text to output
- * @param mixed The link id or an url
- *
- * @access public
- */
- function Write($h, $txt, $link = '')
- {
- $w = $this->w - $this->rMargin - $this->x;
- $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
- $s = str_replace("\r", '', $txt);
- $nb = strlen($s);
- $sep = -1;
- $i = 0;
- $j = 0;
- $l = 0;
- $nl = 1;
-
- while ($i < $nb) {
- // Gets next character
- $c = $s[$i];
-
- // Explicit line break
- if ($c == "\n") {
- $this->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, '', 0, $link);
- $i++;
- $sep = -1;
- $j = $i;
- $l = 0;
- if ($nl == 1) {
- $this->x = $this->lMargin;
- $w = $this->w - $this->rMargin - $this->x;
- $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
- }
- $nl++;
- continue;
- }
-
- // Space character
- if ($c == ' ') {
- $sep = $i;
- $ls = $l;
- } // end if
-
- $l += $this->CurrentFont['cw'][$c];
- if ($l > $wmax) {
- // Automatic line break
- if ($sep == -1) {
- if($this->x > $this->lMargin) {
- // Move to next line
- $this->x =$this->lMargin;
- $this->y +=$h;
- $w = $this->w - $this->rMargin - $this->x;
- $wmax =($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
- $i++;
- $nl++;
- continue;
- }
- if ($i == $j) {
- $i++;
- }
- $this->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, '', 0, $link);
- }
- else {
- $this->Cell($w, $h, substr($s, $j, $sep - $j), 0, 2, '', 0, $link);
- $i = $sep + 1;
- } // end if... else...
-
- $sep = -1;
- $j = $i;
- $l = 0;
- if ($nl == 1) {
- $this->x = $this->lMargin;
- $w = $this->w - $this->rMargin - $this->x;
- $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
- }
- $nl++;
- }
- else {
- $i++;
- } // end if... else...
- } // end while
-
- // Last chunk
- if ($i != $j) {
- $this->Cell($l / 1000 * $this->FontSize, $h, substr($s, $j, $i), 0, 0, '', 0, $link);
- }
- } // end of the "Write()" method
-
-
- /**
- * Puts an image on the page
- *
- * @param string The image file (JPEG or PNG format)
- * @param double The top left x position
- * @param double The top left y position
- * @param double The image width
- * @param double The image height
- * @param string The image type (JPG, JPEG or PNG)
- * @param mixed The link id or an url
- *
- * @access public
- */
- function Image($file, $x, $y, $w, $h = 0, $type = '', $link = '')
- {
- if (!isset($this->images[$file])) {
- // First use of image, get info
- if ($type == '') {
- $pos = strrpos($file, '.');
- if (!$pos) {
- $this->Error('Image file has no extension and no type was specified: ' . $file);
- }
- $type = substr($file, $pos + 1);
- } // end if
-
- $type = strtolower($type);
- $mqr = get_magic_quotes_runtime();
- set_magic_quotes_runtime(0);
- if ($type == 'jpg' || $type == 'jpeg') {
- $info = $this->_parsejpg($file);
- }
- else if ($type == 'png') {
- $info = $this->_parsepng($file);
- }
- else {
- $this->Error('Unsupported image file type: ' . $type);
- }
- set_magic_quotes_runtime($mqr);
- $info['i'] = count($this->images) + 1;
- $this->images[$file] = $info;
- }
- else {
- $info = $this->images[$file];
- } // end if... else...
-
- // Automatic width or height calculation
- if ($w == 0) {
- $w = $h * $info['w'] / $info['h'];
- }
- if ($h == 0) {
- $h = $w * $info['h'] / $info['w'];
- }
- $this->_out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q', $w * $this->k, $h * $this->k, $x * $this->k, ($this->h - ($y + $h)) * $this->k, $info['i']));
-
- if ($link) {
- $this->Link($x, $y, $w, $h, $link);
- }
- } // end of the "Image()" method
-
-
- /**
- * Appends a line feed
- *
- * @param double The line height
- *
- * @access public
- */
- function Ln($h = '')
- {
- $this->x = $this->lMargin;
- // Sets default line height to last cell height
- if (is_string($h)) {
- $this->y += $this->lasth;
- }
- else {
- $this->y += $h;
- }
- } // end of the "Ln()" method
-
-
- /**
- * Gets x position
- *
- * @return double The x position
- *
- * @access public
- */
- function GetX()
- {
- return $this->x;
- } // end of the "GetX()" method
-
-
- /**
- * Sets x position
- *
- * @param double The x position
- *
- * @access public
- */
- function SetX($x)
- {
- if ($x >= 0) {
- $this->x = $x;
- } else {
- $this->x = $this->w + $x;
- }
- } // end of the "SetX()" method
-
-
- /**
- * Gets y position
- *
- * @return double The y position
- *
- * @access public
- */
- function GetY()
- {
- return $this->y;
- } // end of the "GetY()" method
-
-
- /**
- * Sets y position and resets x
- *
- * @param double The y position
- *
- * @access public
- */
- function SetY($y)
- {
- $this->x = $this->lMargin;
- if ($y >= 0) {
- $this->y = $y;
- } else {
- $this->y = $this->h + $y;
- }
- } // end of the "SetY()" method
-
-
- /**
- * Sets x and y positions
- *
- * @param double The x position
- * @param double The y position
- *
- * @access public
- */
- function SetXY($x,$y)
- {
- $this->SetY($y);
- $this->SetX($x);
- } // end of the "SetXY()" method
-
-
- /**
- * Outputs PDF to file or browser
- *
- * @param string The file name
- * @param boolean Whether to display the document inside the browser
- * (with Acrobat plugin), to enforce download as file or
- * to save it on the server
- *
- * @global string The browser id string
- *
- * @access public
- */
- function Output($file = '', $download = FALSE)
- {
- global $HTTP_USER_AGENT;
-
- if ($this->state < 3) {
- $this->Close();
- }
-
- // Send to browser
- if ($file == '') {
- header('Content-Type: application/pdf');
- if (headers_sent()) {
- $this->Error('Some data has already been output to browser, can\'t send PDF file');
- }
- header('Content-Length: ' . strlen($this->buffer));
- header('Content-Disposition: inline; filename=doc.pdf');
- echo $this->buffer;
- }
- // Download file
- else if ($download) {
- if (!empty($HTTP_USER_AGENT)
- && (strpos($HTTP_USER_AGENT, 'MSIE 5.5') || strpos($HTTP_USER_AGENT, 'Opera'))) {
- header('Content-Type: application/dummy');
- }
- // fix for Gecko-based browsers < 1.1
- else if (!empty($HTTP_USER_AGENT)
- && (strpos($HTTP_USER_AGENT, 'Gecko') &&
- (strpos($HTTP_USER_AGENT, 'rv:0.') || strpos($HTTP_USER_AGENT, 'rv:1.0') || strpos($HTTP_USER_AGENT, 'rv:1.1')))) {
- header('Content-Type: application/');
- }
- else {
- header('Content-Type: application/pdf');
- }
- if (headers_sent()) {
- $this->Error('Some data has already been output to browser, can\'t send PDF file');
- }
- header('Content-Length: ' . strlen($this->buffer));
- header('Content-Disposition: attachment; filename=' . $file);
- echo $this->buffer;
- }
- // Save file locally
- else {
- $f = fopen($file, 'wb');
- if (!$f) {
- $this->Error('Unable to create output file: ' . $file);
- }
- fwrite($f, $this->buffer, strlen($this->buffer));
- fclose($f);
- } // end if... else if... else
- } // end of the "Output()" method
-
- } // End of the "FPDF" class
-
-
-
- /**
- * Handles silly IE contype request
- */
- if (!empty($_ENV) && isset($_ENV['HTTP_USER_AGENT'])) {
- $HTTP_USER_AGENT = $_ENV['HTTP_USER_AGENT'];
- }
- else if (!empty($_SERVER) && isset($_SERVER['HTTP_USER_AGENT'])) {
- $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
- }
- else if (@getenv('HTTP_USER_AGENT')) {
- $HTTP_USER_AGENT = getenv('HTTP_USER_AGENT');
- }
-
- if ($HTTP_USER_AGENT == 'contype') {
- header('Content-Type: application/pdf');
- exit();
- }
- ?>