  <sect1 id="printing">
    <title>Printing in Wine</title>
    <para>How to print documents in Wine...</para>

    <sect2 id="wine-printing">
      <title>Printing</title>

      <para>
        Written by &name-huw-davies; <email>&email-huw-davies;</email>
      </para>
      <para>
        (Extracted from <filename>wine/documentation/printing</filename>)
      </para>

      <para>
        Printing in Wine can be done in one of two ways:
      </para>
      <orderedlist>
        <listitem>
          <para>
            Use the builtin Wine PostScript driver (+ ghostscript to produce
            output for non-PostScript printers).
          </para>
        </listitem>
        <listitem>
          <para>Use an external windows 3.1 printer driver (outdated, probably won't get supported any more).</para>
        </listitem>
      </orderedlist>

      <para>
        Note that at the moment WinPrinters (cheap, dumb printers that require
        the host computer to explicitly control the head) will not work with
	their Windows printer drivers.  It is unclear whether they ever will.
      </para>

      <sect3>
        <title>Builtin Wine PostScript driver</title>
        <para>
          Enables printing of PostScript files via a driver built into Wine. See
          below for installation instructions. The code for the PostScript
	  driver is in <filename>dlls/wineps/</filename>.
        </para>
	<para>
	  The driver behaves as if it were a DRV file called
	  <filename>wineps.drv</filename> which at the moment is built into
	  Wine.
	  Although it mimics a 16 bit driver, it will work with both 16 and 32
	  bit apps, just as win9x drivers do.
	</para>
      </sect3>

      <sect3>
        <title>External printer drivers (non-working as of Jul 8, 01)</title>
        <para>
          At present only 16 bit drivers will work (note that these include
	  win9x drivers).  To use them, add
        </para>
        <screen>
printer=on
        </screen>
        <para>
          to the [wine] section of the wine config file. This lets
          <function>CreateDC</function> proceed if its driver argument is a 16
          bit driver. You will probably also need to add
        </para>
        <screen>
"TTEnable" = "0" "TTOnly" = "0"
        </screen>
        <para>
          to the [TrueType] section of <filename>~/.wine/config</filename>. The code for
          the driver interface is in <filename>graphics/win16drv</filename>.
        </para>
      </sect3>

      <sect3>
        <title>Spooling</title>
        <para>
          Spooling is rather primitive. The [spooler] section of
          the wine config file maps a port (e.g.
          <systemitem>LPT1:</systemitem>) to a file or a command via a pipe. For
          example the following lines
        </para>
        <screen>
"LPT1:" = "foo.ps"
"LPT2:" = "|lpr"
        </screen>
        <para>
          map <systemitem>LPT1:</systemitem> to file <filename>foo.ps</filename>
          and <systemitem>LPT2:</systemitem> to the <command>lpr</command>
          command. If a job is sent to an unlisted port, then a file is created
          with that port's name; e.g. for <systemitem>LPT3:</systemitem> a file
          called <systemitem>LPT3:</systemitem> would be created.
        </para>
	<para>
	  There are now also virtual spool queues called
	  <systemitem>LPR:printername</systemitem>, which send the data
	  to <command>lpr -Pprintername</command>. You do not need to
	  specify those in the config file, they are handled automatically by
	  <filename>dlls/gdi/printdrv.c</filename>.
	</para>
      </sect3>
    </sect2>

    <sect2 id="psdriver">
      <title>The Wine PostScript Driver</title>

      <para>
        Written by &name-huw-davies; <email>&email-huw-davies;</email>
      </para>
      <para>
        (Extracted from <filename>wine/documentation/psdriver</filename>)
      </para>

      <para>
        This allows Wine to generate PostScript files without
        needing an external printer driver. Wine in this case uses the
	system provided PostScript printer filters, which almost all use
	ghostscript if necessary. Those should be configured during the
	original system installation or by your system administrator.
      </para>

      <sect3>
        <title>Installation</title>
	<sect4>
	  <title>Installation of CUPS printers</title>
	  <para>
	    If you are using CUPS, you do not need to configure .ini or
	    registry entries, everything is autodetected.
	  </para>
	</sect4>
	<sect4>
	  <title>Installation of LPR /etc/printcap based printers</title>
	  <para>
	    If your system is not yet using CUPS, it probably uses LPRng
	    or a LPR based system with configuration based on <filename>/etc/printcap</filename>.
	  </para>
	  <para>
	    If it does, your printers in <filename>/etc/printcap</filename>
	    are scanned with a heuristic whether they are PostScript capable
	    printers and also configured mostly automatic.
	  </para>
	  <para>
	    Since WINE cannot find out what type of printer this is, you
	    need to specify a PPD file in the [ppd] section of
	    <filename>~/.wine/config</filename>. Either use the shortcut
	    name and make the entry look like:
	  </para>
	  <screen>
	    [ppd]
	    "ps1" = "/usr/lib/wine/ps1.ppd"
	  </screen>
	  <para>
	    Or you can specify a generic PPD file that is to match for all
	    of the remaining printers. A generic PPD file can be found in
	    <filename>documentation/samples/generic.ppd</filename>.
	  </para>
	</sect4>
	<sect4>
	  <title>Installation of other printers</title>
	  <para>
	    You do not need to do this if the above 2 sections apply, only if
	    you have a special printer.
	  </para>
	  <screen>
  Wine PostScript Driver=WINEPS,LPT1:
	  </screen>
	  <para>
	    to the [devices] section and
	  </para>
	  <screen>
  Wine PostScript Driver=WINEPS,LPT1:,15,45
	  </screen>
	  <para>
	    to the [PrinterPorts] section of <filename>win.ini</filename>,
	    and to set it as the default printer also add
	  </para>
	  <screen>
  device = Wine PostScript Driver,WINEPS,LPT1:
	  </screen>
	  <para>
	    to the [windows] section of <filename>win.ini</filename>.
	  </para>
	  <para>
	    You also need to add certain entries to the registry.
	    The easiest way to do this is to customise the contents of
	    <filename>documentation/psdrv.reg</filename> (see below) and use the
	    Winelib program <command>programs/regapi/regapi</command>.  For
	    example, if you have installed the Wine source tree in
	    <filename>/usr/src/wine</filename>, you could use the following
	    series of commands:
	    <itemizedlist>
	      <listitem>
		<para>
		  <userinput>cp /usr/src/wine/documentation/psdrv.reg ~</userinput>
		</para>
	      </listitem>
	      <listitem>
		<para><userinput>vi ~/psdrv.reg</userinput></para>
	      </listitem>
	      <listitem>
		<para>
		  Edit the copy of <filename>psdrv.reg</filename> to suit your
		  requirements.  At a minimum, you must specify a PPD file for
		  each printer.
		</para>
	      </listitem>
	      <listitem>
		<para>
		  <userinput>regapi setValue &lt; ~/psdrv.reg</userinput>
		</para>
	      </listitem>
	    </itemizedlist>
	  </para>
	</sect4>
	<sect4>
	  <title>Required configuration for all printer types</title>
	  <para>
	    You won't need Adobe Font Metric (AFM) files for the (type 1 PostScript)
	    fonts that you wish to use any more.
	    Wine now has this information builtin.
	  </para>
	  <para>
	    You'll need a PPD file for your printer.  This describes
	    certain characteristics of the printer such as which fonts are
	    installed, how to select manual feed etc. Adobe has many of
	    these on its website, have a look in
	    <ulink url="ftp://ftp.adobe.com/pub/adobe/printerdrivers/win/all/">
	    ftp://ftp.adobe.com/pub/adobe/printerdrivers/win/all/</ulink>.
	    See above for information on configuring the driver to use this
	    file.
	  </para>
	  <para>
	    To enable colour printing you need to have the
	    <literal>*ColorDevice</literal> entry in the PPD set to
	    <literal>true</literal>, otherwise the driver will generate
	    greyscale.
	  </para>
	  <para>
	    Note that you need not set <literal>printer=on</literal> in
	    the [wine] section of the wine config file, this
	    enables printing via external printer drivers and does not
	    affect the builtin PostScript driver.
	  </para>
	  <para>
	    If you're lucky you should now be able to produce PS files
	    from Wine!
	  </para>
	  <para>
	    I've tested it with win3.1 notepad/write, Winword6 and
	    Origin4.0 and 32 bit apps such as win98 wordpad, Winword97,
	    Powerpoint2000 with some degree of success - you should be
	    able to get something out, it may not be in the right place.
	  </para>
	</sect4>
      </sect3>

      <sect3>
        <title>TODO / Bugs</title>

        <itemizedlist>
          <listitem>
            <para>
              Driver does read PPD files, but ignores all constraints
              and doesn't let you specify whether you have optional
              extras such as envelope feeders. You will therefore find
              a larger than normal selection of input bins in the
              print setup dialog box. I've only really tested ppd
              parsing on the <filename>hp4m6_v1.ppd</filename> file.
            </para>
          </listitem>
          <listitem>
            <para>No TrueType download.</para>
          </listitem>
          <listitem>
            <para>StretchDIBits uses level 2 PostScript.</para>
          </listitem>
          <listitem>
            <para>AdvancedSetup dialog box.</para>
          </listitem>
          <listitem>
            <para>Many partially implemented functions.</para>
          </listitem>
          <listitem>
            <para>ps.c is becoming messy.</para>
          </listitem>
          <listitem>
            <para>
              Notepad often starts text too far to the left depending
              on the margin settings. However the win3.1
              <filename>pscript.drv</filename> (under wine) also does
              this.
            </para>
          </listitem>
          <listitem>
            <para>Probably many more...</para>
          </listitem>
        </itemizedlist>

        <para>
          Please contact me if you want to help so that we can avoid duplication.
        </para>
        <para>
          &name-huw-davies; <email>&email-huw-davies;</email>
        </para>
      </sect3>
    </sect2>
  </sect1>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-parent-document:("wine-doc.sgml" "set" "book" "chapter" "")
End:
-->
