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

Previously, I shared an article - Make Java Barcode Reader with Dynamsoft Barcode SDK - demonstrating how to implement a Java Barcode Reader with Dynamsoft Barcode SDK. In this tutorial, I’d like to share how to wrap C/C++ methods of Dynamsoft Barcode SDK to create a Barcode extension for Python.

Dynamsoft Barcode Reader SDK

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. python_include python_lib

Add a dependency python27.lib.

python_dependency

Change the Target Extension to .pyd.

python_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:

python build 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. building python successfully

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

Download and install Dynamsoft Barcode Reader.

DBR download button

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.

Python native portal

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.

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.

copy dll in visual studio

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

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.

test Python Barcode program

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

Source Code

https://github.com/dynamsoftsamples/python-barcode-reader

Search Blog Posts