Java 调用打印机打印PDF文件


添加依赖

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>3.0.2</version>
</dependency>

编写代码

package cn.zzzykj.demo;

import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;
import sun.print.PageableDoc;

import javax.print.*;
import javax.print.attribute.standard.PrinterIsAcceptingJobs;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

/**
 * @author Lenovo
 */
@Slf4j
public class PrintHelper {

    public static final String PRINT_NAME = "xxx";
    public static final String HTTP_PREFIX = "http";

    private static final TimedCache<String, PrintJobState> JOB_STATE_CACHE = CacheUtil.newTimedCache(TimeUnit.HOURS.toMillis(1));


    public static int status() {
        PrintService service = findPrint();
        if (service == null) {
            return 6;
        }
        PrinterIsAcceptingJobs attribute = service.getAttribute(PrinterIsAcceptingJobs.class);
        return attribute.getValue() == 1 ? 0 : 7;
    }

    public static boolean printFile(String path, String fileName) {
        PrintService service = findPrint();
        try (
                PDDocument pdDocument = Loader.loadPDF(getBytes(path));
        ) {
            PDFPageable pageable = new PDFPageable(pdDocument);
            int pages = pageable.getNumberOfPages();
            PrintJobState jobState = new PrintJobState(pages, 1, path, fileName);
            JOB_STATE_CACHE.put(StrUtil.isNotEmpty(fileName) ? fileName : "", jobState);
            PageableDoc doc = new PageableDoc(pageable);
            DocPrintJob job = service.createPrintJob();
            job.print(doc, null);
            return true;
        } catch (IOException e) {
            log.error("Failed to load PDF file...");
            return false;
        } catch (PrintException e) {
            log.error("Abnormal submission of printing task...");
            return false;
        }

    }


    public static PrintJobState jobState(String fileName) {
        if (fileName == null) {
            fileName = "";
        }
        return JOB_STATE_CACHE.get(fileName);
    }

    private static PrintService findPrint() {
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
        Optional<PrintService> hpPrint = Arrays.stream(services).filter(s -> s.getName().contains(PRINT_NAME)).findFirst();
        return hpPrint.orElse(null);
    }

    private static InputStream getInputStream(String path) throws IOException {
        InputStream stream;
        if (path.toLowerCase().startsWith(HTTP_PREFIX)) {
            URL url = new URL(path);
            stream = url.openStream();
        } else {
            stream = Files.newInputStream(new File(path).toPath());
        }
        return stream;
    }

    private static byte[] getBytes(String path) throws IOException {
        if (path.toLowerCase().startsWith(HTTP_PREFIX)) {
            URL url = new URL(path);
            return IoUtil.readBytes(url.openStream());
        } else {
            return FileUtil.readBytes(path);
        }
    }

    @Data
    @Accessors(chain = true)
    @NoArgsConstructor
    @AllArgsConstructor
    public static class PrintJobState {
        private Integer total;
        private Integer curr;
        private String name;
        private String path;
    }

}

评论已关闭