Search:

# CWIS Developers Documentation

- Main Page
- Classes
- Files

- File List
- File Members

# Axis--PSDocument.php

Go to the documentation of this file.

    00001 <?PHP
    00002
    00003 #
    00004 #   Axis--PSDocument.php
    00005 #   PHP Objects for Generating PostScript and PDF Documents
    00006 #
    00007 #   Copyright 1999-2001 Axis Data
    00008 #   This code is free software that can be used or redistributed under the
    00009 #   terms of Version 2 of the GNU General Public License, as published by the
    00010 #   Free Software Foundation (http://www.fsf.org).
    00011 #
    00012 #   Author:  Edward Almasy (almasy@axisdata.com)
    00013 #
    00014 #   Part of the AxisPHP library v1.2.4
    00015 #   For more information see http://www.axisdata.com/AxisPHP/
    00016 #
    00017
    00018
    00019 class PSDocument {
    00020
    00021     # ---- PUBLIC INTERFACE --------------------------------------------------
    00022
    00023     # object constructor
    00024     function PSDocument()
    00025     {
    00026         # print document header
    00027         $this->PrintRaw("
    00028                 gsave
    00029                 ");
    00030
    00031         # set default font for document
    00032         $this->SetFont("Times-Roman", 12);
    00033
    00034         # set reasonable default starting coordinates
    00035         $this->MoveTo(100, 100);
    00036     }
    00037
    00038     function NextPage()
    00039     {
    00040         # increment our internal page number value
    00041         $CurrentPageNumber = $this->PageNumber();
    00042         $CurrentPageNumber++;
    00043         $this->PageNumber($CurrentPageNumber++);
    00044     }
    00045
    00046     function NextLine()
    00047     {
    00048         $SpacingMultiplier = 1.35;
    00049
    00050         if ($this->TextAngle == 0)
    00051         {
    00052             $this->YPos -= (int)($this->GetFontHeight() * $SpacingMultiplier);
    00053         }
    00054         elseif ($this->TextAngle == 90)
    00055         {
    00056             $this->XPos -= (int)($this->GetFontHeight() * $SpacingMultiplier);
    00057         }
    00058     }
    00059
    00060     function MoveToX($NewXPos)
    00061     {
    00062         $this->XPos = $NewXPos;
    00063     }
    00064
    00065     function MoveToY($NewYPos)
    00066     {
    00067         $this->YPos = $NewYPos;
    00068     }
    00069
    00070     function MoveToRelX($NewXPos)
    00071     {
    00072         $this->XPos = $this->CurrentXPos() + $NewXPos;
    00073     }
    00074
    00075     function MoveToRelY($NewYPos)
    00076     {
    00077         $this->YPos = $this->CurrentYPos() + $NewYPos;
    00078     }
    00079
    00080     function MoveTo($NewXPos, $NewYPos)
    00081     {
    00082         $this->MoveToX($NewXPos);
    00083         $this->MoveToY($NewYPos);
    00084     }
    00085
    00086     function CurrentXPos()
    00087     {
    00088         return $this->XPos;
    00089     }
    00090
    00091     function CurrentYPos()
    00092     {
    00093         return $this->YPos;
    00094     }
    00095
    00096     function WritePostscriptToFile($FileName)
    00097     {
    00098         # open output file
    00099         $OutputFilePointer = fopen($FileName, "w+") or die("unable to open PostScript output file ".$FileName);
    00100
    00101         # write out document header
    00102         fwrite($OutputFilePointer, "%!PS-Adobe-2.0
    00103                 %%Creator: AxisPHP
    00104                 %%Orientation: Landscape
    00105                 %%EndComments
    00106                 /UseFont { findfont exch scalefont setfont } bind def
    00107                 %%EndProlog
    00108                 ");
    00109
    00110         # for each page that has text
    00111         for ($Index = 1;  $Index <= $this->HighestPageNumber;  $Index++)
    00112         {
    00113             # if there is text on the page
    00114             if (strlen($this->PageText[$Index]) > 0)
    00115             {
    00116                 # write out page text
    00117                 fwrite($OutputFilePointer, $this->PageText[$Index]);
    00118
    00119                 # write out page footer
    00120                 fwrite($OutputFilePointer, "
    00121                         stroke
    00122                         grestore
    00123                         showpage
    00124                         ");
    00125             }
    00126         }
    00127
    00128         # write out document footer
    00129         fwrite($OutputFilePointer, "
    00130                 %%Trailer
    00131                 %%EOF
    00132                 ");
    00133
    00134         # close output file
    00135         fclose($OutputFilePointer);
    00136     }
    00137
    00138     function WritePDFToFile($OutputFileName)
    00139     {
    00140         # create PostScript file
    00141         $PSFileName = tempnam("/tmp", $FileNamePrefix) or die("unable to generate temporary file name for PostScript file for PDF generation");
    00142         $this->WritePostscriptToFile($PSFileName);
    00143
    00144         # build PostScript-to-PDF command string
    00145         $Command = sprintf("cat %s | gs -q -sDEVICE=pdfwrite -sOutputFile=%s - ",
    00146                 $PSFileName, $OutputFileName);
    00147
    00148         # run PostScript-to-PDF command
    00149         system($Command);
    00150
    00151         # remove PostScript file
    00152         system(sprintf("rm %s", $PSFileName));
    00153     }
    00154
    00155     function SetPrintCommand($NewPrintCommand)
    00156     {
    00157         $this->PrintCommand = $NewPrintCommand;
    00158     }
    00159
    00160     function PrintDocument($FileNamePrefix = "PSDocument")
    00161     {
    00162         # generate file name
    00163         $OutputFileName = tempnam("/tmp", $FileNamePrefix) or die("unable to generate temporary file name for PostScript file");
    00164
    00165         # dump document to file
    00166         $this->WritePostscriptToFile($OutputFileName);
    00167
    00168         # substitute file name into print command
    00169         $Command = str_replace("%f", $OutputFileName, $this->PrintCommand);
    00170
    00171         # issue print command
    00172         system(EscapeShellCmd($Command));
    00173
    00174         # return file name to caller
    00175         return $OutputFileName;
    00176     }
    00177
    00178     function SetPageSize($PointsHigh, $PointsWide)
    00179     {
    00180         $this->PageHeightInPoints = $PointsHigh;
    00181         $this->PageWidthInPoints = $PointsWide;
    00182     }
    00183
    00184     function SetTextWrapLength($NewLength = 0)
    00185     {
    00186         $this->TextWrapLength = $NewLength;
    00187     }
    00188
    00189     function SetFont($FontName, $FontSize)
    00190     {
    00191         $this->PrintRaw(sprintf("
    00192                 %s /%s UseFont
    00193                 ", $FontSize, $FontName));
    00194
    00195         $this->FontSize = $FontSize;
    00196     }
    00197
    00198     function GetFontHeight()
    00199     {
    00200         return (int)($this->FontSize * 0.8);
    00201     }
    00202
    00203     function PageNumber($NewPageNumber = -1)
    00204     {
    00205         if ($NewPageNumber != -1)
    00206         {
    00207             $this->PageNumber = $NewPageNumber;
    00208
    00209             if ($this->PageNumber > $this->HighestPageNumber)
    00210             {
    00211                 $this->HighestPageNumber = $this->PageNumber;
    00212             }
    00213         }
    00214         return $this->PageNumber;
    00215     }
    00216
    00217     function PrintText($TextToPrint)
    00218     {
    00219         # trim off any leading or trailing whitespace in string
    00220         $TextToPrint = trim($TextToPrint);
    00221
    00222         # split string into pieces delineated by newlines
    00223         $TextArray = split("\n", $TextToPrint);
    00224
    00225         # for each string in array
    00226         for ($Index = 0;  $Index < count($TextArray);  $Index++)
    00227         {
    00228             # trim off any leading or trailing whitespace in string
    00229             $Text = trim($TextArray[$Index]);
    00230
    00231             # if string is not empty
    00232             if (strlen($Text) > 0)
    00233             {
    00234                 # if text wrap length is set and string is longer than that
    00235                 if (($this->TextWrapLength > 0)
    00236                         && (strlen($Text) > $this->TextWrapLength))
    00237                 {
    00238                     # append portion of string beyond wrap len to next string
    00239                     $TextArray[$Index + 1] = substr($Text, $this->TextWrapLength)
    00240                             ." ".$TextArray[$Index + 1];
    00241
    00242                     # trim off portion of string beyond wrap len
    00243                     $Text = substr($Text, 0, $this->TextWrapLength);
    00244                 }
    00245
    00246                 # escape any Postscript delimiters in string
    00247                 $Text = str_replace("(", "\(", $Text);
    00248                 $Text = str_replace(")", "\)", $Text);
    00249
    00250                 # print string piece
    00251                 if ($this->TextAngle == 0)
    00252                 {
    00253                     $this->PrintRaw(sprintf("%s %s moveto\n",
    00254                             (int)$this->XPos,
    00255                             (int)($this->YPos - $this->GetFontHeight())));
    00256                 }
    00257                 elseif ($this->TextAngle == 90)
    00258                 {
    00259                     $this->PrintRaw(sprintf("%s %s moveto\n",
    00260                             (int)($this->XPos - $this->GetFontHeight()),
    00261                             (int)$this->YPos));
    00262                 }
    00263                 if ($this->TextAngle != 0)
    00264                 {
    00265                     $this->PrintRaw(sprintf("-%s rotate\n",
    00266                             (int)$this->TextAngle));
    00267                 }
    00268                 $this->PrintRaw(sprintf("(%s) show\n", $Text));
    00269                 if ($this->TextAngle != 0)
    00270                 {
    00271                     $this->PrintRaw(sprintf("%s rotate\n",
    00272                             (int)$this->TextAngle));
    00273                 }
    00274             }
    00275
    00276             # if not last string
    00277             if ($Index < (count($TextArray) - 1))
    00278             {
    00279                 # move to next row
    00280                 $this->NextLine();
    00281             }
    00282         }
    00283     }
    00284
    00285     function PrintTextAt($XPos, $YPos, $TextToPrint)
    00286     {
    00287         $this->MoveTo($XPos, $YPos);
    00288         $this->PrintText($TextToPrint);
    00289     }
    00290
    00291     function TextAngle($NewAngle = -1)
    00292     {
    00293         if ($NewAngle != -1)
    00294         {
    00295             $this->TextAngle = $NewAngle % 360;
    00296         }
    00297
    00298         return $this->TextAngle;
    00299     }
    00300
    00301     function UseLandscapeOrientation()
    00302     {
    00303         $this->PrintRaw(sprintf("
    00304                 90 rotate
    00305                 0 %s translate
    00306                 ", (0 - $this->PageWidthInPoints)));
    00307     }
    00308
    00309     function DefineStyle($StyleName, $FontName, $FontSize)
    00310     {
    00311         $this->StyleInfo[$StyleName]["FontName"] = $FontName;
    00312         $this->StyleInfo[$StyleName]["FontSize"] = $FontSize;
    00313     }
    00314
    00315     function UseStyle($StyleName)
    00316     {
    00317         $this->PrintRaw(sprintf("
    00318                 %s /%s UseFont
    00319                 ",
    00320                 $this->StyleInfo[$StyleName]["FontSize"],
    00321                 $this->StyleInfo[$StyleName]["FontName"]));
    00322
    00323         $this->FontSize = $this->StyleInfo[$StyleName]["FontSize"];
    00324     }
    00325
    00326     function PrintRaw($TextToPrint)
    00327     {
    00328         # add string to page text
    00329         $this->PageText[$this->PageNumber] .= $TextToPrint;
    00330     }
    00331
    00332
    00333     # ---- PRIVATE INTERFACE -------------------------------------------------
    00334
    00335     # array of text for each page
    00336     var $PageText;
    00337
    00338     # current print position
    00339     var $XPos = 0;
    00340     var $YPos = 0;
    00341
    00342     # current page number
    00343     var $PageNumber = 1;
    00344
    00345     # highest page number with text on it
    00346     var $HighestPageNumber = 1;
    00347
    00348     # current text rotation angle
    00349     var $TextAngle = 0;
    00350
    00351     # values for last table printed
    00352     var $TableXPos = 0;
    00353     var $TableYPos = 0;
    00354     var $TableRowHeight = 0;
    00355     var $TableColWidth = 0;
    00356
    00357     # values for last font set
    00358     var $FontHeight = 12;
    00359
    00360     # default to letter size (792x612)
    00361     var $PageHeightInPoints = 792;
    00362     var $PageWidthInPoints = 612;
    00363
    00364     # printing command
    00365     var $PrintCommand = "lpr %f";
    00366
    00367     # font style settings
    00368     var $StyleInfo;
    00369
    00370     # current string wrap length
    00371     var $TextWrapLength = 0;
    00372 }
    00373
    00374 ?>