Examples / barcodes / python

Barcodes

A complete, runnable python program — 291 lines, shipped in your download.

Demonstrates Graphics

Same example, other languages: activex_cpp c cpp cpp_linux csharp php vbnet

examples/python/barcodes/barcodes.py 291 lines
# ============================================================================
#  barcodes -- Python (ctypes) port of examples\Vb6\barcodes\barcodes.bas
#  Writes every supported barcode type onto a grid of pages.
# ============================================================================
import os
import sys
import ctypes
import os, sys
# the wrapper lives at <root>/wrappers/python (source checkout) or beside
# the example tree (shipped package) -- find it without a hard-coded path
_d = os.path.dirname(os.path.abspath(__file__))
for _ in range(6):
    for _c in (os.path.join(_d, 'wrappers', 'python'), _d):
        if os.path.isfile(os.path.join(_c, 'lumaspdf.py')):
            sys.path.insert(0, _c)
            break
    else:
        _d = os.path.dirname(_d)
        continue
    break
import lumaspdf as L

# -- TPDFBarcodeType values (full set declared locally) --
bctAustraliaPost = 0x3F
bctAustraliaRedir = 0x44
bctAustraliaReply = 0x42
bctAustraliaRout = 0x43
bctAztec_ = 0x5C
bctAztecRunes_ = 0x80
bctC2Of5IATA = 0x4
bctC2Of5Industrial = 0x7
bctC2Of5Interleaved = 0x3
bctC2Of5Logic = 0x6
bctC2Of5Matrix = 0x2
bctChannelCode = 0x8C
bctCodabar = 0x12
bctCodablockF = 0x4A
bctCode11 = 0x1
bctCode128 = 0x14
bctCode128B = 0x3C
bctCode16K = 0x17
bctCode32 = 0x81
bctCode39 = 0x8
bctCode49 = 0x18
bctCode93 = 0x19
bctCodeOne_ = 0x8D
bctDAFT = 0x5D
bctDataBarOmniTrunc = 0x1D
bctDataBarExpStacked = 0x51
bctDataBarExpanded = 0x1F
bctDataBarLimited = 0x1E
bctDataBarStacked = 0x4F
bctDataBarStackedO = 0x50
bctDataMatrix_ = 0x47
bctDotCode_ = 0x73
bctDPD = 0x60
bctDPIdentCode = 0x16
bctDPLeitcode = 0x15
bctEAN128 = 0x10
bctEAN128_CC = 0x83
bctEAN14 = 0x48
bctEANX = 0xD
bctEANX_CC = 0x82
bctEANXCheck = 0xE
bctExtCode39 = 0x9
bctFIM = 0x31
bctFlattermarken = 0x1C
bctHIBC_Aztec_ = 0x70
bctHIBC_CodablockF = 0x6E
bctHIBC_Code128 = 0x62
bctHIBC_Code39 = 0x63
bctHIBC_DataMatrix_ = 0x66
bctHIBC_MicroPDF417_ = 0x6C
bctHIBC_PDF417_ = 0x6A
bctHIBC_QR_ = 0x68
bctISBNX = 0x45
bctITF14 = 0x59
bctJapanPost = 0x4C
bctKIX = 0x5A
bctKoreaPost = 0x4D
bctLOGMARS = 0x32
bctMailmark = 0x79
bctMaxicode_ = 0x39
bctMicroPDF417_ = 0x54
bctMicroQR_ = 0x61
bctMSIPlessey = 0x47
bctNVE18 = 0x4B
bctPDF417_ = 0x37
bctPDF417Truncated_ = 0x38
bctPharmaOneTrack = 0x33
bctPharmaTwoTrack = 0x35
bctPLANET = 0x52
bctPlessey = 0x56
bctPostNet = 0x28
bctPZN = 0x34
bctQRCode_ = 0x3A
bctRMQR_ = 0x91
bctRoyalMail4State = 0x46
bctRSS_EXP_CC = 0x86
bctRSS_EXPSTACK_CC = 0x8B
bctRSS_LTD_CC = 0x85
bctRSS14_CC = 0x84
bctRSS14Stacked_CC = 0x89
bctRSS14StackOMNI_CC = 0x8A
bctTelepen = 0x20
bctUltracode_ = 0x90
bctUPCA = 0x22
bctUPCA_CC = 0x87
bctUPCACheckDigit = 0x23
bctUPCE = 0x25
bctUPCE_CC = 0x88
bctUPCECheckDigit = 0x26
bctUPNQR_ = 0x8F
bctUSPSOneCode = 0x55
bctVIN = 0x49


