Я пытаюсь напечатать изображение на этикеточном принтере с размером бумаги 30x20 мм и разрешением 203 точек на дюйм.Размер изображения напрямую зависит от размера бумаги, потому что размер изображения должен соответствовать размеру бумаги.
private static BufferedImage createImage(double widthMm, double heightMm, float resolution) {
int width = (int) MetricUtils.millimetersToPixels(widthMm, resolution);
int height = (int) MetricUtils.millimetersToPixels(heightMm, resolution);
return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
}
public final class MetricUtils {
public static final double INCH_PER_MM = 25.4d;
public static double millimetersToInches(double mm) {
return mm / INCH_PER_MM;
}
public static double millimetersToPixels(double mm, float dpi) {
return millimetersToInches(mm) * dpi;
}
}
После этого я пытаюсь установить размер бумаги (область печати) иРазмер изображения (область изображения) примерно такой:
private void printLabel(Printer printer, BufferedImage image) throws PrinterException {
try {
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
PrintService printService = findPrintService(printer.getName(), printServices);
double width = MetricUtils.millimetersToPixels(printer.getPaperSize().first, 72.0F);
double height = MetricUtils.millimetersToPixels(printer.getPaperSize().second, 72.0F);
Paper paper = new Paper();
paper.setSize(width, height);
paper.setImageableArea(0, 0, image.getWidth(), image.getHeight());
PageFormat pageFormat = new PageFormat();
pageFormat.setPaper(paper);
pageFormat.setOrientation(PageFormat.PORTRAIT);
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(new ImagePrintable(image), pageFormat);
printJob.setPrintService(printService);
printJob.pageDialog(pageFormat);
printJob.print();
} catch (Exception e) {
throw new PrintingException("Could not print image on the local printer", e);
}
}
Таким образом, размер изображения должен быть равен размеру бумаги, но в результате принтер печатает маленькое изображение со смещением влево.
public class ImagePrintable implements Printable {
private BufferedImage image;
public ImagePrintable(BufferedImage image) {
this.image = image;
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex != 0) {
return NO_SUCH_PAGE;
}
Graphics2D printerGraphics = (Graphics2D) graphics;
printerGraphics.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
printerGraphics.drawImage(image, 0, 0, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight(), null);
return PAGE_EXISTS;
}
}