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