Print PDF File and View Document in CUBA window

Hi Team

I want to print a document in a PDF format from the Application programmatically, I would also appreciate if you could help with how to accomplish this task using WebBrowserTools as well. Has anyone done this to guide me?

I have another function I would like to have implemented that is to View a document, in a case where a user does not want to print but view the contents of the document and close it. Please guide me on this one as well.

Thank you for your help.

Hello @fluidsoftwaredevelopers,

here my bean to print a PDF from application:

mport com.haulmont.cuba.core.entity.FileDescriptor;
import com.haulmont.cuba.core.global.FileLoader;
import com.haulmont.cuba.core.global.FileStorageException;
import com.haulmont.cuba.core.global.Messages;
import org.apache.commons.lang3.StringUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;
import org.slf4j.Logger;
import org.springframework.stereotype.Service;

import javax.inject.Inject;
import javax.print.PrintServiceLookup;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;


@Service(PrintService.NAME)
public class PrintServiceBean implements PrintService {

    @Inject
    private FileLoader fileLoader;

    @Inject
    private Messages messages;

    @Inject
    private Logger log;


    @Override
    public List<String> getPrinterNames() {
        final javax.print.PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        return Arrays.stream(printServices)
                .map(javax.print.PrintService::getName)
                .map(String::trim)
                .sorted()
                .collect(Collectors.toList());
    }



    @Override
    public String getDefaultPrinterName() {
        final javax.print.PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
        return printService != null ? printService.getName() : null;
    }


    @Override
    public void print(FileDescriptor fd, String printerName, int copies) {
        log.info("Printing {} on printer \"{}\"", fd, printerName);
        Objects.requireNonNull(fd);
        Objects.requireNonNull(printerName);

        final javax.print.PrintService printService = findPrintService(printerName);
        if (printService == null) {
            throw new PrintException(messages.formatMessage(getClass(), "printerNotFound", printerName));
        }

        try {
            final InputStream inputStream = fileLoader.openStream(fd);
            final PDDocument document = PDDocument.load(inputStream);
            final PrinterJob job = PrinterJob.getPrinterJob();
            job.setPageable(new PDFPageable(document));
            job.setPrintService(printService);
            job.setCopies(copies);
            job.print();
        } catch (FileStorageException | IOException | PrinterException e) {
            throw new PrintException(e);
        }
    }


    private javax.print.PrintService findPrintService(String printerName) {
        if (StringUtils.isBlank(printerName)) {
            return PrintServiceLookup.lookupDefaultPrintService();
        }
        final javax.print.PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        return Arrays.stream(printServices)
                .filter(ps -> printerName.equals(ps.getName().trim()))
                .findAny()
                .orElse(null);
    }

}

If the server is a Linux system you need to install CUPS and the command /usr/bin/lpr.

Then edit the file /etc/cups/cupsd.conf and add or comment out the following entries and
then restart CUPS:

Listen *:631
Listen 192.168.166.211:631
WebInterface Yes

Afterwards, the printer can be created via the address ‘http://localhost:631’, if it was not found automatically. In case of external access, port 631 can also be redirected via SSH.

Greetings
Andreas

4 Likes