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 ?>