在Brother QL标签打印机中使用自定义java.awt.print.Paper

问题描述 投票:0回答:1

我的Brother QL-720NW标签打印机和Java出现问题。如我通过this comment所知,使用java.awt.print.Paper不起作用。提供的解决方法不完整,我对java打印还是比较陌生。

代码变通办法中缺少一部分。

可打印的p = ...; //创建可打印的对象

现在,我试图创建一个可打印的对象,并且我的代码如下所示:

    public static void main(String[] args) throws FileNotFoundException{

        // Lookup printer by name 
PrintService[] foundPrinters = PrintServiceLookup.lookupPrintServices(null, new HashAttributeSet(new PrinterName("Brother QL-720NW", null)));
PrintService printer = foundPrinters[0];

// Lookup custom paper by name
MediaSizeName paper = null;
for (Media m : (Media[])printer.getSupportedAttributeValues(Media.class, null, null))
{
    if (m instanceof MediaSizeName)
    {
        MediaSizeName media = ((MediaSizeName)m);
        if ("Barcode".equals(media.toString())) paper = media;
    }
}

// Create a new printable object
InputStream input = new FileInputStream("C:/Temp/Barcodes/test.png");
Doc doc = new SimpleDoc(input, DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);

// Set custom paper as request attribute
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(paper);

// Create a new print job and print it
DocPrintJob job = printer.createPrintJob();
try
{
    job.print(doc, attrs);
}
catch (PrintException ex)
{
    ex.printStackTrace();
}

    }

[当我尝试运行代码时,出现错误:

线程“主”中的异常java.lang.IllegalArgumentException:数据不是声明的类型

似乎与此行有关:

Doc doc = new SimpleDoc(input, DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);

[搜索stackoverflow使我进入this comment。尝试将DocFlavor.SERVICE_FORMATTED.PRINTABLE更改为DocFlavor.INPUT_STREAM.AUTOSENSE后,出现以下错误:

线程“主”中的异常java.lang.NullPointerException

似乎与attrs.add(paper);有关。

我没办法继续下一步工作,并且我对此事的知识有限。

您能帮帮我吗? :)

编辑

我根据Arvind Kumar Avinash的建议更新了代码,但仍然收到NullPointerException错误。我的代码现在看起来像这样:

    public static void main(String[] args) throws FileNotFoundException{

    // Lookup printer by name 
    PrintService[] foundPrinters = PrintServiceLookup.lookupPrintServices(null, new HashAttributeSet(new PrinterName("Brother QL-720NW", null)));
    PrintService printer = foundPrinters[0];

    // Lookup custom paper by namezusammenhang
    MediaSizeName paper = null;
    if(printer != null) {
        for (Media m : (Media[])printer.getSupportedAttributeValues(Media.class, null, null)) {
            if (m instanceof MediaSizeName) {
                MediaSizeName media = ((MediaSizeName)m);
                if ( media!=null && "Barcode".equals(media.toString())) 
                    paper = media;
            }
        }
    }

    // Create a new printable object
    InputStream input = new FileInputStream("C:/Temp/Barcodes/test.png");
    Doc doc = new SimpleDoc(input, DocFlavor.INPUT_STREAM.PNG, null);

    // Set custom paper as request attribute
    PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
    attrs.add(paper);

    // Create a new print job and print it
    DocPrintJob job = null;

    if (printer != null){
        job = printer.createPrintJob();
        try{
            if(job != null){
                job.print(doc, attrs);
            }

        }catch (PrintException ex){
            ex.printStackTrace();
        }
    }

}

错误/控制台输出看起来像这样:

线程“主”中的异常java.lang.NullPointerException在java.desktop / javax.print.attribute.HashAttributeSet.add(HashAttributeSet.java:275)在easypackaging.TEST.main(TEST.java:45)

java image printing label java-print
1个回答
0
投票

线程“主”中的异常java.lang.NullPointerException

似乎与attrs.add(paper);.]有关>

这是不正确的,因为attrs如下引用HashPrintRequestAttributeSet的实例:

PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(paper);

可能来自以下代码的NullPointerException

DocPrintJob job = printer.createPrintJob();
try {
    job.print(doc, attrs);
}

因为如果printer.createPrintJob()NullPointerException,则printer可能会抛出null。同样,如果jobnull,则将获得NullPointerException。因此,您应将其编写如下:

DocPrintJob job = null;

if (printer != null) {
    job = printer.createPrintJob();
    try {
        if (job != null) {
            job.print(doc, attrs);
        }
    }
}

以下代码中存在这种可能性的另一个地方:

for (Media m : (Media[])printer.getSupportedAttributeValues(Media.class, null, null)) {
    if (m instanceof MediaSizeName) {
        MediaSizeName media = ((MediaSizeName)m);
        if ("Barcode".equals(media.toString())) paper = media;
    }
}

您应按如下所示重写它:

if(printer != null) {
    for (Media m : (Media[])printer.getSupportedAttributeValues(Media.class, null, null)) {
        if (m instanceof MediaSizeName) {
            MediaSizeName media = ((MediaSizeName)m);
            if ( media!=null && "Barcode".equals(media.toString())) 
                paper = media;
        }
    }
}

如果仍然出现错误,请共享完整的堆栈跟踪。

我建议您通过https://docs.oracle.com/javase/9/docs/api/javax/print/PrintService.html并再次检查程序。

© www.soinside.com 2019 - 2024. All rights reserved.