Генерация Штрих Кода В Лотусе

26.05.2014
9
0
#1
Всем привет.

Мне нужно реализовать генерацию штрих-кода, его последующее считывание через сканер и так далее и тому прочее. Пока я хочу спросить у тех кто может знает или уже подобное делал, как сгенерировать штрих код, линейный в формате EAN-13 в лотусе? Возможно ли это?
 

savl

Lotus team
28.10.2011
2 131
102
#2
DamirAstana
Возможно, есть реализация. Нужен шрифт на машине, где будут считывать штрих-коды.
Выложить?
 
26.05.2014
9
0
#3
DamirAstana
Возможно, есть реализация. Нужен шрифт на машине, где будут считывать штрих-коды.
Выложить?
Да, было бы круто. Получается нужно будет еще шрифт устанавливать на рабочей станции пользователя который будет генерировать штрих код или еще и тем кто будет считывать при помощи сканера?
 

savl

Lotus team
28.10.2011
2 131
102
#4
Ну тем кто считывает думаю не обязательно, если они будут считывать с бумаги, если с экрана - да.
Тем кто будет генерить тоже, если им не интересно как это выглядит.

Ниже код создания ШК, реализация на LS. можно и на java переписать при необходимости.
Не помню где его нашел.
За основу берется UNID документа, сначала думал таким образом ШК почти всегда уникален, но он формируется только из цифр(анализирую по кодам ASCII (48-57)), это важно. Так что теоретически может быть 2 одинаковых ШК.
Созданный ШК большинство сканеров доллжно читать без дополнительной настройки.
У нас это так и не используется, заказчик отказался.
Прикрепил шрифт, который использую сам, вот его я искал очень долго.
Программно установить шрифт (Windows Only)

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Штрих-код</div></div><div class="sp-body"><div class="sp-content">
Код:
	Dim macro As Variant
Dim res As String
Dim k As String
Dim ac As Integer
Dim bc As String

macro = Evaluate({@DocumentUniqueID},meDoc)
res = macro(0)
For i=1 To Len(res)
k = Mid$(res,i,1)
ac = Asc(k)
If ac >=48 Then
If ac <= 57 Then
bc = bc & k		
End If
End If
Next

Dim sumA As Integer
Dim sumB As Integer
Dim CC As Integer
SumA = 0
SumB = 0
Stop
bc = Left(bc,12)
For i =1 To Len(bc)
If (i Mod 2 = 0 ) Then 
SumA = SumA + Cint(Mid$(bc,i,1)) ' Четное
Else
SumB = SumB + Cint(Mid$(bc,i,1))' Нечетное
End If
Next

SumA = SumA*3 + SumB
SumB = (SumA\10 + 1)*10

bc = bc & (SumB - SumA)

Dim barcodeDone As String

barcodeDone = GetComb(Cint(Left(bc,1)),"")
barcodeDone = barcodeDone & "!"
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,2,1)),"A") 	

If Cint(Left(bc,1)) < 4 Then
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,3,1)),"A") 	
Else
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,3,1)),"B") 	
End If

If Cint(Left(bc,1)) = 0 Or Cint(Left(bc,1)) = 4 Or Cint(Left(bc,1)) =7 Or Cint(Left(bc,1)) = 8 Then
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,4,1)),"A") 		
Else
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,4,1)),"B") 		
End If

If Cint(Left(bc,1)) = 0 Or Cint(Left(bc,1)) = 1 Or Cint(Left(bc,1)) = 4 Or Cint(Left(bc,1)) =5 Or Cint(Left(bc,1)) = 9 Then
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,5,1)),"A") 		
Else
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,5,1)),"B") 		
End If

If Cint(Left(bc,1)) = 0 Or Cint(Left(bc,1)) = 2 Or Cint(Left(bc,1)) = 5 Or Cint(Left(bc,1)) =6 Or Cint(Left(bc,1)) = 7 Then
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,6,1)),"A") 		
Else
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,6,1)),"B") 		
End If

If Cint(Left(bc,1)) = 0 Or Cint(Left(bc,1)) = 3 Or Cint(Left(bc,1)) = 6 Or Cint(Left(bc,1)) =8 Or Cint(Left(bc,1)) = 9 Then
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,7,1)),"A") 		
Else
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,7,1)),"B") 		
End If

barcodeDone = barcodeDone & "-"
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,8,1)),"C") 		
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,9,1)),"C") 		
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,10,1)),"C") 		
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,11,1)),"C") 		
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,12,1)),"C") 		
barcodeDone = barcodeDone & GetComb(Cint(Mid$(bc,13,1)),"C") 		
barcodeDone = barcodeDone & "!"

