从java发送到宝丽来打印机

时间:2013-10-04 22:41:17

标签: java printing

我有一个java应用程序,可以从特定图像创建偏振镜并发送到宝丽来打印机(Canon SELPHY)。但是,当我指定要打印的自定义介质尺寸时,它会给我一个 java.lang.RuntimeException:没有可用的打印机服务。打印代码如下:

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(new Copies(1));
pras.add(new MediaPrintableArea(0, 0, 86, 54, MediaPrintableArea.MM));
PrintService pss[] = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.GIF, pras);

这里的初始问题是pss []未填充。如果没有指定介质尺寸,我只是从打印机得到错误,基本上说不支持介质尺寸。

有没有人在这方面有任何经验可以提供帮助?

1 个答案:

答案 0 :(得分:2)

您的打印机支持自定义介质尺寸必须并且通常定义(即打印机驱动程序)和打印子系统(例如Linux中的CUPS)。您可能想要检查您的介质尺寸是否确实配置正确(请参阅下面的代码)。

更重要的是 - 要在 PORTRAIT 方向定义和处理Java Printing API 要求媒体!您错误地在横向(width > height)中输入可打印区域。实际打印的方向稍后由OrientationRequested打印请求属性控制。


如果要检查Java Printing API识别的打印机和支持的介质尺寸,可以使用以下代码:

public class MediaTest {

    public static void main(String[] args) {
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(
                DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);
        for (PrintService printService : printServices) {
            System.out.println(printService.getName());
            Media[] supportedMedia = (Media[]) printService.getSupportedAttributeValues(
                    Media.class, DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);
            for (Media media : supportedMedia) {
                if (media instanceof MediaSizeName) {
                    handleMediaSizeName((MediaSizeName) media);
                }
            }
        }
    }

    private static void handleMediaSizeName(MediaSizeName mediaSizeName) {
        StringBuilder builder = new StringBuilder("    " + mediaSizeName.toString());
        MediaSize mediaSize = MediaSize.getMediaSizeForName(mediaSizeName);
        if (mediaSize != null) {
            float[] size = mediaSize.getSize(MediaSize.MM);
            builder.append(" - ").append(size[0]).append("x").append(size[1]).append("mm");
        }
        System.out.println(builder.toString());
    }

}