# Printer

## Printer Component

Available as of Apache Camel 2.1

The printer component provides a way to direct payloads on a route to a printer. Obviously the payload has to be a formatted piece of payload in order for the component to appropriately print it. The objective is to be able to direct specific payloads as jobs to a line printer in a Apache Camel flow.

This component only supports a producer endpoint.

The functionality allows for the payload to be printed on a default printer, named local, remote or wirelessly linked printer using the javax printing API under the covers.

Maven users will need to add the following dependency to their `pom.xml` for this component:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-printer</artifactId>
        <version>x.x.x</version>
        <!-- use the same version as your Camel core version -->
    </dependency>

## URI format

Since the URI scheme for a printer has not been standardized (the nearest thing to a standard being the IETF print standard) and therefore not uniformly applied by vendors, we have chosen "lpr" as the scheme.

    lpr://localhost/default[?options]
    lpr://remotehost:port/path/to/printer[?options]

You can append query options to the URI in the following format, `?option=value&option=value&...`

## Options

Name | Default Value | Description
--- | --- | ---
`mediaSize` | `MediaSizeName.NA_LETTER` | Sets the stationary as defined by enumeration settings in the `javax.print.attribute.standard.MediaSizeName` API. The default setting is to use North American Letter sized stationary
`copies` | `1` | Sets number of copies based on the `javax.print.attribute.standard.Copies` API
`sides` | `Sides.ONE_SIDED` | Sets one sided or two sided printing based on the `javax.print.attribute.standard.Sides` API
`flavor` | `DocFlavor.BYTE_ARRAY` | Sets `DocFlavor` based on the `javax.print.DocFlavor` API
`mimeType` | `AUTOSENSE` | Sets `mimeTypes` supported by the `javax.print.DocFlavor` API

## Printer Producer

Sending data to the printer is very straightforward and involves creating a producer endpoint that can be sent message exchanges on in route.

## Example 1: Printing text based payloads on a Default printer using letter stationary and one-sided mode

    RouteBuilder builder = new RouteBuilder() {
        public void configure() {
           from(file://inputdir/?delete=true)
           .to("lpr://localhost/default?copies=2" +
               "&flavor=DocFlavor.INPUT_STREAM&" +
               "&mimeType=AUTOSENSE" +
               "&mediaSize=na-letter" +
               "&sides=one-sided")
        }};

## Example 2: Printing GIF based payloads on a Remote printer using A4 stationary and one-sided mode

    RouteBuilder builder = new RouteBuilder() {
        public void configure() {
           from(file://inputdir/?delete=true)
           .to("lpr://remotehost/sales/salesprinter" +
               "?copies=2&sides=one-sided" +
               "&mimeType=GIF&mediaSize=iso-a4" +
               "&flavor=DocFlavor.INPUT_STREAM")
       }};

## Example 3: Printing JPEG based payloads on a Remote printer using Japanese Postcard stationary and one-sided mode

    RouteBuilder builder = new RouteBuilder() {
        public void configure() {
           from(file://inputdir/?delete=true)
           .to("lpr://remotehost/sales/salesprinter" +
               "?copies=2&sides=one-sided" +
               "&mimeType=JPEG" +
               "&mediaSize=japanese-postcard" +
               "&flavor=DocFlavor.INPUT_STREAM")
        }};