fix(printer): 打印参数调整

支持封面彩色打印,内容灰色打印
This commit is contained in:
lifangliang 2025-08-04 17:13:22 +08:00
parent 0724f442e6
commit 5978de5534
3 changed files with 44 additions and 22 deletions

View File

@ -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()) {

View File

@ -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;

View File

@ -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);