@L.TErrorProc
def err_proc(data, errcode, errmsg, errtype):
    if errmsg:
        print(errmsg.decode("latin-1", "replace"))
    return 0  # try to continue on error


# (BarcodeType, Name, DataType, Data, Primary)
TEST_CODES = [
    (bctAustraliaPost, "Australia Post", L.bcdtBinary, "12345678", ""),
    (bctAustraliaRedir, "Australia Redirect Code", L.bcdtBinary, "12345678", ""),
    (bctAustraliaReply, "Australia Reply-Paid", L.bcdtBinary, "12345678", ""),
    (bctAustraliaRout, "Australia Routing Code", L.bcdtBinary, "12345678", ""),
    (bctAztec_, "Aztec binary mode", L.bcdtBinary, "123456789012", ""),
    (bctAztec_, "Aztec GS1 Mode", L.bcdtGS1Mode, "[01]03453120000011[17]120508[10]ABCD1234[410]9501101020917", ""),
    (bctAztecRunes_, "Aztec Runes", L.bcdtBinary, "123", ""),
    (bctC2Of5IATA, "Code 2 of 5 IATA", L.bcdtBinary, "1234567890", ""),
    (bctC2Of5Industrial, "Code 2 of 5 Industrial", L.bcdtBinary, "1234567890", ""),
    (bctC2Of5Interleaved, "Code 2 of 5 Interleaved", L.bcdtBinary, "1234567890", ""),
    (bctC2Of5Logic, "Code 2 of 5 Data Logic", L.bcdtBinary, "1234567890", ""),
    (bctC2Of5Matrix, "Code 2 of 5 Matrix", L.bcdtBinary, "1234567890", ""),
    (bctChannelCode, "Channel Code", L.bcdtBinary, "1234567", ""),
    (bctCodabar, "Codabar", L.bcdtBinary, "A123456789B", ""),
    (bctCodablockF, "Codablock-F", L.bcdtBinary, "1234567890abcdefghijklmnopqrstuvwxyz", ""),
    (bctCode11, "Code 11", L.bcdtBinary, "1234567890", ""),
    (bctCode128, "Code 128", L.bcdtBinary, "1234567890", ""),
    (bctCode128B, "Code 128", L.bcdtBinary, "1234567890", ""),
    (bctCode16K, "Code 16K binary mode", L.bcdtBinary, "[90]A1234567890", ""),
    (bctCode16K, "Code 16K GS1 mode", L.bcdtGS1Mode, "[90]A1234567890", ""),
    (bctCode32, "Code 32", L.bcdtBinary, "12345678", ""),
    (bctCode39, "Code 39", L.bcdtBinary, "1234567890", ""),
    (bctCode49, "Code 49", L.bcdtBinary, "1234567890", ""),
    (bctCode93, "Code 93", L.bcdtBinary, "1234567890", ""),
    (bctCodeOne_, "Code One", L.bcdtBinary, "1234567890", ""),
    (bctDAFT, "DAFT Code", L.bcdtBinary, "aftdaftdftaft", ""),
    (bctDataBarOmniTrunc, "GS1 DataBar Omnidirectional", L.bcdtBinary, "0123456789012", ""),
    (bctDataBarExpStacked, "GS1 DataBar Stacked", L.bcdtBinary, "[90]1234567890", ""),
    (bctDataBarExpanded, "GS1 DataBar Expanded", L.bcdtBinary, "[90]1234567890", ""),
    (bctDataBarLimited, "GS1 DataBar Limited", L.bcdtBinary, "0123456789012", ""),
    (bctDataBarStacked, "GS1 DataBar Stacked", L.bcdtBinary, "0123456789012", ""),
    (bctDataBarStackedO, "GS1 DataBar Stacked Omni", L.bcdtBinary, "0123456789012", ""),
    (bctDataMatrix_, "Data Matrix ISO 16022", L.bcdtBinary, "0123456789012", ""),
    (bctDotCode_, "DotCode", L.bcdtBinary, "0123456789012", ""),
    (bctDPD, "DPD Code", L.bcdtBinary, "1234567890123456789012345678", ""),
    (bctDPIdentCode, "Deutsche Post Identcode", L.bcdtBinary, "12345678901", ""),
    (bctDPLeitcode, "Deutsche Post Leitcode", L.bcdtBinary, "1234567890123", ""),
    (bctEAN128, "EAN 128", L.bcdtBinary, "[90]0101234567890128TEC-IT", ""),
    (bctEAN128_CC, "EAN 128 Composite Code", L.bcdtBinary, "[10]1234-1234", "[90]123456"),
    (bctEAN14, "EAN 14", L.bcdtBinary, "1234567890", ""),
    (bctEANX, "EAN X", L.bcdtBinary, "1234567890", ""),
    (bctEANX_CC, "EAN Composite Symbol", L.bcdtBinary, "[90]12341234", "12345678"),
    (bctEANXCheck, "EAN + Check Digit", L.bcdtBinary, "12345", ""),
    (bctExtCode39, "Ext. Code 3 of 9 (Code 39+)", L.bcdtBinary, "1234567890", ""),
    (bctFIM, "FIM", L.bcdtBinary, "d", ""),
    (bctFlattermarken, "Flattermarken", L.bcdtBinary, "11111111111111", ""),
    (bctHIBC_Aztec_, "HIBC Aztec Code", L.bcdtBinary, "123456789012", ""),
    (bctHIBC_CodablockF, "HIBC Codablock-F", L.bcdtBinary, "1234567890abcdefghijklmnopqrstuvwxyz", ""),
    (bctHIBC_Code128, "HIBC Code 128", L.bcdtBinary, "1234567890", ""),
    (bctHIBC_Code39, "HIBC Code 39", L.bcdtBinary, "1234567890", ""),
    (bctHIBC_DataMatrix_, "HIBC Data Matrix", L.bcdtBinary, "0123456789012", ""),
    (bctHIBC_MicroPDF417_, "HIBC Micro PDF417", L.bcdtBinary, "01234567890abcde", ""),
    (bctHIBC_PDF417_, "HIBC PDF417", L.bcdtBinary, "01234567890abcde", ""),
    (bctHIBC_QR_, "HIBC QR Code", L.bcdtBinary, "01234567890abcde", ""),
    (bctISBNX, "ISBN (EAN-13 with validation)", L.bcdtBinary, "0123456789", ""),
    (bctITF14, "ITF-14", L.bcdtBinary, "0123456789", ""),
    (bctJapanPost, "Japanese Postal Code", L.bcdtBinary, "0123456789", ""),
    (bctKIX, "Dutch Post KIX Code", L.bcdtBinary, "0123456789", ""),
    (bctKoreaPost, "Korea Post", L.bcdtBinary, "123456", ""),
    (bctLOGMARS, "LOGMARS", L.bcdtBinary, "1234567890abcdef", ""),
    (bctMailmark, "Royal Mail 4-State Mailmark", L.bcdtBinary, "11210012341234567AB19XY1A", ""),
    (bctMaxicode_, "Maxicode", L.bcdtBinary, "1234567890abcdef", ""),
    (bctMicroPDF417_, "Micro PDF417", L.bcdtBinary, "1234567890abcdef", ""),
    (bctMicroQR_, "Micro QR Code", L.bcdtBinary, "1234567890abcdef", ""),
    (bctMSIPlessey, "MSI Plessey", L.bcdtBinary, "12345678901", ""),
    (bctNVE18, "NVE-18", L.bcdtBinary, "1234567890123456", ""),
    (bctPDF417_, "PDF417", L.bcdtBinary, "1234567890abcdef", ""),
    (bctPDF417Truncated_, "PDF417 Truncated", L.bcdtBinary, "1234567890abcdef", ""),
    (bctPharmaOneTrack, "Pharmacode One-Track", L.bcdtBinary, "123456", ""),
    (bctPharmaTwoTrack, "Pharmacode Two-Track", L.bcdtBinary, "123456", ""),
    (bctPLANET, "PLANET", L.bcdtBinary, "12345678901", ""),
    (bctPlessey, "Plessey", L.bcdtBinary, "12345678901", ""),
    (bctPostNet, "PostNet", L.bcdtBinary, "12345678901", ""),
    (bctPZN, "PZN", L.bcdtBinary, "1234567", ""),
    (bctQRCode_, "QR Code", L.bcdtBinary, "1234567890abcdef", ""),
    (bctRMQR_, "Rect. Micro QR Code (rMQR)", L.bcdtBinary, "1234567890abcdef", ""),
    (bctRoyalMail4State, "Royal Mail 4 State (RM4SCC)", L.bcdtBinary, "1234567890abcdef", ""),
    (bctRSS_EXP_CC, "CS GS1 DataBar Ext. component", L.bcdtBinary, "[90]12341234", "[10]12345678"),
    (bctRSS_EXPSTACK_CC, "CS GS1 DataBar Exp. Stacked", L.bcdtBinary, "[90]12341234", "[10]12345678"),
    (bctRSS_LTD_CC, "CS GS1 DataBar Limited", L.bcdtBinary, "[90]12341234", "1234567"),
    (bctRSS14_CC, "CS GS1 DataBar-14 Linear", L.bcdtBinary, "[90]12341234", "1234567"),
    (bctRSS14Stacked_CC, "CS GS1 DataBar-14 Stacked", L.bcdtBinary, "[90]12341234", "1234567"),
    (bctRSS14StackOMNI_CC, "CS GS1 DataBar-14 Stacked Omni", L.bcdtBinary, "[90]12341234", "1234567"),
    (bctTelepen, "Telepen Alpha", L.bcdtBinary, "1234567890abcdef", ""),
    (bctUltracode_, "Ultracode", L.bcdtBinary, "1234567890abcdef", ""),
    (bctUPCA, "UPC A", L.bcdtBinary, "1234567890", ""),
    (bctUPCA_CC, "CS UPC A linear", L.bcdtBinary, "[90]12341234", "1234567"),
    (bctUPCACheckDigit, "UPC A + Check Digit", L.bcdtBinary, "12345678905", ""),
    (bctUPCE, "UCP E", L.bcdtBinary, "1234567", ""),
    (bctUPCE_CC, "CS UPC E linear", L.bcdtBinary, "[90]12341234", "1234567"),
    (bctUPCECheckDigit, "UCP E + Check Digit", L.bcdtBinary, "12345670", ""),
    (bctUPNQR_, "UPNQR (Univ. Placilni Nalog QR)", L.bcdtBinary, "1234567890abcdef", ""),
    (bctUSPSOneCode, "USPS OneCode", L.bcdtBinary, "01234567094987654321", ""),
    (bctVIN, "Vehicle Ident Number (USA)", L.bcdtBinary, "01234567094987654", ""),
]


