Wrapping C/C++ Methods of Dynamsoft Barcode SDK for Python

Jul 4
09:22

2015

Catherine Sea

Catherine Sea

  • Share this article on Facebook
  • Share this article on Twitter
  • Share this article on Linkedin

The arctile is about using Python to implement barcode reading functionality, based on Dynamsoft Barcode SDK.

mediaimage

In this tutorial,Wrapping C/C++ Methods of Dynamsoft Barcode SDK for Python Articles I’d like to share how to wrap C/C++ methods of Dynamsoft Barcode SDK to create a Barcode extension for Python.

Ads Powered by Dynamsoft

Visual Studio Settings for Building Python Extensions on Windows

Let’s create a new win32 project named DynamsoftBarcodeReader in Visual Studio. Open project properties, and include Python header files and libraries.

Add a dependency python27.lib.

Change the Target Extension to .pyd.

A .pyd file is same as DLL. It is the bridge between Python and C/C++. By default, the build configuration is Debug in Visual Studio. If you just build the project directly, you will see the following linkage error:

Why? The reason is that there is no python27_d.lib at all in Python’s official release package. If you want to link python27_d.lib, you have to download the source code and build a Debug version yourself. So, switch to Release and build the project.

Wrapping C/C++ Methods of Dynamsoft Barcode SDK for Python

When you import DynamsoftBarcodeReader in Python script, Python will search for DynamsoftBarcodeReader.pyd and then call initDynamsoftBarcodeReader() to make an initialization. Similar to JNI (Java Native Interface), we have to register the native methods that are accessible to Python.

Let’s add a method for decoding Barcode file. If you have learned the JNI sample code, you should be familiar with it. The only difference is that we need to convert final results to Python object type.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

static PyObject *

decodeFile(PyObject *self, PyObject *args)

{

    char *pFileName;

    int option_iMaxBarcodesNumPerPage = -1;

    int option_llBarcodeFormat = -1;

 

    if (!PyArg_ParseTuple(args, "s", &pFileName)) {

        return NULL;

    }

 

    pBarcodeResultArray pResults = NULL;

    ReaderOptions option;

    SetOptions(&option, option_iMaxBarcodesNumPerPage, option_llBarcodeFormat);

 

    int ret = DBR_DecodeFile(

        pFileName,

        &option,

        &pResults

        );

 

    if (ret == DBR_OK){

        int count = pResults->iBarcodeCount;

        pBarcodeResult* ppBarcodes = pResults->ppBarcodes;

        pBarcodeResult tmp = NULL;

 

        PyObject* list = PyList_New(count);

        PyObject* result = NULL;

 

        for (int i = 0; i < count; i++)

        {

            tmp = ppBarcodes[i];

            result = PyString_FromString(tmp->pBarcodeData);

 

            PyList_SetItem(list, i, Py_BuildValue("iN", (int)tmp->llFormat, result));

        }

 

        // release memory

        DBR_FreeBarcodeResults(&pResults);

        return list;

    }

 

    return Py_None;

}

 

static PyMethodDef methods[] = {

    { "initLicense", initLicense, METH_VARARGS, NULL },

    { "decodeFile", decodeFile, METH_VARARGS, NULL },

    { NULL, NULL }

};

To automatically copy all relevant DLLs to output directory after building the project, add the following command line in Visual Studio.

Build the project to generate DynamsoftBarcodeReader.pyd. Create a Python script under the output directory. Write a simple Python Barcode program with following code:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

import os.path

import DynamsoftBarcodeReader

 

formats = {

    0x1FFL : "OneD",

    0x1L   : "CODE_39",

    0x2L : "CODE_128",

    0x4L   : "CODE_93",

    0x8L : "CODABAR",

    0x10L   : "ITF",

    0x20L : "EAN_13",

    0x40L   : "EAN_8",

    0x80L : "UPC_A",

    0x100L   : "UPC_E",

}

 

def initLicense(license):

    DynamsoftBarcodeReader.initLicense(license)

 

def decodeFile(fileName):

    results = DynamsoftBarcodeReader.decodeFile(fileName)

    for result in results:

        print "barcode format: " + formats[result[0]]

        print "barcode value: " + result[1]

 

if __name__ == "__main__":

    barcode_image = input("Enter the barcode file: ");

    if not os.path.isfile(barcode_image):

        print "It is not a valid file."

    else:

        decodeFile(barcode_image);

Use the image that provided by Dynamsoft Barcode SDK for a test.

Now it’s your turn to create a fun Python Barcode program with Dynamsoft Barcode SDK.

Source Code

https://github.com/Dynamsoft/Dynamsoft-Barcode-Reader/tree/master/samples/Python