Barcode png Image printed on a Label of 40mm x 15mm size is shrunk to 20mm x10mm when printed and not getting scanned

huangapple go评论69阅读模式
英文:

Barcode png Image printed on a Label of 40mm x 15mm size is shrunk to 20mm x10mm when printed and not getting scanned

问题

public class One_TestMyBarcode {

    private static final String MIME_TYPE = "image/x-png";
    private static final String DELIMTER = "-";
    static String image_name = "NewBarcode_One.png";

    public static void main(String[] args) {

        FileInputStream textStream = null;
        int lastSeqNo = 001;
        String roCode = "ERO";

        AtomicInteger seqNo = new AtomicInteger(lastSeqNo);
        Code128Bean code128 = new Code128Bean();
        code128.setHeight(15f);
        // code128.setBarHeight(40f);
        // code128.setModuleWidth(0.3);
        code128.setModuleWidth(0.2);
        code128.setQuietZone(10);
        code128.doQuietZone(true);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        BitmapCanvasProvider canvas = new BitmapCanvasProvider(baos, MIME_TYPE, 300, BufferedImage.TYPE_BYTE_BINARY,
                false, 0);

        StringBuffer codeData = new StringBuffer();
        codeData.append(roCode);
        codeData.append(DELIMTER);

        int currentSeqNo = seqNo.getAndIncrement();
        String seq = String.format("%07d", currentSeqNo);
        codeData.append(seq);
        codeData.append(DELIMTER);
        Calendar current = Calendar.getInstance();
        String year = Integer.toString(current.get(Calendar.YEAR)).substring(2);
        codeData.append(year);

        // logger.debug("barcode dimension is ");
        code128.calcDimensions(codeData.toString());
        code128.generateBarcode(canvas, codeData.toString());

        try {
            canvas.finish();
        } catch (IOException e) {
            throw new RuntimeException(e);

        }

        FileOutputStream fos = null;
        try {
            // fos = new FileOutputStream("C:\\Users\\Vinayak\\Desktop\\barcode\\" + image_name);
            fos = new FileOutputStream(image_name);
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
            // textStream = new FileInputStream("C:\\Users\\Vinayak\\Desktop\\barcode\\" + image_name);
            textStream = new FileInputStream(image_name);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;

        // Position the default print service
        PrintService printService = PrintServiceLookup.lookupDefaultPrintService();

        // Create a print job
        DocPrintJob job = printService.createPrintJob();

        // Set the print properties
        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

        // printed a very small size (20mm x 10mm) and does not scan
        pras.add(MediaSize.findMedia(40, 15, Size2DSyntax.MM));

        // DOESN'T Scan Either
        // pras.add(OrientationRequested.LANDSCAPE);
        // pras.add(OrientationRequested.PORTRAIT);
        // pras.add(MediaSizeName.ISO_A10);

        // Doesn't print at all
        // pras.add(new MediaPrintableArea(0, 0, 40, 15, MediaPrintableArea.MM));

        pras.add(new Copies(1));
        DocAttributeSet das = new HashDocAttributeSet();

        // Specify print content
        Doc doc = new SimpleDoc(textStream, flavor, das);

        // Do not display the print dialog, print directly
        try {
            System.err.println("Loop - print");
            job.print(doc, pras); // Make specific print operations for each page

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

    }

}
英文:

I am facing this issue where I am generating a barcode using code128 and saving it in a PNG file.
The same PNG file when supplied to a printer Job with required Document properties for printing on a Label of required size, the size gets reduced and does not get scanned.

Actual Size for print supplied - 40mm x 15mm.
Size printed on the label - 20mm x 10mm

I am adding this attribute to PrintRequestAttributeSet -
pras.add(MediaSize.findMedia(40, 15, Size2DSyntax.MM));

But it is not effected accurately, I tried to play around the x and y parameter value there, still, the size printed falls within 25mm x 10mm.

Any inputs to print the barcode of the required size is highly appreciated.
I have given the complete code details below.

(PS: I am using "Honeywell PC42t Plus" Thermal Printer to print and currently my labels are of 700mm x 280mm in size, I am waiting to receive the actual labels of 40mm x 15mm size.
So this is to test that, I can print an actual 40mm x 15mm barcode utilizing whole label space once I have the actual labels received)

public class One_TestMyBarcode {

	private static final String MIME_TYPE = "image/x-png";
	private static final String DELIMTER = "-";
	static String image_name = "NewBarcode_One.png";
	
	public static void main(String[] args) {

		FileInputStream textStream = null;
		int lastSeqNo = 001;
		String roCode= "ERO";

		AtomicInteger seqNo = new AtomicInteger(lastSeqNo);
		Code128Bean code128 = new Code128Bean();
		code128.setHeight(15f);
		//code128.setBarHeight(40f);
		//code128.setModuleWidth(0.3);
		code128.setModuleWidth(0.2);
		code128.setQuietZone(10);
		code128.doQuietZone(true);

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		BitmapCanvasProvider canvas = new BitmapCanvasProvider(baos, MIME_TYPE, 300, BufferedImage.TYPE_BYTE_BINARY,
				false, 0);
		
		StringBuffer codeData = new StringBuffer();
		codeData.append(roCode);
		codeData.append(DELIMTER);

		int currentSeqNo = seqNo.getAndIncrement();
		String seq = String.format("%07d", currentSeqNo);
		codeData.append(seq);
		codeData.append(DELIMTER);
		Calendar current = Calendar.getInstance();
		String year = Integer.toString(current.get(Calendar.YEAR)).substring(2);
		codeData.append(year);
		
		//logger.debug("barcode dimension is ");
		code128.calcDimensions(codeData.toString());
		code128.generateBarcode(canvas, codeData.toString());
		
		try {
			canvas.finish();
		} catch (IOException e) {
			throw new RuntimeException(e);

		}
		
		FileOutputStream fos = null;
		try {
			//fos = new FileOutputStream("C:\\Users\\Vinayak\\Desktop\\barcode\\" +image_name);
			fos = new FileOutputStream(image_name);
			fos.write(baos.toByteArray());
			fos.flush();
			fos.close();
			//textStream = new FileInputStream("C:\\Users\\Vinayak\\Desktop\\barcode\\" +image_name);
			textStream = new FileInputStream(image_name);
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
		DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
		
		// Position the default print service
		PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
		
		// Create a print job
		DocPrintJob job = printService.createPrintJob();
		
		// Set the print properties
		PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
		
		//printed a very small size (20mm x 10mm) and does not scan
		pras.add(MediaSize.findMedia(40, 15, Size2DSyntax.MM));
		

		//DOESN'T Scan Either
		//pras.add(OrientationRequested.LANDSCAPE);
		//pras.add(OrientationRequested.PORTRAIT);
		//pras.add(MediaSizeName.ISO_A10);  
	   
		//Doesn't print at all
		//pras.add(new MediaPrintableArea(0, 0, 40, 15, MediaPrintableArea.MM));
		
		
		pras.add(new Copies(1));
		DocAttributeSet das = new HashDocAttributeSet();
		
		// Specify print content
		Doc doc = new SimpleDoc(textStream, flavor, das);
		
		// Do not display the print dialog, print directly
		try {
			   System.err.println("Loop - print");
			   job.print(doc, pras); // Make specific print operations for each page
			   
		} catch (PrintException pe) {
			pe.printStackTrace();
		}

	}

}

答案1

得分: 0

你可以通过使用打印机语言而不是将条码打印机当作通用打印机来使程序更短、更快,并确保它始终打印出易读的条码。

import javax.print.*;

public class PrintUsingZPL {
  public static void main(String[] args) {
    StringBuilder codeData = new StringBuilder();
    codeData.append("Stackoverflow"); // 例子

    String printCommand = "^XA^LH0,0^FO50,50^BCN,100,Y,N,N^FD" +
                          codeData.toString() +
                          "^FS^XZ";
    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
    try {
      DocPrintJob job = printService.createPrintJob();
      Doc doc = new SimpleDoc(printCommand.getBytes(), DocFlavor.BYTE_ARRAY.AUTOSENSE, null);
      job.print(doc, null);
    }
    catch(PrintException e) { /* 错误处理代码在这里 */ }
  }
}
英文:

You can make your program shorter and faster, and also make sure it always prints a legible barcode, by using the printer language instead of using the barcode printer as if it was a generic printer.

import javax.print.*;
public class PrintUsingZPL {
public static void main(String[] args) {
StringBuilder codeData = new StringBuilder();
codeData.append("Stackoverflow"); // example
String printCommand = "^XA^LH0,0^FO50,50^BCN,100,Y,N,N^FD"+
codeData.toString()+
"^FS^XZ";
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
try {
DocPrintJob job = printService.createPrintJob();
Doc doc = new SimpleDoc(printCommand.getBytes(), DocFlavor.BYTE_ARRAY.AUTOSENSE, null);
job.print(doc, null);
}
catch(PrintException e) { /* error handling goes here */ }
}
}

答案2

得分: 0

感谢 @Erich。我已使用您提供的代码,并更新了ZPL和DP语言的printCommand。您的更新代码 (^LH) 能够打印条形码,但无法被扫描(不确定,我尝试了一些变化但没有帮助),所以我在这里的代码中尝试了DPL命令,它能够成功打印条形码并成功扫描。非常感谢您的帮助和指导。

package BARCODE;

import javax.print.*;
import javax.print.PrintService;

public class PrintUsingZPL1 {
  public static void main(String[] args) {
    StringBuilder codeData = new StringBuilder();
    //codeData.append("Stackoverflow"); // 示例
    codeData.append("CRO-0000100-20"); // 示例
    String printData = codeData.toString();
    System.out.println("Data for Barcode " + printData);

    /*String printCommand = "^XA^LH0,0^FO50,50^BCN,100,Y,N,N^FD" +
                          codeData.toString() +
                          "^FS^XZ";*/
    
   /* String printCommand = "PP65,107:AN7\r\n" + 
            "BARSET \"CODE128B\",2,1,1,71\r\n" + 
            "PB \"CRO-0000001-20\"\r\n" + 
            "PP79,37:NASC 8\r\n" + 
            "FT \"CG Triumvirate Condensed Bold\",8,0,98\r\n" + 
            "PT \"CRO-0000001-20\"\r\n" + 
            "LAYOUT RUN \"\"\r\n" + 
            "PF"; */
  String printCommand = "PP35,90:AN7\r\n" + 
    "BARSET \"CODE39A\",3,1,1,67\r\n" + 
    "PB " + codeData.toString() + "\r\n" + 
    "PP65,23:NASC 9\r\n" + 
    "FT \"Andale Mono Bold\",8,0\r\n" + 
    "PT " + codeData.toString() + "\r\n" + 
    "LAYOUT RUN \"\"\r\n" + 
    "PF";

    /*String printCommand = "PP65,107:AN7\r\n" + 
            "BARSET \"CODE128B\",2,1,1,71\r\n" + 
            "PB "+printData+"\r\n" + 
            "PP79,37:NASC 8\r\n" + 
            "FT \"CG Triumvirate Condensed Bold\",8,0,98\r\n" + 
            "PT "+printData+"\r\n" + 
            "LAYOUT RUN \"\"\r\n" + 
            "PF";*/
    
    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
    try {
      DocPrintJob job = printService.createPrintJob();
      Doc doc = new SimpleDoc(printCommand.getBytes(), DocFlavor.BYTE_ARRAY.AUTOSENSE, null);
      job.print(doc, null);
    }
    catch(PrintException e) { /* 错误处理在这里 */ }
  }
}
英文:

Thanks @Erich. I have used your given code and updated the printCommand for both ZPL and DP Language. Your updated code (^LH) was able to print the Barcode but it was not getting scanned (not sure, I tried some variation but did not help), so I tried DPL command there as shown in code here, and it was able to print the Barcode and successfully got scanned too. Thank you so much for your help and guidance.


package BARCODE;
import javax.print.*;
import javax.print.PrintService;
public class PrintUsingZPL1 {
public static void main(String[] args) {
StringBuilder codeData = new StringBuilder();
//codeData.append("Stackoverflow"); // example
codeData.append("CRO-0000100-20"); // example
String printData = codeData.toString();
System.out.println("Data for Barcode " +printData);
/*String printCommand = "^XA^LH0,0^FO50,50^BCN,100,Y,N,N^FD"+
codeData.toString()+
"^FS^XZ";*/
/* String printCommand = "PP65,107:AN7\r\n" + 
"BARSET \"CODE128B\",2,1,1,71\r\n" + 
"PB \"CRO-0000001-20\"\r\n" + 
"PP79,37:NASC 8\r\n" + 
"FT \"CG Triumvirate Condensed Bold\",8,0,98\r\n" + 
"PT \"CRO-0000001-20\"\r\n" + 
"LAYOUT RUN \"\"\r\n" + 
"PF"; */
String printCommand = "PP35,90:AN7\r\n" + 
"BARSET \"CODE39A\",3,1,1,67\r\n" + 
"PB " +codeData.toString()+ "\r\n" + 
"PP65,23:NASC 9\r\n" + 
"FT \"Andale Mono Bold\",8,0\r\n" + 
"PT " +codeData.toString()+ "\r\n" + 
"LAYOUT RUN \"\"\r\n" + 
"PF";
/*String printCommand = "PP65,107:AN7\r\n" + 
"BARSET \"CODE128B\",2,1,1,71\r\n" + 
"PB "+printData+"\r\n" + 
"PP79,37:NASC 8\r\n" + 
"FT \"CG Triumvirate Condensed Bold\",8,0,98\r\n" + 
"PT "+printData+"\r\n" + 
"LAYOUT RUN \"\"\r\n" + 
"PF";*/
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
try {
DocPrintJob job = printService.createPrintJob();
Doc doc = new SimpleDoc(printCommand.getBytes(), DocFlavor.BYTE_ARRAY.AUTOSENSE, null);
job.print(doc, null);
}
catch(PrintException e) { /* error handling goes here */ }
}
}

huangapple
  • 本文由 发表于 2020年5月4日 23:46:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/61596185.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定