[[lpr-component]]
= Printer Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-printer/src/main/docs/lpr-component.adoc
:docTitle: Printer
:artifactId: camel-printer
:description: Send print jobs to printers.
:since: 2.1
:supportLevel: Stable
:component-header: Only producer is supported

*Since Camel {since}*

*{component-header}*

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
camel flow.

This component only supports a camel producer endpoint.

The functionality allows for the payload to be printed on a default
printer, named local, remote or wireless 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:

[source,xml]
------------------------------------------------------------
<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.

[source,java]
-----------------------------------------------
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


// component options: START
The Printer component supports 2 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
|===
// component options: END



// endpoint options: START
The Printer endpoint is configured using URI syntax:

----
lpr:hostname:port/printername
----

with the following path and query parameters:

=== Path Parameters (3 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *hostname* | *Required* Hostname of the printer |  | String
| *port* | Port number of the printer |  | int
| *printername* | Name of the printer |  | String
|===


=== Query Parameters (13 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *copies* (producer) | Number of copies to print | 1 | int
| *docFlavor* (producer) | Sets DocFlavor to use. |  | DocFlavor
| *flavor* (producer) | Sets DocFlavor to use. |  | String
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *mediaSize* (producer) | Sets the stationary as defined by enumeration names in the javax.print.attribute.standard.MediaSizeName API. The default setting is to use North American Letter sized stationary. The value's case is ignored, e.g. values of iso_a4 and ISO_A4 may be used. | na-letter | String
| *mediaTray* (producer) | Sets MediaTray supported by the javax.print.DocFlavor API, for example upper,middle etc. |  | String
| *mimeType* (producer) | Sets mimeTypes supported by the javax.print.DocFlavor API |  | String
| *orientation* (producer) | Sets the page orientation. The value can be one of: portrait, landscape, reverse-portrait, reverse-landscape | portrait | String
| *printerPrefix* (producer) | Sets the prefix name of the printer, it is useful when the printer name does not start with //hostname/printer |  | String
| *sendToPrinter* (producer) | etting this option to false prevents sending of the print data to the printer | true | boolean
| *sides* (producer) | Sets one sided or two sided printing based on the javax.print.attribute.standard.Sides API. The value can be one of: one-sided, duplex, tumble, two-sided-short-edge, two-sided-long-edge | one-sided | String
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
|===
// endpoint options: END

== Sending Messages to a Printer

=== 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.

== Usage Samples

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

[source,java]
-----------------------------------------------
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

[source,java]
--------------------------------------------------
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

[source,java]
--------------------------------------------------
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")
    }};
--------------------------------------------------

include::camel-spring-boot::page$printer-starter.adoc[]
