Java Печать до определенного размера страницы с использованием принтера этикеток

Я пытаюсь использовать принтер этикеток (точнее, EPSON TM-T88V), чтобы выдавать изображения PNG.

Я могу заставить его печатать нормально, за исключением случаев, когда я печатаю размеры изображения (220x175 при 72 точках на дюйм, если быть точным снова), поверх напечатанного изображения появляется пачка белого пространства, что я считаю пустой тратой бумаги.

Любые идеи о том, как я могу минимизировать бумажные отходы? Я хочу, чтобы он печатал только изображение, минимальное количество пробелов, а затем разрезал бумагу.

Вот мой код

    AttributeSet aset = new HashAttributeSet();
    aset.add(new PrinterName(printerName, null));
    /* locate a print service that can handle the request */
    PrintService[] services = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PNG, aset);

    if (services.length >= 1) {
        /* create a print job for the chosen service */
        DocPrintJob pj = services[0].createPrintJob();

        DocAttributeSet das = new HashDocAttributeSet();
        das.add(PrintQuality.HIGH);
        das.add(MediaSizeName.ISO_A7); // I know the problem is here somewhere. This Media size seems to work best currently

        try {
            /* 
            * Create a Doc object to hold the print data.
            */
            Doc doc = new SimpleDoc(imageByteIs, DocFlavor.INPUT_STREAM.PNG, das);

            /* print the doc as specified */
            pj.print(doc, null);

        } catch (PrintException e) { 
            System.err.println(e);
        }
    }

person alwinc    schedule 08.06.2012    source источник


Ответы (3)


Вы можете найти доступные форматы бумаги через:

PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
Media[] res = (Media[]) printService.getSupportedAttributeValues(Media.class, null, null);
for (Media media : res) {
    if (media instanceof MediaSizeName) {
        MediaSizeName msn = (MediaSizeName) media;
        MediaSize ms = MediaSize.getMediaSizeForName(msn);
        float width = ms.getX(MediaSize.INCH);
        float height = ms.getY(MediaSize.INCH);
        System.out.println(media + ": width = " + width + "; height = " + height);
    }
}

После того, как вы найдете доступный MediaSizeName, который наиболее точно соответствует размеру вашей бумаги, просто добавьте его вместо MediaSizeName.ISO_A7.

person Some Java Programmer    schedule 22.04.2013

Добавьте MediaPrintableArea:

das.add(new MediaPrintableArea(0.05, 0.05, 0.05, 0.05, MediaPrintableArea.INCH));
person Joop Eggen    schedule 08.06.2012
comment
Спасибо за вклад Joop, но теперь я получаю java.lang.IllegalArgumentException: 0 or negative value argument at javax.print.attribute.standard.MediaPrintableArea.<init>(MediaPrintableArea.java:143) Кажется, я не могу инициализировать MediaPrintableArea с 0 - person alwinc; 10.06.2012
comment
Нет... просто мелким шрифтом в верхнем левом углу страницы. Я не думаю, что это то, для чего предназначен MediaPrintableArea. Я считаю, что этот класс просто указывает, какая область этого носителя разрешена для печати. IE, если только верхняя половина используется для печати и т. д. Таким образом, 0,05 по всем направлениям дает небольшую точку в левом верхнем углу. Юп... Я думаю, ты далек от ответа - person alwinc; 12.06.2012

Это настройки, которые я использую для печати на бумаге формата А4 с полями 10 мм.

int width = Math.round(MediaSize.ISO.A4.getX(MediaSize.MM));
int height = Math.round(MediaSize.ISO.A4.getY(MediaSize.MM));
das.add(new MediaPrintableArea(10, 10, width-20, height-20, MediaPrintableArea.MM));
person Lai    schedule 29.07.2013