1<?php
2// $Header: /cvsroot/html2ps/output.pcl.class.php,v 1.2 2006/06/25 13:55:39 Konstantin Exp $
3
4define("ASCII_ESCAPE", chr(27));
5
6class StreamString {
7  var $_content;
8
9  function StreamString() {
10    $this->_content = "";
11  }
12
13  function write($string) {
14    $this->_content .= $string;
15  }
16}
17
18/**
19 * There are  two forms of PCL escape  sequences: two-character escape
20 * sequences and parameterized escape sequences.
21 */
22class PCLEscapeSequence {
23  function output(&$stream) {
24    $stream->write(ASCII_ESCAPE.$this->getSequenceString());
25  }
26}
27
28/**
29 * Two-character escape sequences have the following form:
30 *
31 * <Escape> X
32 *
33 * where  �X�  is  a  character  that  defines  the  operation  to  be
34 * performed. �X� may be any character from the ASCII table within the
35 * range 48-126 decimal (�0� through �~� - see Appendix A).
36 */
37class PCLEscapeGenericSimple {
38  function getSequenceString() {
39    return $this->_getEscapedCharacter();
40  }
41
42}
43
44/**
45 * Parameterized escape sequences have the following form:
46 *
47 * <Escape> X y z1 # z2 # z3 ... # Zn[data]
48 *
49 * where  y,  #,  zi (z1,  z2,  z3...)  and  [data] may  be  optional,
50 * depending on the command.
51 */
52class PCLEscapeGenericParametric {
53  function getSequenceString() {
54    $result =
55      $this->_getEscapedCharacter().
56      $this->_getGroupCharacter();
57    $groups = $this->_getGroups();
58    $size = count($groups);
59    for ($i=0; $i<$size-1; $i++) {
60      $result .= $groups[$i]->getString();
61    };
62    $result .= $groups[$size-1]->getStringTerminate();
63    return $result;
64  }
65}
66
67class PCLEscapeGroup {
68  var $_value;
69  var $_character;
70
71  function PCLEscapeGroup($char, $value) {
72    $this->_character = $char;
73    $this->_value     = $value;
74  }
75
76  function getString() {
77    return $this->_value.$this->_character;
78  }
79
80  function getStringTerminate() {
81    return $this->_value.strtoupper($this->_character);
82  }
83}
84
85/**
86 * Simple escape sequences
87 */
88
89/**
90 * Printer Reset command
91 *
92 * Receipt  of the  Printer Reset  command restores  the  User Default
93 * Environment, deletes  temporary fonts, macros,  user-defined symbol
94 * sets and patterns.  It also prints any partial  pages of data which
95 * may have been received.
96 *
97 * <Escape> E
98 */
99class PCLEscapeReset extends PCLEscapeGenericSimple {
100  function _getEscapedCharacter() { return "E"; }
101}
102
103/**
104 * The Universal  Exit Language (UEL)  command causes the  PCL printer
105 * language to  shut down  and exit. Control  is then returned  to the
106 * Printer Job Language  (PJL). Both PCL 5 and  HP-GL/2 recognize this
107 * command.
108 *
109 * <Escape> % � 1 2 3 4 5 X
110 *
111 * Default = N/A
112 * Range = �12345
113 * This command performs the following actions:
114 * .. Prints all data received before the Exit Language command.
115 * .. Performs a printer reset (same effect as ? E).
116 * .. Shuts down the PCL 5 printer language processor.
117 * .. Turns control over to PJL.
118 */
119class PCLEscapeUEL extends PCLEscapeGenericParametric {
120  function _getEscapedCharacter() { return "%"; }
121  function _getGroupCharacter() { return ""; }
122  function _getGroups() {
123    return array(new PCLEscapeGroup('x',-12345));
124  }
125}
126
127/**
128 * The Number of Copies command designates the number of printed copies of each page.
129 *
130 * <Escape> & l # X
131 *
132 * # = Number of copies (1 to 32767 maximum)
133 * Default = 1 (Configurable from control panel)
134 * Range = 1-32767
135 * (Values 32767 execute as 32767 values 1 are ignored.
136 * Maximum number of copies=99 for LaserJet II, IIP, III, IIID, IIIP and earlier LaserJet printers.)
137 *
138 * This command can be received anywhere within a page and affects
139 * the current page as well as subsequent pages.
140 */
141class PCLEscapeNumberOfCopies extends PCLEscapeGenericParametric {
142  var $_number;
143
144  function PCLEscapeNumberOfCopies($number) {
145    $this->_number = $number;
146  }
147
148  function _getEscapedCharacter() { return "&"; }
149  function _getGroupCharacter() { return "l"; }
150  function _getGroups() {
151    return array(new PCLEscapeGroup('x',$this->_number));
152  }
153}
154
155/**
156 * This command designates either  simplex or duplex printing mode for
157 * duplex printers. Simplex mode prints an image on only one side of a
158 * sheet (page). Duplex mode prints images on both sides of a sheet.
159 *
160 * ? & l # S
161 *
162 * # = 0 - Simplex
163 * 1 - Duplex, Long-Edge Binding
164 * 2 - Duplex, Short-Edge Binding
165 * Default = 0
166 * Range = 0-2 (Other values ignored)
167 *
168 * Long-Edge bound  duplexed pages are  bound along the length  of the
169 * physical page (see Figure 4-2). Short-edge bound duplexed pages are
170 * bound  along the  width  of  the physical  page  (see Figure  4-3).
171 * Selecting long-edge binding usually  results in font rotation. This
172 * may be a concern if available user memory is critical.
173 */
174define('PCL_DUPLEX');
175
176class PCLEscapeSimplexDuplex extends PCLEscapeGenericParametric {
177  var $_duplex;
178
179  function PCLEscapeSimplexDuplex($duplex) {
180    $this->_duplex = $duplex;
181  }
182
183  function _getEscapedCharacter() { return "&"; }
184  function _getGroupCharacter() { return "l"; }
185  function _getGroups() {
186    return array(new PCLEscapeGroup('x',$this->_number));
187  }
188}
189
190/**
191 * Print Job
192 *
193 * Structure of a Typical Job
194 * <Escape>%�12345X UEL Command (exit language)
195 * <Escape>E Printer Reset Command.
196 * Preamble Job Control Commands.
197 * Page 1 Page Control Commands.
198 * Data
199 * Page 2 Page Control Commands.1
200 * Data.
201 * ...
202 * Page n Page Control Commands.
203 * Data.
204 * <Escape>E Printer Reset Command.
205 * <Escape>%�12345X UEL Command (exit language).
206 */
207class PCLPrintJob {
208  function output(&$stream) {
209    $uel = new PCLEscapeUEL();
210    $reset  = new PCLEscapeReset();
211
212    $uel->output($stream);
213    $reset->output($stream);
214    $this->_preamble->output($stream);
215    foreach ($this->_pages as $page) {
216      $page->output($stream);
217    };
218    $reset->output($stream);
219    $uel->output($stream);
220  }
221}
222
223class PCLPrintJobPreamble {
224  function output(&$stream) {
225    // TODO
226  }
227}
228
229class PCLPrintJobPage {
230  var $_control
231  var $_data;
232
233  function output(&$stream) {
234    $this->_control->output($stream);
235    $this->_data->output($stream);
236  }
237}
238
239class OutputDriverPCL extends OutputDriverGeneric {
240
241  /**
242   * Standard output driver interface follows
243   */
244
245  function add_link($x, $y, $w, $h, $target) { /* N/A */ }
246  function add_local_link($left, $top, $width, $height, $anchor) { /* N/A */ }
247  function circle($x, $y, $r) { }
248  function clip() {}
249  function close() { die("Unoverridden 'close' method called in ".get_class($this)); }
250  function closepath() {}
251  function content_type() { die("Unoverridden 'content_type' method called in ".get_class($this));  }
252  function dash($x, $y) { }
253  function decoration($underline, $overline, $strikeout) { }
254  function error_message() { die("Unoverridden 'error_message' method called in ".get_class($this)); }
255
256  function field_multiline_text($x, $y, $w, $h, $value, $field_name) { /* N/A */ }
257  function field_text($x, $y, $w, $h, $value, $field_name) { /* N/A */ }
258  function field_password($x, $y, $w, $h, $value, $field_name) { /* N/A */ }
259  function field_pushbutton($x, $y, $w, $h) { /* N/A */ }
260  function field_pushbuttonimage($x, $y, $w, $h, $field_name, $value, $actionURL) { /* N/A */ }
261  function field_pushbuttonreset($x, $y, $w, $h) { /* N/A */ }
262  function field_pushbuttonsubmit($x, $y, $w, $h, $field_name, $value, $actionURL) { /* N/A */ }
263  function field_checkbox($x, $y, $w, $h, $name, $value) { /* N/A */ }
264  function field_radio($x, $y, $w, $h, $groupname, $value, $checked) { /* N/A */ }
265  function field_select($x, $y, $w, $h, $name, $value, $options) { /* N/A */ }
266
267  function fill() { }
268  function font_ascender($name, $encoding) {}
269  function font_descender($name, $encoding) {}
270  function get_bottom() {}
271  function image($image, $x, $y, $scale) {}
272  function image_scaled($image, $x, $y, $scale_x, $scale_y) { }
273  function image_ry($image, $x, $y, $height, $bottom, $ox, $oy, $scale) { }
274  function image_rx($image, $x, $y, $width, $right, $ox, $oy, $scale) { }
275  function image_rx_ry($image, $x, $y, $width, $height, $right, $bottom, $ox, $oy, $scale) { }
276  function lineto($x, $y) { }
277  function moveto($x, $y) { }
278  function new_form($name) { /* N/A */ }
279  function next_page() { /* N/A */ }
280  function release() { }
281  function restore() { }
282  function save() { }
283  function setfont($name, $encoding, $size) {}
284  function setlinewidth($x) { }
285  function setrgbcolor($r, $g, $b)  { }
286  function set_watermark($text) { }
287  function show_xy($text, $x, $y) {}
288  function stringwidth($string, $name, $encoding, $size) { }
289  function stroke() { }
290}
291?>