JavaFX печать этикеток - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь напечатать изображение на этикеточном принтере с размером бумаги 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...