Call meDoc.replaceItemValue("BarCode",bc)
Call meDoc.replaceItemValue("BarCodeImageText",barcodeDone)
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Function GetComb</div></div><div class="sp-body"><div class="sp-content">
Код:
Function GetComb(Num As Integer, Typ As Variant) As String

Select Case Typ
Case "A":
GetComb="" & num
Case "B":
GetComb ="" & Chr((num+65))
Case "C":
GetComb ="" & Chr((num+97))
Case Else:
GetComb ="" & Chr((num+35))
End Select

End Function
 

Вложения

26.05.2014
9
0
#5
Ну тем кто считывает думаю не обязательно, если они будут считывать с бумаги, если с экрана - да.
Тем кто будет генерить тоже, если им не интересно как это выглядит.
Спасибо огромное! Буду теперь разбираться. Пытаться.
 
26.05.2014
9
0
#11
Здравствуйте. Возникла такая проблема. Barcode4J выгружает очень большую картинку. Да и нужно еще конфигурировать файл XML и выгружать перед тем как воспользоваться библиотекой, нет ли решения чтобы без xml файла? И как сделать чтобы картинка была маленькой по размеру? Кстати использовал еще бибиотеку с сайта onbarcode.com, так там через 10 выгрузок появляется надпись Trial(

мой конфиг xml
Код:
<?xml version="1.0" encoding="UTF-8"?>
<barcode>
<code128>
<module-width>0.4mm</module-width>
</code128>
</barcode>
код на java
Код:
DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
System.out.println(System.getProperty("java.io.tmpdir"));
try {
Configuration cfg = builder.buildFromFile(new File("barcode.xml"));
BarcodeGenerator gen = BarcodeUtil.getInstance().createBarcodeGenerator( cfg );

OutputStream out = new java.io.FileOutputStream(new File("C://bcode1.png"));
BitmapCanvasProvider provider = new BitmapCanvasProvider(
out, "image/x-png", 300, BufferedImage.TYPE_BYTE_GRAY, true, 0);
gen.generateBarcode(provider, "001-20082014095311-12345");
provider.finish();

} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
и такая вот картинка

Добавлено: Кстати, пытался использовать xml тот, который они советуют для code128, но его не принимает конфигуратор для ШК(
Код:
<barcode>
<code128>
<height>{length:15mm}</height>
<module-width>{length:0.21mm}</module-width>
<codesets>{string:ABC}</codesets>
<quiet-zone enabled="{boolean:true}">{length:10mw}</quiet-zone>
<human-readable>
<placement>{human-readable-placement:bottom}</placement>
<font-name>{font-name:Helvetica}</font-name>
<font-size>{length:8pt}</font-size>
</human-readable>
</code128>
</barcode>
 

garrick

Lotus team
26.10.2009
894
61
#12
У меня работает так:
Код:
		private String getBarcodeFilename(String value) throws IOException, BarcodeException,
ConfigurationException {
BarcodeUtil util = BarcodeUtil.getInstance();
BarcodeGenerator gen = util.createBarcodeGenerator(getBarcodeConfiguration());
File f = File.createTempFile("~bar", ".jpg");
String filename = f.getAbsolutePath();
OutputStream out = new FileOutputStream(filename);
int resolution = 300;
BitmapCanvasProvider canvas = new BitmapCanvasProvider(out, "image/jpeg", resolution,
BufferedImage.TYPE_BYTE_BINARY, false, 0);
gen.generateBarcode(canvas, value);
canvas.finish();
f.deleteOnExit();
return filename;
}

private Configuration getBarcodeConfiguration() {
DefaultConfiguration cfg = new DefaultConfiguration("barcode");
// Bar code type
DefaultConfiguration child = new DefaultConfiguration("code128");
cfg.addChild(child);
// Human readable text position
DefaultConfiguration attr = new DefaultConfiguration("human-readable");
DefaultConfiguration subAttr = new DefaultConfiguration("placement");
subAttr.setValue("bottom");
attr.addChild(subAttr);
child.addChild(attr);
return cfg;
}
Как видите, никаких XML файлов. По поводу размера картинки никогда не парился, она у меня при вставке в документ сжимается/растягивается до необходимой ширины/высоты. Сам файл - временный, по завершению формирования документа удаляется. Ручные сканеры мои документы читают без проблем.