I have problem when printing CR80 (Smartcard size) using Java desktop Application. The card printer named Fargo HDP5000. Printer specification is 300dpi. It can print normally when I resize/rescale the image using java getScaledInstance
or imgScalr
library into card dimension (53.98mm x 85.6fmm). But the result are become poor or pixelated.
But when I try to print high resolution image using windows print dialog, the result are very good and sharp.
Any solution how to print high resolution image using java application in such small media? Thank you
here are my code:
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());
}
implementation:
@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);
}
}