B4J Code Snippet Printing pdf documents

For all those that need to print complete pdf documents, specifically from a pdf viewer (PDFBoxWrapper)

   ' For testing
    Dim mp As Map=GetPrinters
    For n=0 To mp.Size-1
         Dim s As String = mp.GetKeyAt(n)
         Dim m As Map=mp.GetValueAt(n)
        If s = "EPSON WF-2650 Series" Then ' print to arbitrary printer in list to test
            Dim obj As Object=m.GetValueAt(0) ' print using tray at index 0
            PrintPDFDocument("c:\temp\All_D.pdf",s,obj,2) ' "EPSON WF-2650 Series" , "PDFCreator"
        End If

Public Sub PrintPDFDocument(pdffile As String,printername As String,mtray As Object,copies as Int) As Boolean
    Dim r As Boolean=False
    If File.Exists("",pdffile) Then
        r=asJO(Me).RunMethod("PrintPDFDoc",Array As Object(pdffile,printername,mtray,copies))
    End If
    Return r
End Sub

Public Sub GetPrinters() As Map
    Dim m As Map
    m=asJO(Me).RunMethod("getPrinterList", Array As String())
    Return m
End Sub
Sub asJO(o As JavaObject) As JavaObject
    Return o
End Sub

#if java

import java.lang.reflect.*;
import java.awt.print.PrinterJob;
import java.io.File;

import javax.print.*;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaTray;
import javax.print.attribute.standard.PrinterName;
import javax.print.attribute.standard.Copies;
import java.awt.*;
import java.awt.print.PageFormat;
import java.awt.print.Printable;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;

import java.io.Console;
//import java.util.HashMap;
//import java.util.Map;
import anywheresoftware.b4a.*;
import anywheresoftware.b4a.objects.collections.Map;
public static Boolean PrintPDFDoc(String docpath,String printername,MediaTray Tray,Integer copies)  throws Exception {
    Boolean result=false;
    PDDocument document = new PDDocument();
        document = PDDocument.load(new File(docpath));
        PrintService myPrintService = findPrintService(printername);
        if (myPrintService != null) {
            PrintRequestAttributeSet pset = new HashPrintRequestAttributeSet();
            PrinterJob job = PrinterJob.getPrinterJob();
            if (Tray!=null)  {
                 MediaTray selectedTray = (MediaTray) Tray;
            if (copies>0)  {
                 pset.add(new Copies(copies));
            } else {
                 pset.add(new Copies(1));

            job.setPageable(new PDFPageable(document));
    } catch (Exception e) {
    return result;


private static PrintService findPrintService(String printerName) {
    PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
    for (PrintService printService : printServices) {
        if (printService.getName().trim().equals(printerName)) {            
            return printService;        
    return null;

public static Object getPrinterList() throws Exception
    Map mpPrt = new Map();
    PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
    for (PrintService printService : printServices) {
        Map mp = new Map();
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        Object o = printService.getSupportedAttributeValues(Media.class, flavor, null);
        if (o != null && o.getClass().isArray()) {
            for (Media media : (Media[]) o) {
                if (media instanceof MediaTray) {
                   // System.out.println(media.getValue() + " : " + media;
                   mp.Put(media.getValue(), media);
        String pn = printService.getName().trim();
    return mpPrt.getObject() ;

#End If

There is probably a way to print using the javafx.print I got fed up trying to figure out the methods in the library, let me know if is possible...
Last edited:


Licensed User
Longtime User
Added copies option, fixed error job.print(pset);


Licensed User
Longtime User
There is probably a way to print using the javafx.print
Hi Andrew,

The Javafx Print API only provides for printing the content of a Javafx node. So you would have to display the PDF in a node before you can print it, which is not always what you want to do. It looks like your method is a much better fit in this case.