我有一个项目,它绘制了一个价格标签,其中有一个条形码。要绘制条形码,我使用一个设置了EAN-13字体的JLabel。生成价格标签的输入数据由两个条形码属性组成:条形码编号
080432402184例如
和编码版本,该版本被传递给前面提到的JLabel
!h04324|PRQXTp用于该条形码编号
问题是我无法访问生成编码版本的代码,而生成编码版本代码的算法有错误。正因为如此,我想从头开始写,但很难找到编码算法。
有人能告诉我在哪里可以找到编码说明吗?谢谢
=================================================
Barcode4J问题。尝试创建Graphics2D对象并在其上绘制条形码(不能真正使用文件输出,因为条形码只是价格标签的一部分)。
尝试使用Java2DCanvasProvider:
EAN13Bean bean = new EAN13Bean();
final int dpi = 150;
//Configure the barcode generator
bean.setModuleWidth(UnitConv.in2mm(13.3f / dpi)); //makes the narrow bar
//width exactly one pixel
bean.doQuietZone(true);
bean.setHeight(chart.getBarcodeMainHeight()-10);
bean.setFontSize(10f);
BufferedImage bi = new BufferedImage(chart.getBarcodeMainWidth(), chart.getBarcodeMainHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bi.createGraphics();
//graphics.fillRect(0, 0, chart.getBarcodeMainWidth(), chart.getBarcodeMainHeight());
Java2DCanvasProvider canv = new Java2DCanvasProvider(graphics, 0);
bean.generateBarcode(canv, priceTag.getBarCodeNumber());
barCodeLabel.setIcon(new ImageIcon(bi));
但我收到了一个倒置的图像块(我对Graphics2D真的很陌生)。
Barcode4J支持您。它还可以生成图像,因此您可以放弃JLabel和特殊字体。
对于那些可能需要的人,最终找到了算法(用C语言,但用Java重写)。
public class BarCodeService {
private static final int[][] leftPartMaps = {{48,48,48,48,48},{48,64,48,64,64},{48,64,64,48,64},{48,64,64,64,48},{64,48,48,64,64},{64,64,48,48,64},{64,64,64,48,48},{64,48,64,48,64},{64,48,64,64,48},{64,64,48,64,48}};
private static final int[] rightPartMap = {80,80,80,80,80,112};
private static final int firstDigitArg = 33, secondDigitArg = 96;
private static final char delimiter = 124;
public String parseInput(String code){
char[] data = new char[13];
char[] givenData = code.toCharArray();
int length = (givenData.length < 12) ? givenData.length : 12;
System.arraycopy(givenData, 0, data, 0, length);
int checkSumDigit = generateCheckSum(data);
data[12] = String.valueOf(checkSumDigit).charAt(0);
return String.valueOf(data);
}
public String generateCode(String code){
char[] data = code.toCharArray();
if(data.length<13){
System.err.println("Bad data input");
return null;
}
String result = null;
try{
result = generateEanString(data);
}catch(NumberFormatException e){
System.err.println("Input data had unconvertable characters: "+e.fillInStackTrace());
result = "";
}
return result;
}
protected int generateCheckSum(char[] data){
int result = 0;
for(int i = 0; i<12;i++){
int num = Character.getNumericValue(data[i]);
num = (i%2 == 0) ? num : num*3;
result += num;
}
result = (result % 10 == 0) ? 0 : ((result/10)+1)*10 - result;
return result;
}
protected String generateEanString(char[] data) throws NumberFormatException{
char[] resultData = new char[14];
resultData[0] = (char) (Character.getNumericValue(data[0]) + firstDigitArg);
resultData[1] = (char) (Character.getNumericValue(data[1]) + secondDigitArg);
fillLeftPart(data,resultData);
resultData[7] = delimiter;
fillRightPart(data,resultData);
return String.valueOf(resultData);
}
protected void fillLeftPart(char[] inputData, char[] resultData){
int[] chars = new int[]{
Character.getNumericValue(inputData[2]),
Character.getNumericValue(inputData[3]),
Character.getNumericValue(inputData[4]),
Character.getNumericValue(inputData[5]),
Character.getNumericValue(inputData[6])
};
int pointer = Character.getNumericValue(inputData[0]);
for(int i = 0; i<leftPartMaps[pointer].length; i++){
int n = i+2;
resultData[n] = (char)(chars[i] + leftPartMaps[pointer][i]);
}
}
protected void fillRightPart(char[] inputData, char[] resultData){
int[] chars = new int[]{
Character.getNumericValue(inputData[7]),
Character.getNumericValue(inputData[8]),
Character.getNumericValue(inputData[9]),
Character.getNumericValue(inputData[10]),
Character.getNumericValue(inputData[11]),
Character.getNumericValue(inputData[12])
};
for(int i = 0; i< rightPartMap.length; i++){
int n = i + 8;
resultData[n] = (char)(chars[i] + rightPartMap[i]);
}
}
public static void main(String[] args) {
/*System.out.println((char)(Character.getNumericValue('4')+33));
System.out.println((char)((int)('a')+2));
System.out.println((int)'%');
System.out.println("'"+(char)'0'+"'");*/
//if(true)return;
// %hB00FB|PUPWVp 4820062050760
//"%hB00FB|PUQUUr";"4820062051552";
String testCode = "2205276000000";
BarCodeService serv = new BarCodeService();
String parsedString = serv.parseInput(testCode);
System.out.println("Input: "+testCode+ ", parsed string: "+parsedString);
String barCodeString = serv.generateCode(parsedString);
System.out.println("Result: "+barCodeString);
}
}
我的输入来自字符串,并且校验和数字不正确,所以char[]结构是故意使用的。