From 5978de5534ed8a49f72f899ecddd7727c6a8be95 Mon Sep 17 00:00:00 2001 From: lifangliang Date: Mon, 4 Aug 2025 17:13:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(printer):=20=E6=89=93=E5=8D=B0=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持封面彩色打印,内容灰色打印 --- .../main/config/PrintServerConfig.java | 1 + .../main/domain/bo/PrintOption.java | 4 +- .../printserver/main/utils/PdfPrinter.java | 61 +++++++++++++------ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java b/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java index 07f79f9..dfecbdc 100644 --- a/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java +++ b/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java @@ -50,6 +50,7 @@ public class PrintServerConfig { // 确定配置文件路径 String userHome = System.getProperty("user.home"); configFile = new File(userHome + File.separator + ".goeing" + File.separator + CONFIG_FILE); +// System.out.println(configFile.getAbsolutePath()); // 确保目录存在 if (!configFile.getParentFile().exists()) { diff --git a/src/main/java/com/goeing/printserver/main/domain/bo/PrintOption.java b/src/main/java/com/goeing/printserver/main/domain/bo/PrintOption.java index 4593e90..4a78aeb 100644 --- a/src/main/java/com/goeing/printserver/main/domain/bo/PrintOption.java +++ b/src/main/java/com/goeing/printserver/main/domain/bo/PrintOption.java @@ -13,12 +13,12 @@ public class PrintOption { private String size; /** - * 打印颜色模式,如"Full Color", "Monochrome"等 + * 打印颜色模式,如"Color", "Monochrome"等 */ private String color; /** - * 打印面设置,如"One-Sided", "Double-Sided"等 + * 打印面设置,如"Single-Sided", "Double-Sided"等 */ private String sides; diff --git a/src/main/java/com/goeing/printserver/main/utils/PdfPrinter.java b/src/main/java/com/goeing/printserver/main/utils/PdfPrinter.java index 71980c6..b3ee12a 100644 --- a/src/main/java/com/goeing/printserver/main/utils/PdfPrinter.java +++ b/src/main/java/com/goeing/printserver/main/utils/PdfPrinter.java @@ -3,6 +3,7 @@ package com.goeing.printserver.main.utils;// src/main/java/com/example/printer/P import cn.hutool.core.util.StrUtil; import com.goeing.printserver.main.domain.bo.PrintOption; import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.printing.PDFPageable; import org.apache.pdfbox.printing.Orientation; import org.apache.pdfbox.printing.PDFPrintable; @@ -68,13 +69,43 @@ public class PdfPrinter { public static void print(String pdfPath, String printerName, PrintOption option) throws Exception { // 参数验证 validatePrintParameters(pdfPath, printerName, option); - + PrinterJob job = getPrintServiceByName(printerName); // 加载PDF文档并执行打印 PDDocument document = null; try { document = PDDocument.load(new File(pdfPath)); - PrinterJob job = getPrintServiceByName(printerName); - setPageStyle(document, job, option); + + String color = option.getColor(); + //如果是封面彩打 那么要把封面和 内容分开打印 就做两个打印任务 先打封面 再打内容 + if (color.equalsIgnoreCase("Cover Letter Color Only")){ + + + PDDocument cover = new PDDocument(); + cover.addPage(document.getPage(0)); + cover.close(); + + PDDocument content = new PDDocument(); + for (int i = 0; i < document.getNumberOfPages(); i++) { + //第一页是封面 + if (i==0){ + continue; + } + content.addPage(document.getPage(i)); + } + content.close(); + //打印 封面和内容 + option.setColor("color"); + setPageStyle(cover, job, option); + option.setColor("black & white"); + setPageStyle(content, job, option); + + }else { + //全部打印 + setPageStyle(document, job, option); + } + + + } finally { // 确保文档被关闭 if (document != null) { @@ -182,12 +213,8 @@ public class PdfPrinter { // 设置页面方向 Orientation pdfOrientation = getPdfOrientation(option.getOrientation()); - // 获取纸张尺寸 - String size = option.getSize() != null ? option.getSize() : "Letter"; - double[] dimensions = getPaperDimensions(size); - - // 创建自定义Paper对象 - Paper paper = createPaper(dimensions[0], dimensions[1], option.getMargin()); + // 设置纸张 A4 Letter等 + Paper paper = createPaperFromOption(option); // 创建PageFormat对象 PageFormat pageFormat = new PageFormat(); @@ -204,7 +231,6 @@ public class PdfPrinter { Book book = new Book(); // 将所有页面添加到Book中,使用相同的PageFormat - // 根据页面方向选择适当的缩放模式 Scaling scaling; if (option.getSize() != null) { // 如果用户指定了纸张大小,使用适应页面的缩放模式 @@ -215,7 +241,7 @@ public class PdfPrinter { } // 创建PDFPrintable对象,设置居中和显示页面边框 - PDFPrintable printable = new PDFPrintable(document, scaling, false, 0, true); + PDFPrintable printable = new PDFPrintable(document, scaling, false, 300, true); book.append(printable, pageFormat, document.getNumberOfPages()); // 应用自定义页面设置到打印作业 @@ -234,8 +260,7 @@ public class PdfPrinter { */ public static Paper createPaperFromOption(PrintOption option) { // 获取纸张尺寸 - String size = option.getSize() != null ? option.getSize() : "Letter"; - double[] dimensions = getPaperDimensions(size); + double[] dimensions = getPaperDimensions(option.getSize()); // 获取边距(默认为0.5英寸) double marginInches = option.getMargin(); @@ -252,11 +277,7 @@ public class PdfPrinter { */ private static PrintRequestAttributeSet createPrintRequestAttributeSet(PrintOption option) { PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); - - // 设置纸张大小 -// String size = option.getSize() != null ? option.getSize() : "Letter"; -// aset.add(PAPER_SIZES.getOrDefault(size, MediaSizeName.NA_LETTER)); - + // 设置颜色模式 setColorMode(aset, option.getColor()); @@ -300,7 +321,7 @@ public class PdfPrinter { String c = color.trim().toLowerCase(); - if (c.equals("color") || c.equals("full color") || c.equals("cover letter color only")) { + if (c.equals("color")) { aset.add(Chromaticity.COLOR); } else { aset.add(Chromaticity.MONOCHROME); @@ -314,7 +335,7 @@ public class PdfPrinter { * @param sides 打印面字符串 */ private static void setPrintSides(PrintRequestAttributeSet aset, String sides) { - if (sides != null && ("Double-Sided".equalsIgnoreCase(sides) || "Two-Sided".equalsIgnoreCase(sides))) { + if (("Double-Sided".equalsIgnoreCase(sides))) { aset.add(Sides.TWO_SIDED_LONG_EDGE); } else { aset.add(Sides.ONE_SIDED);