使用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();
}
在将图像转换成二进制图形数据后,它就不打印数据了。
如何让打印机打印图像?
使用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并改为showpng
image,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。我最初认为我的循环是错误的。
问题内容: 我必须在热蓝牙打印机上打印一些数据,我正在这样做: 它适用于文本,但不适用于图像。我想我需要获取byte[]图像数据。我尝试通过这种方式获取图像数据: 不幸的是,打印机打印了许多奇怪的字符(大约50厘米的纸张)。我不知道如何打印图像。 我想尝试获取位图的像素,然后将其转换为a byte[]并发送,但是我不知道该怎么做。 谢谢 更新: 经过这么长时间,我正在执行此操作:我有一个名为pri
我正在使用Epson ePOS打印机TM-T20,我已经运行了SDK示例并且它可以工作,但是,我正在尝试编写一个小型应用程序进行打印。 打印机已成功找到,数据已成功发送,但未打印。如果有人能帮忙,我会很感激的。 这是我的代码: 显示 这是我的主要活动
我们希望打印到连接在apache运行的POS打印机上。由于应用程序的设计和部署,打印应该从服务器上完成(它应该检测订单并发送到不同的打印机和不同格式的打印...账单,厨房订单,等等...)。出于这个原因和其他原因(例如,从iPad访问应用程序),我们放弃了像QZ-Print applet这样的选项,并需要直接在服务器端打印。 提前谢了。