【发布时间】:2023-03-11 04:01:01
【问题描述】:
我在使用 Java 桌面应用程序打印 CR80(智能卡尺寸)时遇到问题。证卡打印机名为 Fargo HDP5000。打印机规格为 300dpi。当我使用 java getScaledInstance 或 imgScalr 库将图像调整为卡片尺寸(53.98mm x 85.6fmm)时,它可以正常打印。但结果会变差或像素化。
但是当我尝试使用 windows 打印对话框打印高分辨率图像时,结果非常好且清晰。
任何解决方案如何在如此小的媒体中使用 java 应用程序打印高分辨率图像? 谢谢
这是我的代码:
try {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintService(printService);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(OrientationRequested.PORTRAIT);
aset.add(new PrinterResolution(300, 300, PrinterResolution.DPI));
aset.add(new MediaPrintableArea(0.0f, 0.0f, 53.98f, 85.6f, MediaSize.MM));
if (duplex) {
aset.add(Sides.DUPLEX);
mDuplex = true;
} else {
aset.add(Sides.ONE_SIDED);
}
printJob.setPrintable(this);
printJob.print(aset);
} catch (Exception PrintException) {
Helper.errorHandling(TAG, "printDemo", PrintException.toString());
}
实现:
@Override
public int print(Graphics g, PageFormat pageFormat, int pageNumber) {
if (pageNumber > 1) {
System.out.println("Print job has been sent to spooler.");
return Printable.NO_SUCH_PAGE;
}
Graphics2D graphics2D = (Graphics2D) g;
graphics2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
final int printerDPI = 300;
double pageWidth = pageFormat.getImageableWidth() * printerDPI / POINTS_PER_INCH; //PPI = 72
double pageHeight = pageFormat.getImageableHeight() * printerDPI / POINTS_PER_INCH;
if (pageNumber == 0) {
final int x= 0;
final int y= 0;
final int FIXED_WIDTH = 504;
final int FIXED_HEIGHT = 808;
BufferedImage bimg;
try {
bimg = ImageIO.read(new File(filenamePath));
} catch (Exception e) {
Helper.errorHandling(e.toString());
bimg = null;
}
if (bimg == null) {
return;
}
int w = bimg.getWidth();
int h = bimg.getHeight();
int destW = (int) (w * 0.3) + x;
int destH = (int) (h * 0.3) + y;
if (w > pageWidth) {
destW = pageWidth;
}
if (h > pageHeight) {
destH = pageHeight;
}
Image img;
if (w != FIXED_WIDTH && h != FIXED_HEIGHT) {
img = bimg.getScaledInstance(FIXED_WIDTH, FIXED_HEIGHT, Image.SCALE_SMOOTH);
// or
img = Scalr.resize(bimg, Scalr.Method.ULTRA_QUALITY, FIXED_WIDTH, FIXED_HEIGHT);
graphics2D.drawImage(img, x, y, destW, destH, 0, 0, w, h, null);
} else {
graphics2D.drawImage(bimg, x, y, destW, destH, 0, 0, w, h, null);
}
return (Printable.PAGE_EXISTS);
} else {
return (NO_SUCH_PAGE);
}
}
【问题讨论】:
-
这是关于“我如何在 java 中调整图像大小”的答案 (stackoverflow.com/questions/244164/…) - 似乎是什么问题......
标签: java windows image printing smartcard