def main():
    pdf = L.pdfNewPDF()
    L.pdfCreateNewPDFA(pdf, b"")
    L.pdfSetOnErrorProc(pdf, 0, err_proc)
    L.pdfSetPageCoords(pdf, L.pcTopDown)

    bcd = L.TPDFBarcode2()
    bcd.StructSize = ctypes.sizeof(L.TPDFBarcode2)
    L.pdfInitBarcode2(bcd)
    bcd.Options = L.bcoDefault | L.bcoUseActiveFont

    cnt = len(TEST_CODES)
    pw = L.pdfGetPageWidth(pdf) - 100.0
    ph = L.pdfGetPageHeight(pdf) - 100.0
    w = 100.0
    h = 120.0
    nx = int(pw / w)
    ny = int(ph / h)
    incX = w + (pw - nx * w) / (nx - 1)
    incY = h + (ph - ny * h) / (ny - 1)
    h = 100.0
    i = 0

    out_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "out.pdf")

    while i < cnt:
        L.pdfAppend(pdf)
        L.pdfSetFontA(pdf, b"Helvetica", L.fsRegular, 6.5, 1, L.cp1252)
        L.pdfSetLineWidth(pdf, 0.0)
        y = 50.0
        done = False
        for yy in range(ny):
            x = 50.0
            for xx in range(nx):
                bt, nm, dt, dat, prim = TEST_CODES[i]
                data_buf = ctypes.create_string_buffer(dat.encode("latin-1") + b"\0")
                prim_buf = ctypes.create_string_buffer(prim.encode("latin-1") + b"\0")
                bcd.BarcodeType = bt
                bcd.Data = ctypes.cast(data_buf, ctypes.c_void_p)
                bcd.DataType = dt
                bcd.Primary = ctypes.cast(prim_buf, ctypes.c_void_p)
                L.pdfWriteFTextExA(pdf, x, y - 10.0, w, -1.0, L.taCenter, nm.encode("latin-1", "replace"))
                L.pdfRectangle(pdf, x, y, w, h, L.fmStroke)
                if L.pdfInsertBarcode(pdf, x, y, w, h, L.coCenter, L.coCenter, bcd) < 0:
                    L.pdfDeletePDF(pdf)
                    return
                i += 1
                x += incX
                if i == cnt:
                    done = True
                    break
            y += incY
            if done:
                break
        L.pdfEndPage(pdf)

    if L.pdfHaveOpenDoc(pdf) != 0:
        if L.pdfOpenOutputFileA(pdf, out_file.encode("latin-1")) == 0:
            L.pdfDeletePDF(pdf)
            return
    L.pdfCloseFile(pdf)
    print('Barcodes "' + out_file + '" successfully created!')
    L.pdfDeletePDF(pdf)


if __name__ == "__main__":
    main()

This file is in the SDK at examples/python/barcodes/barcodes.py. The build fails if this page and that file ever differ.