当前位置: 首页 > 知识库问答 >
问题:

斑马打印机GC420t不打印图像EPL 2 GW

宋鸿
2023-03-14

使用JasperReport生成图像,然后尝试在Zebra打印机GC420T上打印该图像。生成图像但不打印。我已经重新检查了连接和端口。我读过这个SO链接和校准一个,但没有工作。

代码:

public void generateReport(Map<String, Object> parameters, List<Label> labels)
            throws JRException, IOException, ConnectionException, ZebraPrinterLanguageUnknownException{
        // TODO Auto-generated method stub
        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(labels);
        System.out.println(" Wait !!");
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
        if(jasperPrint != null && jasperPrint.getPages()!=null && jasperPrint.getPages().size()>=0){
            FileOutputStream fos = new FileOutputStream("C:\\Users\\desktop\\Labels.png");
            //JasperExportManager.exportReportToPdfStream(jasperPrint, fos);
            BufferedImage rendered_image = null;
            rendered_image = (BufferedImage) JasperPrintManager.printPageToImage(jasperPrint, 0, 1.6f);
            ImageIO.write(rendered_image, "png", fos);
            Connection thePrinterConn = new DriverPrinterConnection("GC420t");
            try{
                for (DiscoveredPrinterDriver printer : UsbDiscoverer.getZebraDriverPrinters()){
                    System.out.println(printer);
                }
                thePrinterConn.open();
                if(zPrinter==null){
                    zPrinter = ZebraPrinterFactory.getInstance(thePrinterConn);
                }
                PrinterStatus printerStatus = zPrinter.getCurrentStatus();
                if(printerStatus.isReadyToPrint){
                    System.out.println("Ready to print !!");
                    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
                    DocAttributeSet das = new HashDocAttributeSet();
                    FileInputStream fis = new FileInputStream("C:\\Users\\desktop\\Labels.png");
                    Doc mydoc = new SimpleDoc(fis, flavor, das);
                    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
                    aset.add(OrientationRequested.PORTRAIT);
                    @SuppressWarnings("unused")
                    PrinterJob pj = PrinterJob.getPrinterJob();
                    PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, aset);
                    PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
                    for (int i = 0; i < services.length; i++){
                      System.out.println(services[i].getName());
                    }
                    if(services.length == 0){
                        if(defaultService == null){
                         //no printer found
                        }
                        else{
                            //print using default
                            DocPrintJob job = defaultService.createPrintJob();
                            try{
                                job.print(mydoc, aset);
                            }catch (PrintException e){
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                    else{
                         PrintService service = ServiceUI.printDialog(null, 200, 200, services, defaultService, flavor, aset);
                         if (service != null){
                             DocPrintJob job = service.createPrintJob();
                             try{
                                 job.print(mydoc, aset);
                             }catch(PrintException e){
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                             }
                        }
                   }
                   //ZebraImageI image = ZebraImageFactory.getImage("C:\\Users\\desktop\\Labels.png");
                }
                else{
                    System.out.println("Something went wrong");
                }
            }finally{
                thePrinterConn.close();
            }
            System.out.println("Report generated !!");
        }
    }

我阅读了EPL 2手册,并将图像转换为二进制图形数据,以便立即打印。

代码

private byte[] getEplGraphics(int top, int left, BufferedImage bufferedImage) throws IOException {
        ByteArrayOutputStream fs = new ByteArrayOutputStream();

        //int canvasWidth = bufferedImage.getWidth();
        // loop from top to bottom
        System.out.println(bufferedImage.getHeight());
        System.out.println(bufferedImage.getWidth());

        int maxY = bufferedImage.getHeight() + (64- bufferedImage.getHeight()%64);
        int maxX = bufferedImage.getWidth() + (64- bufferedImage.getWidth()%64);
        System.out.println(maxX);
        System.out.println(maxY);
        int p3 = maxX / 8;
        int p4 = maxY/ 8;
        int len = 0;
        String gw = "N\nGW0,0," + p3 + "," + p4 + ",";
        fs.write(gw.getBytes());
        for (int y = 0; y < maxY; ++y) {
            // from left to right
            for (int x = 0; x < maxX;) {
                byte abyte = 0;
                // get 8 bits together and write to memory

                for (int b = 0; b < 8; ++b, ++x) {
                    // set 1 for white,0 for black
                    int dot = 1;

                    // pixel still in width of bitmap,
                    // check luminance for white or black, out of bitmap set to white

                    if (x < bufferedImage.getWidth() && y < bufferedImage.getHeight()) {
                        int c = bufferedImage.getRGB(x, y);
                        int red = (c & 0x00ff0000) >> 16;
                        int green = (c & 0x0000ff00) >> 8;
                        int blue = c & 0x000000ff;
                        Color color = new Color(red, green, blue);
                        int luminance = (int) ((color.getRed() * 0.3) + (color.getGreen() * 0.59)
                                + (color.getBlue() * 0.11));
                        dot = luminance > 127 ? 1 : 0;

                    }

                    abyte |= (byte) (dot << (7 - b)); // shift left,
                    // then OR together to get 8 bits into a byte
                }

                // System.out.print( (char)(abyte + 48 ) );
                // write here
                len++;
                fs.write(abyte);
            }
        }
        System.out.println("GW Length::"+len);
        // Assign memory position here
        // fs.write('\n');
        fs.write("\nP1".getBytes());
        fs.flush();
        // System.out.println(fs);
        return fs.toByteArray();
    }

在将图像转换成二进制图形数据后,它就不打印数据了。

如何让打印机打印图像?

共有1个答案

支智志
2023-03-14

使用jasper-reports、渲染图像、将图像转换为EPL并发送到zebra打印机通常不是在热敏打印机上打印的正确解决方案。这种代码不仅速度较慢,而且分辨率也较低(这可能会产生问题,例如条形码)

您有两个标准选项

>

  • 使用打印机协议并发送文本文件。

    安装打印机驱动程序并使用JRPrintServiceExporter

    使用打印机协议

    这是我通常使用的(大部分是为了让代码条打印完美,没有图像,而是直接命令打印代码条)。您将不使用jasper-reports来完成此任务,而是设置txt文件(在您的示例中,您可以使用一个设计程序zebra-designer),然后使用freemarker这样的库来替换/插入直接协议文件中的动态数据。完成后,直接发送到打印机,例如通过串行端口(也可以使用蓝牙-串行适配器无线发送)

    使用打印机驱动程序

    在此解决方案中,您需要安装正确的打印机驱动程序,然后使用此驱动程序发送打印作业。在jasper-report中,要发送打印机作业,可以使用以下代码:

    PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
    //set page size etc if you need to
    PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet();
    //set print service attributes
    JRPrintServiceExporter exporter = new JRPrintServiceExporter();
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    SimplePrintServiceExporterConfiguration expConfig = new SimplePrintServiceExporterConfiguration();
    String printerName = "myPrinterName"; //Check the name of printer
    PrintService service = Printerlookup.getPrintservice(printerName, Boolean.TRUE, Boolean.TRUE);
    expConfig.setPrintService(service);
    expConfig.setPrintRequestAttributeSet(printRequestAttributeSet);
    expConfig.setPrintServiceAttributeSet(printServiceAttributeSet);
    expConfig.setDisplayPageDialog(Boolean.FALSE);
    exporter.setConfiguration(expConfig);
    exporter.exportReport(); 
    

    如果您的打印不正确,您的调试方法是导出到pdf,然后使用打印对话框从pdf打印到打印机(记住您使用的是驱动程序,所以您可以在对话框中选择它)

    我不关心,我实际上只对将png转换成EPL2语言感兴趣

    请更新问题,删除jasper并改为showpngimage,show expected output和show current output。这是一些可以帮助您的代码,但首先要确保您真的不在乎:

    使用ZEBRA SDK参见printimage命令

    ZebraPrinter printer = ZebraPrinterFactory.getInstance(connection);
    printer.printImage("sample.jpg", x, y);
    

    如何将图像转换为PCX参见code.zip文件topcx.java

  •  类似资料:
    • 我正在使用Zebra iMZ320打印机、windows mobile设备、CPCL和vb.net。 我试图让代码加载位图图像,然后使用CPCL打印它 我有一段类似于下面的代码,可以毫无问题地工作。我一定错过了一些显而易见的东西,但就我的一生而言,我看不到它。 我的问题是打印机只会打印出HEX而不是图像!以前有人遇到过这个吗?你能帮忙吗? 公共子绘制位图(ByVal xPosition为整数,By

    • 我们刚从brother标签打印机转移到zebra,c的brother sdk有点像meh,但它实现了我想要的功能。基本上,它让我可以选择在设计器中创建一个标签,并将参考名称附加到文本文件、条形码文件等。然而,看看zebra,我似乎找不到这样做的方法。我不喜欢这样一个事实,即你必须使用他们的设计器设计标签,而他们的设计器没有这个功能,或者用c语言百分之百地设计标签,这阻止了我们的设计器以后重新设计标

    • 编辑:所以在一天的混乱之后。我的问题是spintf。我最初认为我的循环是错误的。

    • 我正在使用Epson ePOS打印机TM-T20,我已经运行了SDK示例并且它可以工作,但是,我正在尝试编写一个小型应用程序进行打印。 打印机已成功找到,数据已成功发送,但未打印。如果有人能帮忙,我会很感激的。 这是我的代码: 显示 这是我的主要活动

    • 问题内容: 我必须在热蓝牙打印机上打印一些数据,我正在这样做: 它适用于文本,但不适用于图像。我想我需要获取byte[]图像数据。我尝试通过这种方式获取图像数据: 不幸的是,打印机打印了许多奇怪的字符(大约50厘米的纸张)。我不知道如何打印图像。 我想尝试获取位图的像素,然后将其转换为a byte[]并发送,但是我不知道该怎么做。 谢谢 更新: 经过这么长时间,我正在执行此操作:我有一个名为pri

    • 我们希望打印到连接在apache运行的POS打印机上。由于应用程序的设计和部署,打印应该从服务器上完成(它应该检测订单并发送到不同的打印机和不同格式的打印...账单,厨房订单,等等...)。出于这个原因和其他原因(例如,从iPad访问应用程序),我们放弃了像QZ-Print applet这样的选项,并需要直接在服务器端打印。 提前谢了。