Imprimir PDF directamente con Java

En este post te enseñaré cómo enviar un PDF (de internet o local) a una impresora usando el lenguaje de programación Java sin cuadros de confirmación ni diálogos.

De este modo serás capaz de imprimir un PDF de manera automática con Java usando herramientas gratuitas.

Descargando plugin y PDFtoPrinter

Para que esto funcione debemos descargarnos 2 herramientas gratuitas: el plugin PDF y PDFtoPrinter (una vez que abras ese enlace haz clic en download it here). Las mismas deben estar en la misma ubicación y solo debes ejecutar el plugin.

Es decir, debes tener a PDFtoPrinter.exe y plugin_pdf_prod_ARQUITECTURA.exe en la misma carpeta, y después de eso ejecutar plugin_pdf_prod_ARQUITECTURA.exe.

Comprueba que se está ejecutando en el administrador de tareas dentro de “Detalles”

Código Java

Una vez que te has asegurado de que el plugin está ejecutándose entonces puedes probar el siguiente ejemplo donde se imprime un PDF remoto a través de su URL; lo único que tenemos que hacer es hacer una petición GET local así:

public static void ejemploUrl() {
    Map<String, String> parametros = Map.of(
            "urlPdf", "https://parzibyte.github.io/plugin-silent-pdf-print-examples/delgado.pdf",
            "impresora", impresora,
            "serial", serial,
            "grados", grados
    );
    StringBuilder parametrosURL = new StringBuilder();
    parametros.forEach((clave, valor) -> {
        parametrosURL.append(URLEncoder.encode(clave, StandardCharsets.UTF_8))
                .append("=")
                .append(URLEncoder.encode(valor, StandardCharsets.UTF_8))
                .append("&");
    });
    String urlCompleta = direccionServidor + "/url?" + parametrosURL.toString();

    var request = HttpRequest.newBuilder().uri(URI.create(urlCompleta)).GET().build();
    var client = HttpClient.newHttpClient();
    try {
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        int statusCode = response.statusCode();
        String responseBody = response.body();
        System.out.println("Código de estado: " + statusCode);
        System.out.println("Respuesta: " + responseBody);
    } catch (Exception e) {
        System.out.println("Error haciendo petición. Asegúrese de que el plugin se está ejecutando:");
        e.printStackTrace();
    }
}

Fíjate en que al final solo estamos haciendo una petición a http://localhost:8080/url pasándole la URL del PDF, el nombre de la impresora, un serial opcional y la rotación de grados.

El PDF que voy a imprimir está en: https://parzibyte.github.io/plugin-silent-pdf-print-examples/delgado.pdf

Para ahorrar papel estoy imprimiendo con una impresora virtual y queda así:

PDF impreso con Java
PDF impreso con Java

Nota: yo estoy usando NetBeans pero puedes usar cualquier editor, al final lo que importa es el lenguaje de programación.

Obviamente esto funciona también con impresoras físicas, si quieres puedes revisar el ejemplo con JS para ver una foto de un ticket PDF impreso directamente.

Imprimir PDF local con Java

El mismo plugin te permite imprimir un PDF local, es decir, uno que se encuentre en la computadora del usuario.

Veamos el siguiente ejemplo en donde ahora hacemos una petición a http://localhost:8080/ pero ahora indicamos la ruta absoluta del PDF con el parámetro nombrePdf así:

public static void ejemploLocal() {
    Map<String, String> parametros = Map.of(
            "nombrePdf", "C:\\Users\\parzibyte\\Desktop\\delgado.pdf",
            "impresora", impresora,
            "serial", serial,
            "grados", grados
    );
    StringBuilder parametrosURL = new StringBuilder();
    parametros.forEach((clave, valor) -> {
        parametrosURL.append(URLEncoder.encode(clave, StandardCharsets.UTF_8))
                .append("=")
                .append(URLEncoder.encode(valor, StandardCharsets.UTF_8))
                .append("&");
    });
    String urlCompleta = direccionServidor + "/?" + parametrosURL.toString();

    var request = HttpRequest.newBuilder().uri(URI.create(urlCompleta)).GET().build();
    var client = HttpClient.newHttpClient();
    try {
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        int statusCode = response.statusCode();
        String responseBody = response.body();
        System.out.println("Código de estado: " + statusCode);
        System.out.println("Respuesta: " + responseBody);
    } catch (Exception e) {
        System.out.println("Error haciendo petición. Asegúrese de que el plugin se está ejecutando:");
        e.printStackTrace();
    }
}

De este modo tú decides cómo imprimir un PDF con Java, ya sea que el mismo se genere en internet, en tu servidor local o exista en la computadora del usuario.

Código completo

Si quieres revisar los imports y ver el código completo te lo dejo en GitHub: https://github.com/parzibyte/imprimir-pdf-java

Próximos pasos

Ya te mostré el plugin, ahora tú puedes integrarlo en cualquier lugar pues al final solo es un servidor web local. Te dejo con la documentación del plugin para PDF.

No olvides que con esto vas a poder imprimir en impresoras térmicas, virtuales o de tinta. También aprovecho para enseñarte a usar comandos ESC POS con Java.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

2 comentarios en “Imprimir PDF directamente con Java”

Dejar un comentario