Python Development

Top  Previous  Next

For developers using Python, the dtwainapi.py file contains constants for the DTWAIN library.  The following small example demonstrates acquiring an image from a TWAIN device and saving to a BMP file:

 

Example:

 

from ctypes import *

import dtwainapi as dtwain

import struct

import ctypes as ct


def test_dtwain():

    # Load the DTWAIN library (make sure "dtwain32u.dll" or "dtwain64u.dll" is accessible)

    # You can use a full pathname here also, to ensure python finds the dll

    

    # Check for the python environment, and load the Unicode 64-bit or 32-bit DLL

    if struct.calcsize("P") * 8 == 64:

        dtwain_dll = dtwain.load_dtwaindll("dtwain64u.dll")

    else:

        dtwain_dll = dtwain.load_dtwaindll("dtwain32u.dll")


    # Initialize DTWAIN

    dtwain_dll.DTWAIN_SysInitialize()

    

    # Select a TWAIN source

    TwainSource = dtwain_dll.DTWAIN_SelectSource()

    if TwainSource:


        # Display the product name of the Source

        # Create a char buffer to allow calling DTWAIN_GetSourceProductNameA

        #

        # If instead you wanted to call DTWAIN_GetSourceProductName, you will need a Unicode

        # buffer, i.e. ct.create_unicode_buffer(100), as python loaded the Unicode versions

        # of the DTWAIN DLL

        #

        mystrbuf = ct.create_string_buffer(100)

        dtwain_dll.DTWAIN_GetSourceProductNameA(TwainSource, mystrbuf, len(mystrbuf))

        print (mystrbuf.value)

        

        # Example usage of DTWAIN_ARRAY:

        # Get the device capabilities supported by the device

        #

        # Note: The DTWAIN_ARRAY, DTWAIN_SOURCE, DTWAIN_FRAME, and DTWAIN_RANGE are actually void pointers

        # so you have to declare them as such if a DTWAIN function requires a parameter to be of this type.

        dtwain_array = ct.c_void_p(0)


        # Note that the second parameter is the address a DTWAIN_ARRAY, i.e. a LPDTWAIN_ARRAY

        dtwain_dll.DTWAIN_EnumSupportedCaps(TwainSource, ct.byref(dtwain_array))


        # Get the number of items in the array

        arrcount = dtwain_dll.DTWAIN_ArrayGetCount(dtwain_array)

        print(f"There are {arrcount} device capabilities")


        #print each capability

        for i in range(arrcount):

            long_val = ct.c_long(0)

            dtwain_dll.DTWAIN_ArrayGetAtLong(dtwain_array, i, ct.byref(long_val))

            dtwain_dll.DTWAIN_GetNameFromCapA(long_val, mystrbuf, len(mystrbuf))

            print(f"Capability {i+1}: {mystrbuf.value}  Value: {long_val.value}")


        # Destroy the array when done

        dtwain_dll.DTWAIN_ArrayDestroy(dtwain_array)


        # Now Acquire to a BMP file

        dtwain_dll.DTWAIN_AcquireFile(TwainSource, "TEST.BMP", dtwain.DTWAIN_BMP, dtwain.DTWAIN_USELONGNAME,

                                       dtwain.DTWAIN_PT_DEFAULT, 1, 1, 1, None)

    # Close down DTWAIN                                      

    dtwain_dll.DTWAIN_SysDestroy()


if __name__ == '__main__':

    test_dtwain()