java.awt.print
consists of these PrinterJob methods:
PrintService
or
StreamPrintServiceFactory
objects depending on the method.PrintService
on a PrinterJob
.pageDialog
method
that takes a PrintRequestAttributeSet
parameter.printDialog
method that takes a PrintRequestAttributeSet
parameter.print
method that
takes a PrintRequestAttributeSet
parameter.printDialog
and pageDialog
methods take an attribute set, users can
edit the initial
attribute settings from the dialogs.
Applications can use
PrinterJob
to print 2D graphics to a printer or to an output
stream. The lookupPrintServices
method returns an array of
PrintService
objects, each of which represents a printer that can
print 2D graphics. The lookupStreamPrintServices
method returns an
array of StreamPrintServiceFactory
objects, each of which can
return a StreamPrintService
. An application uses the
StreamPrintService
to send print data to an output stream. As with
printing documents, applications can use a StreamPrintService
to
transcode 2D graphics to other formats. This section discusses
using PrinterJob
to submit 2D graphics to a printer and to an
output stream.
pageDialog
,
printDialog
, and print
methods allow an application to initialize
print settings and pass these settings to a dialog so that a user
can update the settings before submitting the print request, as
demonstrated by this code sample:
// Step 1: Set up initial print settings. PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); // Step 2: Obtain a print job. PrinterJob pj = PrinterJob.getPrinterJob(); // Step 3: Find print services. PrintService []services = PrinterJob.lookupPrintServices(); if (services.length > 0) { System.out.println("selected printer: " + services[0]); try { pj.setPrintService(service[0]); // Step 2: Pass the settings to a page dialog and print dialog. pj.pageDialog(aset); if (pj.printDialog(aset)) { // Step 4: Update the settings made by the user in the dialogs. // Step 5: Pass the final settings into the print request. pj.print(aset); } } catch (PrinterException(pe)) { System.err.println(pe): } }See Example: Print2DPrinterJob.java for the complete application.
Note that Step 4
in this code sample does not seem to correspond to any particular
line of code. In fact, the user updates the print settings in the
dialogs, and the updated settings are saved in the
PrintRequestAttributeSet
, aset
.
One problem with
using Java 2D and the Java Print Service together is that some
attributes, such as number of copies, are defined in both APIs. If
such an attribute is specified in a PrintRequestAttributeSet
, it
takes precedence over the same attribute specified in the
PrinterJob
. Note that if a user updates the number of copies in a
print dialog, the PrinterJob
is automatically updated to reflect
that, which reconfirms the existing behavior.
The PageFormat
specification also overlaps with the Java Print Service Media
,
MediaPrintableArea
, and OrientationRequested
attributes. If an
application uses the Printable
interface and the
print(PrintRequestAttributeSet)
method, the media, orientation, and
imageable area attributes contained in the attribute set are added
to a new PageFormat
, which is passed to the print
method of the
Printable
object. If an application uses the Pageable
interface,
the PageFormat
does not change.
PrinterJob
and a StreamPrintService
to send print data to an
output stream. This example is similar to the example in the
previous section, except a StreamPrintService
is used in place of a
PrintService
:
PrinterJob job = PrinterJob.getPrinterJob(); String psMimeType = "application/postscript"; FileOutputStream outstream; StreamPrintService psPrinter; StreamPrintServiceFactory []spsFactories = PrinterJob.lookupStreamPrintServices(psMimeType); if (factories.length > 0) { try { outstream = new File("out.ps"); psPrinter = factories[0].getPrintService(fos); // psPrinter can now be set as the service on a PrinterJob } catch (FileNotFoundException e) { } } job.setPrintService(service[0]); // if app wants to specify this printer. PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(new Copies(2)); job.print(aset); }