风过无痕 发表于 2016-6-15 22:45:55

已解决 AU3条码生成器的条码无法识别

本帖最后由 风过无痕 于 2017-12-20 16:16 编辑

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <file.au3>
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>

#NoTrayIcon
Global $array
Global $CodeArray
Global $data
Global $L

;*************************************************************************************
; Assign Code 128 Pattern array
;*************************************************************************************
; Items are "???"

$array = "0? ?00?11011001100"
$array = "1?!?01?11001101100"
$array = '2?"?02?11001100110'
$array = "3?#?03?10010011000"
$array = "4?$?04?10010001100"
$array = "5?%?05?10001001100"
$array = "6?&?06?10011001000"
$array = "7?'?07?10011000100"
$array = "8?(?08?10001100100"
$array = "9?)?09?11001001000"
$array = "10?*?10?11001000100"
$array = "11?+?11?11000100100"
$array = "12?,?12?10110011100"
$array = "13?-?13?10011011100"
$array = "14?.?14?10011001110"
$array = "15?/?15?10111001100"
$array = "16?0?16?10011101100"
$array = "17?1?17?10011100110"
$array = "18?2?18?11001110010"
$array = "19?3?19?11001011100"
$array = "20?4?20?11001001110"
$array = "21?5?21?11011100100"
$array = "22?6?22?11001110100"
$array = "23?7?23?11101101110"
$array = "24?8?24?11101001100"
$array = "25?9?25?11100101100"
$array = "26?:?26?11100100110"
$array = "27?;?27?11101100100"
$array = "28?<?28?11100110100"
$array = "29?=?29?11100110010"
$array = "30?>?30?11011011000"
$array = "31???31?11011000110"
$array = "32?@?32?11000110110"
$array = "33?A?33?10100011000"
$array = "34?B?34?10001011000"
$array = "35?C?35?10001000110"
$array = "36?D?36?10110001000"
$array = "37?E?37?10001101000"
$array = "38?F?38?10001100010"
$array = "39?G?39?11010001000"
$array = "40?H?40?11000101000"
$array = "41?I?41?11000100010"
$array = "42?J?42?10110111000"
$array = "43?K?43?10110001110"
$array = "44?L?44?10001101110"
$array = "45?M?45?10111011000"
$array = "46?N?46?10111000110"
$array = "47?O?47?10001110110"
$array = "48?P?48?11101110110"
$array = "49?Q?49?11010001110"
$array = "50?R?50?11000101110"
$array = "51?S?51?11011101000"
$array = "52?T?52?11011100010"
$array = "53?U?53?11011101110"
$array = "54?V?54?11101011000"
$array = "55?W?55?11101000110"
$array = "56?X?56?11100010110"
$array = "57?Y?57?11101101000"
$array = "58?Z?58?11101100010"
$array = "59?[?59?11100011010"
$array = "60?\?60?11101111010"
$array = "61?]?61?11001000010"
$array = "62?^?62?11110001010"
$array = "63?_?63?10100110000"
$array = "64?`?64?10100001100"
$array = "65?a?65?10010110000"
$array = "66?b?66?10010000110"
$array = "67?c?67?10000101100"
$array = "68?d?68?10000100110"
$array = "69?e?69?10110010000"
$array = "70?f?70?10110000100"
$array = "71?g?71?10011010000"
$array = "72?h?72?10011000010"
$array = "73?i?73?10000110100"
$array = "74?j?74?10000110010"
$array = "75?k?75?11000010010"
$array = "76?l?76?11001010000"
$array = "77?m?77?11110111010"
$array = "78?n?78?11000010100"
$array = "79?o?79?10001111010"
$array = "80?p?80?10100111100"
$array = "81?q?81?10010111100"
$array = "82?r?82?10010011110"
$array = "83?s?83?10111100100"
$array = "84?t?84?10011110100"
$array = "85?u?85?10011110010"
$array = "86?v?86?11110100100"
$array = "87?w?87?11110010100"
$array = "88?x?88?11110010010"
$array = "89?y?89?11011011110"
$array = "90?z?90?11011110110"
$array = "91?{?91?11110110110"
$array = "92?|?92?10101111000"
$array = "93?}?93?10100011110"
$array = "94?~?94?10001011110"
$array = "95?del?95?10111101000"
$array = "96?Fnc3?96?10111100010"
$array = "97?Fnc2?97?11110101000"
$array = "98?Shift?98?11110100010"
$array = "99?Code C?99?10111011110"
$array = "100?Fnc 4?Code B?10111101110"
$array = "101?Code A?Code A?11101011110"
$array = "102?Fnc 1?Fnc 1?11110101110"

