我面临的问题是,我使用code128生成条形码并将其保存在PNG文件中。将相同的PNG文件提供给具有所需文档属性的打印机作业,以便在所需大小的标签上打印时,该文件的大小会减小,不会被扫描。
提供印刷品的实际尺寸-40mm x 15mm。标签上打印的尺寸-20mm x 10mm
我正在将此属性添加到PrintRequestAttributeSet-pras.add(MediaSize.findMedia(40,15,Size2DSyntax.MM((;
但它并没有被准确地影响,我试着在那里播放x和y参数值,仍然,打印的尺寸在25mm x 10mm以内。
任何用于打印所需尺寸的条形码的输入都将受到高度赞赏。我在下面给出了完整的代码细节。
(附言:我正在使用"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();
}
}
}
通过使用打印机语言,而不是像使用通用打印机一样使用条形码打印机,您可以使程序更短、更快,并确保它始终打印出清晰的条形码。
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 */ }
}
}
谢谢@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"); // 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:AN7rn" +
"BARSET "CODE128B",2,1,1,71rn" +
"PB "CRO-0000001-20"rn" +
"PP79,37:NASC 8rn" +
"FT "CG Triumvirate Condensed Bold",8,0,98rn" +
"PT "CRO-0000001-20"rn" +
"LAYOUT RUN ""rn" +
"PF"; */
String printCommand = "PP35,90:AN7rn" +
"BARSET "CODE39A",3,1,1,67rn" +
"PB " +codeData.toString()+ "rn" +
"PP65,23:NASC 9rn" +
"FT "Andale Mono Bold",8,0rn" +
"PT " +codeData.toString()+ "rn" +
"LAYOUT RUN ""rn" +
"PF";
/*String printCommand = "PP65,107:AN7rn" +
"BARSET "CODE128B",2,1,1,71rn" +
"PB "+printData+"rn" +
"PP79,37:NASC 8rn" +
"FT "CG Triumvirate Condensed Bold",8,0,98rn" +
"PT "+printData+"rn" +
"LAYOUT RUN ""rn" +
"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 */ }
}
}