Spring Integration Print Support
================================
## Overview
The *Spring Integration Print* allows you to print payloads using the [Java Print Service][]. As such one *Outbound Channel Adapter* is provided.
## Requirements
This module depends by default on Spring Integration 2.2. When using this module, please be aware that printing using [Java Print Service] can be unpredictable depending on the uses platform and the used printer. For some more details, please see:
* https://hillert.blogspot.com/2011/12/java-print-service-frustrations.html
Currently the Print Support has been tested using a *Brother HL-4070CDW* which exhibits several issues such as the inability to execute a print job that prints more than one copy for each page. If you use the Print Module, please report back any compatibility issues with your used printers.
## Dependency Declaration
### Gradle
dependencies {
…
compile "org.springframework.integration:spring-integration-print:1.0.0.BUILD-SNAPSHOT"
…
}
### Maven
…
org.springframework.integration
spring-integration-print
1.0.0.BUILD-SNAPSHOT
…
## Print Outbound Channel Adapter
The *Print Outbound Channel Adapter* is implemented using the *PrintMessageHandler* class. It in turn delegates to the *PrintServiceExecutor* class. The *PrintServiceExecutor* is responsible for initializing the Java *[PrintService][]*. As such, you can initialize the *PrintServiceExecutor* with providing a:
* Printer Name
* Custom implementation of the *[PrintService][]* interface (Useful for testing)
If you provide neither a printer name nor an implementation of the *[PrintService][]* interface, then the systems default printer is chosen.
The following properties can be set on the *Print Outbound Channel Adapter*:
### printJobName
*Optional* property that let's you specify the name of the print job as it is added to the print queue. Under the covers, this property will create a *javax.print.attribute.standard.JobName* and add it to the respective *PrintRequestAttributeSet*. This property is not used, if not specified (No explicit default value).
### mediaSizeName
*Optional* property that let's you specify the [MediaSizeName][]. Under the covers, this property will add the provided [MediaSizeName][] to the respective *PrintRequestAttributeSet*. This property is not used, if not specified (No explicit default value).
### sides
Let's you specify how the pages are are printed to the selected medium, e.g. duplex or one-sided. Under the covers, this property will add the provided [Sides][] instance to the respective *PrintRequestAttributeSet*. This property is not used, if not specified (No explicit default value).
### copies
Let's you specify an integer value that indicates how many time each print page shall be printed. Under the covers, this property will add a [Copies][] instance to the respective *PrintRequestAttributeSet*. This property is not used, if not specified (No explicit default value).
### mediaTray
Let's you specify the media tray/bin for the print job. This property can be used instead of providing the *mediaSizeName* property. Under the covers, this property will add the provided [MediaTray][] instance to the respective *PrintRequestAttributeSet*. This property is not used, if not specified (No explicit default value).
### chromaticity
Let's you specify whether you want to do monochrome or color printing. Under the covers, this property will add the provided [Chromaticity][] instance to the respective *PrintRequestAttributeSet*. This property is not used, if not specified (No explicit default value).
### docFlavor
Let's you specify the [DocFlavor]. If not specified, this property will default to *DocFlavor.STRING.TEXT_PLAIN*.
**IMPORTANT!** Every property is validated against the to be used [Java Print Service]. Therefore, if the selected [Java Print Service] is not supported, an *IllegalArgumentException* will be thrown.
### Determining you printer capabilities.
In order to get some indication what capabilities are supported by your printer, you may want to too look at the *PrintServiceExecutor*'s *getPrinterInfo()* method. When executed, it returns a list of:
* Supported [DocFlavor][]s
* Supported Attribute Categories
* Supported [Print Attribute][]s
## Namespace Support
*Spring Integration* also provides XML Namespace support for the Print support. Simply add the following Namespace declaration:
…
An example of declaring a *Print Outbound Channel Adapter* is shown below:
[Java Print Service]: https://docs.oracle.com/javase/6/docs/technotes/guides/jps/index.html
[PrintService]: https://docs.oracle.com/javase/6/docs/api/javax/print/PrintService.html
[Chromaticity]: https://docs.oracle.com/javase/6/docs/api/javax/print/attribute/standard/Chromaticity.html
[Copies]: https://docs.oracle.com/javase/6/docs/api/javax/print/attribute/standard/Copies.html
[DocFlavor]: https://docs.oracle.com/javase/6/docs/api/javax/print/DocFlavor.html
[MediaTray]: https://docs.oracle.com/javase/6/docs/api/javax/print/attribute/standard/MediaTray.html
[Print Attribute]: https://docs.oracle.com/javase/6/docs/api/javax/print/attribute/Attribute.html
[MediaSizeName]: https://docs.oracle.com/javase/6/docs/api/javax/print/attribute/standard/MediaSizeName.html
[Sides]: https://docs.oracle.com/javase/6/docs/api/javax/print/attribute/standard/Sides.html