我的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.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
。同样,如果job
为null
,则将获得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并再次检查程序。