条形码 png 打印在40mm x 15mm大小的标签上的图像,在打印时被缩小到20mm x10mm,无法进行扫描。

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

当我使用code128生成一个条形码并将其保存在一个PNG文件中时,我面临着这样的问题:当我将同一个PNG文件提供给打印机作业时,当它具有所需的文档属性以打印在所需尺寸的标签上时,它的尺寸被缩小了,并且没有被扫描。

实际打印尺寸 - 40mm x 15mm。打印在标签上的尺寸 - 20mm x 10mm。

我在PrintRequestAttributeSet中添加了这个属性--pras.add(MediaSize.findMedia(40, 15, Size2DSyntax.MM))。

但是效果并不准确,我试着在那里玩了一下x和y参数值,打印的尺寸还是落在25mm×10mm之内。

我已经在下面给出了完整的代码细节。

(PS:我使用 "Honeywell PC42t Plus "热敏打印机来打印,目前我的标签是700mm x 280mm大小,我正在等待收到40mm x 15mm大小的实际标签,所以这是为了测试,我可以打印一个实际的40mm x 15mm的条形码,利用整个标签空间,一旦我收到实际标签)

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();
        }

    }

}
java api thermal-printer barcode-printing code128
1个回答
0
投票

你可以使你的程序更短、更快,也可以确保它总是打印的是一个文件。可读 条形码,通过使用打印机语言,而不是像使用通用打印机一样使用条形码打印机。

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 */ }
  }
}

0
投票

谢谢@Erich。我已经使用了您给出的代码,并更新了ZPL和DP语言的printCommand,您更新的代码(^LH)能够打印条码,但它没有被扫描。您更新的代码(^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"); // 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 */ }
  }
}

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