$Form1 = GUICreate("条码生成工具", 405, 360, -1, -1,BitOR($WS_MINIMIZEBOX,$WS_GROUP))
$Group1 = GUICtrlCreateGroup("", 8, 5, 385, 285)
$Label1 = GUICtrlCreateLabel("订货通知编号", 40, 43, 76, 17)
$Input1 = GUICtrlCreateInput("", 122, 40, 233, 21, 0x2000 & 0x0008)
$Label2 = GUICtrlCreateLabel("订货审批单号", 40, 77, 76, 17)
$Input2 = GUICtrlCreateInput("", 122, 72, 233, 21)
$Label3 = GUICtrlCreateLabel("门   店   号", 40, 109, 76, 17)
$Input3 = GUICtrlCreateCombo("", 122, 104, 233, 21)
GUICtrlSetData(-1,"9143|9101|","9101")
$Label4 = GUICtrlCreateLabel("门   店   名", 40, 141, 76, 17)
$Input4 = GUICtrlCreateCombo("", 122, 136, 233, 21)
GUICtrlSetData(-1,"2233|121","")
$Label5 = GUICtrlCreateLabel("箱   码   号", 40, 173, 76, 17)
$Input5 = GUICtrlCreateCombo("", 122, 168, 81, 21)
GUICtrlSetData(-1,"1|2|","1")
$Label6 = GUICtrlCreateLabel("UPI码", 40, 205, 76, 17)
$Input6 = GUICtrlCreateInput("", 122, 200, 233, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("生成条码", 55, 300, 80, 30)
$Button2 = GUICtrlCreateButton("打印条码", 170, 300, 80, 30)
$Button3 = GUICtrlCreateButton("退出", 285, 300, 80, 30)
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $Button1
                        MakeBarcode()
                Case $Button2
                        print()
                Case $Button3
                        close()
        EndSwitch
WEnd

Func print()
        Run('Rundll32.exe "' & @SystemDir & '\mshtml.dll",PrintHTML "' & @TempDir & "\Barcode.jpg" & '"', @SystemDir)
EndFunc   ;==>print

Func close()
        Exit
EndFunc   ;==>close

Func MakeBarcode()
    Local $hGUI
        For $i = 1 To (UBound($L) - 1)
                GUICtrlDelete($L[$i])
        Next
        $Barcode = IdentifyCodeSwitches(GUICtrlRead($Input6))
        Dim $L
        $i = 1
        While $i <= StringLen($Barcode)
                $col = StringMid($Barcode, $i, 1)
                If $col = 1 Then
                        $L[$i] = GUICtrlCreateLabel("", 20 + ($i * 2), 230, 2, 50)
                        GUICtrlSetBkColor(-1, 0x000000)
                Else
                        $L[$i] = GUICtrlCreateLabel("", 20 + ($i * 2), 230, 2, 50)
                        GUICtrlSetBkColor(-1, 0xFFFFFF)
                EndIf
                $i += 1
        WEnd
        _ScreenCapture_CaptureWnd (@TempDir & "\Barcode.jpg", $hGui,8,28,398,315)
EndFunc   ;==>MakeBarcode

Func IdentifyCodeSwitches($code)

        $i = 1
        $CodeType = "B"
        $len = StringLen($code)

        While $i <= $len
                Select
                        Case $CodeType = "B"
                                If StringRegExp(StringMid($code, $i, 6), "(){3}") = 1 Then
                                        $code = StringMid($code, 1, $i - 1) & "?C?" & StringMid($code, $i)
                                        $CodeType = "C"
                                        $i += 6 + 3
                                Else
                                        $CodeType = "B"
                                        $i += 1
                                EndIf
                        Case $CodeType = "C"
                                If StringRegExp(StringMid($code, $i, 2), "()") <> 1 Then
                                        $code = StringMid($code, 1, $i - 1) & "?B?" & StringMid($code, $i)
                                        $CodeType = "B"
                                        $i += 2 + 3
                                Else
                                        $CodeType = "C"
                                        $i += 2
                                EndIf
                EndSelect
                $len = StringLen($code)
        WEnd

        If StringMid($code, 1, 3) <> "?C?" Then $code = "?B?" & $code

        $CodeArray = StringSplit($code, "")

        For $i = 1 To (UBound($CodeArray) - 3)

                Select
                        Case $CodeArray[$i] & $CodeArray[$i + 1] & $CodeArray[$i + 2] = "?B?"
                                $CodeArray[$i] = ""
                                $CodeArray[$i + 1] = ""
                                $CodeArray[$i + 2] = ""

                        Case $CodeArray[$i] & $CodeArray[$i + 1] & $CodeArray[$i + 2] = "?C?"
                                $CodeArray[$i] = ""
                                $CodeArray[$i + 1] = ""
                                $CodeArray[$i + 2] = ""
                EndSelect
        Next

        For $i = (UBound($CodeArray) - 1) To 1 Step -1
                If $CodeArray[$i] = "" Then _ArrayDelete($CodeArray, $i)
        Next

        $i = 1

        While $i <= (UBound($CodeArray) - 1)
                If $CodeArray[$i] = "" Then
                        $i += 1
                        Do
                                If $CodeArray[$i] = "" Then
                                        $i += 1
                                Else
                                        $CodeArray[$i] &= $CodeArray[$i + 1]
                                        $CodeArray[$i + 1] = ""
                                        $i += 1

                                EndIf
                        Until $i = (UBound($CodeArray) - 1) Or $CodeArray[$i] = "" Or $CodeArray[$i + 1] = ""
                EndIf
                $i += 1
        WEnd

        For $i = (UBound($CodeArray) - 1) To 1 Step -1
                If $CodeArray[$i] = "" Then _ArrayDelete($CodeArray, $i)
        Next

        _ArrayDelete($CodeArray, 0) ;important

        If $CodeArray = "" Then
                $CodeArray = "11010010000"
                $SUM = 104
                $CodeType = ""
        Else
                $CodeArray = "11010011100"
                $SUM = 105
                $CodeType = ""
        EndIf

        For $i = 1 To (UBound($CodeArray) - 1)

                If $CodeArray[$i] = "" Then
                        $CodeArray[$i] = "10111101110"
                        $SUM += $i * 100
                        $CodeType = ""
                        ContinueLoop
                EndIf

                If $CodeArray[$i] = "" Then
                        $CodeArray[$i] = "10111011110"
                        $SUM += $i * 99
                        $CodeType = ""
                        ContinueLoop
                EndIf

                For $j = 1 To (UBound($array) - 1)

                        $data = StringSplit($array[$j], "?")

                        Select
                                Case $CodeType = ""

                                        If $CodeArray[$i] == $data Then
                                                $CodeArray[$i] = $data
                                                $SUM += $i * $data

                                        EndIf

                                Case $CodeType = ""

                                        If $CodeArray[$i] == $data Then
                                                $CodeArray[$i] = $data
                                                $SUM += $i * $data

                                        EndIf
                        EndSelect
                Next
        Next

        $ChecksumItem = Mod($SUM, 103)
        $data = StringSplit($array[$ChecksumItem + 1], "?")
        _ArrayAdd($CodeArray, $data)
        _ArrayAdd($CodeArray, "1100011101011")
        $CodeArrayString = _ArrayToString($CodeArray, "")
        Return $CodeArrayString
EndFunc   ;==>IdentifyCodeSwitchesSOSO1606111906293231
SOSO1606111759521013

生成的这两个条码无法识别


SOSO1606111804163759
这个就可以

可以看一下 生成的条码长度不一样短的那个确实是识别不了

不知道是什么原因 如下图所示

大家都能识别,估计是我这边的问题

haijie1223 发表于 2016-6-16 08:28:29

经测试能识别

chzj589 发表于 2016-6-16 09:40:22

回复 1# 风过无痕
SOSO1606111906293231
SOSO16061119062932
我用18位数生成,都能读取。

chamlien 发表于 2016-6-16 10:14:02

回复收藏本帖!

风过无痕 发表于 2016-6-16 10:19:14

回复 3# chzj589
我要的是全部数字生成的条码 但是这两个不知道是什么原因 手机无法识别 扫描器也无法识别 郁闷了

风过无痕 发表于 2016-6-16 10:19:49

回复 2# haijie1223
又上传了两张图 可以测试下但是这两个不知道是什么原因 手机无法识别 扫描器也无法识别

chzj589 发表于 2016-6-16 10:51:54

回复 5# 风过无痕
我用手机测试扫描包装盒子上有20位数字的条码无法读取,
可能手机扫描读取软件的问题

haijie1223 发表于 2016-6-16 11:44:15

回复 6# 风过无痕


    都可以读取

minterz 发表于 2016-6-24 17:16:50

手机的问题吧.

lxwlxwayy 发表于 2016-6-25 23:24:02

可以的{:face (84):}
页: [1]
查看完整版本: 已解决 AU3条码生成器的条码无法识别