EZTwain User Guide
EZTwain User Guide
EZTwain User Guide
User Guide
A developer's guide to the EZTwain
library version 3.40
Table of Contents
Table of Contents.............................................................................................1
Introduction.....................................................................................................1
Overview.........................................................................................................2
EZTwain Components....................................................................................2
EZTwain Toolkit Directory Structure.................................................................3
How-To Guide..................................................................................................4
How To: Use the Code Wizard to get started.....................................................4
How To: Use EZTwain from other languages.....................................................6
How To: Statically Link to EZTwain..................................................................7
How To: Redistribute EZTwain with your Application..........................................8
How To: Obtain a License Key.........................................................................9
How To: Select a Device for Input.................................................................10
How To: Acquire an Image...........................................................................12
How To: Negotiate Scanning Parameters........................................................13
How To: Scan a Multipage Document.............................................................14
How To: Hide the Source User Interface.........................................................15
How To: Control a Document Feeder (ADF).....................................................16
How To: Skip Blank Pages............................................................................17
How To: Read Patch Codes...........................................................................18
How To: Append to PDF, TIFF & DCX Files......................................................19
How To: Check for Device On-Line.................................................................19
How To: Do Other Random Stuff...................................................................19
Function Reference.........................................................................................21
Functions – Application Name & Licensing......................................................21
Functions – Image Acquisition.......................................................................24
Functions – Global Modes & Queries...............................................................33
Functions – Post-Processing..........................................................................35
Functions – Extended Image Information.......................................................39
Functions – DIBs & Image Processing.............................................................42
Functions – Clipboard..................................................................................65
Functions – Barcode Recognition...................................................................70
Functions – Optical Character Recognition (OCR) ............................................77
Functions – File Uploading..........................................................................104
Functions – Image Viewing.........................................................................110
Functions – Error Handling & Logging...........................................................113
Functions – TWAIN State............................................................................115
Functions – Capability................................................................................118
Functions – Settings Dialog.........................................................................135
Functions – Custom DS Data.......................................................................136
Functions – Container................................................................................137
Functions – Testing & Validation..................................................................141
Functions – Obscure (Even for TWAIN).........................................................142
Functions – Deprecated..............................................................................147
Glossary......................................................................................................149
Appendix 1 - History.....................................................................................155
Appendix 2 - Working with Containers.............................................................163
Appendix 3 - Multithreading with EZTwain .......................................................169
Appendix 4 - EZTwain Datatypes....................................................................171
Index..........................................................................................................173
EZTwain Pro User Guide
Introduction
This guide describes how to use the Dosadi EZTwain library to add scanning or
image-acquisition to a Microsoft® Windows® application. If you don’t know much
about TWAIN, the image-input standard that EZTwain is built on, don’t worry – the
necessary concepts and explanations are included.
Dosadi maintains, supports, and licenses EZTwain, as well as other tools for TWAIN
developers. For more information, please visit www.dosadi.com.
Page 1
EZTwain Pro User Guide
Overview
EZTwain Components
The EZTwain Pro Toolkit installs these files into the Windows System folder, which is
C:\WINDOWS\System32 on most versions of Windows, and into the folder called
'Redistributables' under the EZTwain Pro main folder, which is usually C:\Program
Files\EZTwain
Page 2
EZTwain Pro User Guide
Page 3
EZTwain Pro User Guide
How-To Guide
How To: Use the Code Wizard to get started
Our Code Wizard supports the following languages:
For these languages, you should launch the Code Wizard (under Start - Programs -
EZTwain) and step through it to generate code for some simple task like selecting
the default TWAIN device, or doing a scan with default settings. The Wizard includes
instructions for bringing EZTwain into your application. Then review the sections
below to see if there are any specific comments for your language.
Sample: The \vb folder contains a small EZTwain sample application called VBTwerp,
which has been tested with Visual Basic 5.
The EZTwain installer places the EZTwain3 DLLs in the System32 folder, so your
program should not have trouble finding them.
C# and VB.NET
Run the Code Wizard to get started - see above.
In the EZTwain folder (usually under Program Files), there are sample programs in
folders named: VB.NET Sample Application and CSharp Sample Application.
From .NET, EZTwain is basically just a big friend class with a lot of public/static
functions. There are a few points to be aware of:
1. All of the TWAIN_xxx functions have had the TWAIN_ prefix stripped, so they
are just EZTwain.xxx. For example, TWAIN_Acquire(0,0) becomes
EZTwain.Acquire(0,0).
2. All of the constants defined in EZTwain.vb or EZTwain.cs need to be qualified
just as the functions do e.g. EZTwain.TWPT_BW,
EZTwain.EZT_TEXT_NORMAL, and so on.
Page 4
EZTwain Pro User Guide
Please contact Dosadi technical support if you encounter any problems using
EZTwain Pro 3 from .NET. We are committed to resolving such problems promptly.
For a nice introduction to using EZTwain from VFP, see this article by Mike Lewis of
Mike Lewis Consultants Ltd:
http://www.ml-consult.co.uk/foxst-29.htm
Borland Delphi
Run the Code Wizard to get started - see above.
There is a very small Delphi EZTwain sample application, created with Delphi 6, in
the EZTwain\Delphi folder, including the project file: You should just be able to
double-click the project file to open the sample in Delphi.
Caution: The sample converts images from the DIB format delivered by EZTwain,
into the TBitmap format favored by Delphi. We do not recommend converting
images from DIB to TBitmap and back because information (particularly DPI) can be
lost if you do this.
LotusScript
PowerScript - PowerBuilder
Run the Code Wizard to get started - see above. Note that as of EZTwain Pro
3.20b11 we provide one declaration files for PowerBuilder version 10, and another for
prior versions of PowerBuilder, due to incompatible declaration syntax.
Page 5
EZTwain Pro User Guide
LabVIEW
We do not offer any pre-written LabVIEW code, but several customers have used
EZTwain from LabVIEW.
For links and the most up-to-date information about using EZTwain from LabVIEW,
visit our LabVIEW Support Page at: http://www.dosadi.com/ezt3labview.htm
Perl
We do not understand Perl! But one of our customers helped us create a Perl
declaration file and a small sample. They can be found in the EZTwain toolkit
folder \Program Files\EZTwain\Perl
Java
We do not provide a Java binding, but customers have suggested JNI, JNA, and
JNative all as useful. Search our Forum for more details:
http://www.dosadi.com/Forums/
Other languages
For other development platforms, please contact Dosadi support via our Forums
(http://www.dosadi.com/forums) or via e-mail: support@dosadi.com
Page 6
EZTwain Pro User Guide
When you install the EZTwain Pro toolkit, you designate a main folder for the various
developer files. Under that folder is a subfolder called Static containing a statically
linkable library: EZT3MT.LIB. This library contains almost all (exceptions noted
below) of the functions from Eztwain3.dll.
Note: The static library directly supports only BMP file format: To read or write any
other file format, the same DLLs as described in EZTwain Executable Files must be
present and loadable.
Page 7
EZTwain Pro User Guide
Alternative 1. Follow the lead of the EZTwain Developer Kit and install the EZTwain
DLLs in the System (System32) folder. The sample apps and various definition files
are set up for this, using unqualified references to “eztwain3.dll”.
If you have your own installer, it must compare versions before overwriting the
EZ*.DLL files in the system folder, and only overwrite a higher version with a lower
after strenuous warnings to the user. This is a specific obligation under the EZTwain
Pro License Agreement. Any responsible install tool will do this by default, or at least
offer it as an option.
This alternative leaves you exposed to the following risk: Another product could be
installed after yours, replacing your EZTwain DLL’s with higher-versioned ones. Or
vice-versa: Your application could replace older DLLs installed by a previous
application. Either way, if the new DLLs are not sufficiently backward compatible,
one or both of the applications involved can stop working. Dosadi makes every effort
to keep our DLLs backwards-compatible, but it cannot be guaranteed. This is one
form of “DLL Hell” and is a risk with using any DLL installed in a System folder.
Alternative 2. If your application compiles to an EXE file, you can install the
EZTwain DLLs in the same folder as the .EXE. Use an unqualified DLL reference as in
Alternative 1. Under this alternative, your application will always (we believe) load
and use those specific DLLs.
Alternative 3. For dynamic-binding languages like VB and FoxPro, you can use fully
qualified paths for the EZTwain DLL – If you decide to do this, replace all occurrences
of “Eztwain3.DLL” in the definition file with the full path of the DLL .e.g. “c:\Program
Files\Eztwain\Release\Eztwain3.dll” Under this alternative, your installer must install
the EZTwain DLLs in the same specific folder on every target machine, or must have
a way at run-time to find and load the DLLs.
Page 8
EZTwain Pro User Guide
Page 9
EZTwain Pro User Guide
You can implement the Select Source command with one EZTwain call:
TWAIN_SelectImageSource(0);
This function displays the TWAIN Select Source dialog, with a list of all the installed
TWAIN Sources on the system:
The user can select the new default TWAIN device or, they can cancel. If they OK
this dialog, TWAIN remembers the new default device.
Note that the Select Source dialog lists Sources (TWAIN drivers), not physical
devices: It will list devices even if they are currently off-line or unplugged. Also, two
devices that use the same driver will only appear once in the TWAIN device list.
Please don’t make the user go through the Select Source dialog each time they want
to acquire!
Page 10
EZTwain Pro User Guide
if (TWAIN_OpenSource(“Logitech Camera”) == 1) {
TWAIN_AcquireToFilename(0, “frame.bmp”);
}
This tries to open the named device, and if successful, acquires an image and stores
it in a bmp file. All of the Acquire functions work this way – If a source is open, they
use it, and otherwise they open and use the default source.
Page 11
EZTwain Pro User Guide
TWAIN_AcquireToFilename(0, “filename.bmp”)
A word about the ‘default TWAIN device’ - If there is only one TWAIN device installed
in the system, then that device is the default TWAIN device. Otherwise, it is the last
TWAIN device selected by the user in the Select Source dialog.
hdib = TWAIN_Acquire(0);
if (hdib != 0) {
DIB_WriteToFilename(hdib, “last_scan.tif”);
DIB_Free(hdib); hdib = 0;
}
This acquires a single image from the default device, formats it in memory as a DIB,
and returns a handle to it - A handle, not a pointer. Then it writes the DIB out as a
TIFF file, and frees the DIB.
Note that the returned object is a DIB. There is a Windows object commonly called a
Bitmap, short for Device-Dependent Bitmap or DDB – a DIB is not a DDB! A DIB is a
completely different animal.
If something goes wrong with the transfer, the return value will be NULL (0).
The DIB_Free call is needed to release the memory holding the image. If you don’t
do that, the image sits around taking up memory until your program exits.
Page 12
EZTwain Pro User Guide
TWAIN also imposes the restriction that settings can only be set while the Source is
open and before it has been enabled. ‘Enabled’ in TWAIN means given the go-ahead
to acquire images.
To cut to the chase, here’s a C fragment for scanning a 1-bit, 300dpi, B&W image:
if (TWAIN_OpenDefaultSource()) {
// DS is now in State 4 (Open)
TWAIN_SetPixelType(TWPT_BW);
TWAIN_SetBitDepth(1);
// (probably redundant for BW)
TWAIN_SetUnits(TWUN_INCHES);
TWAIN_SetResolution(300.0);
hdib = TWAIN_Acquire(0);
}
This code does no error checking on the Set functions, even though some of them
will certainly fail on some devices. For example, almost any webcam will reject a
pixel type of TWPT_BW, and probably a resolution setting of 300 – it might reject
any attempt to set resolution.
It is recommended to select a pixel type first, then to set the bit depth – some
devices maintain bit depths for each pixel type.
Page 13
EZTwain Pro User Guide
To scan from the default TWAIN device into a multipage TIFF file takes one call:
TWAIN_AcquireMultipageFile(hwnd, “multipage.tif”);
The first parameter is the window handle of your main window – if you can’t easily
obtain this, just pass a 0 - EZTwain will use the handle of the active window if any,
or it will create an invisible window if there is no active window. The second
parameter is the filename to create - EZTwain uses the extension to select the format
of the file: .TIF, .TIFF, or .MPT means write a TIFF file, .PDF means write a PDF, etc.
TWAIN_AcquireMultipageFile will present the scanner’s user interface, and will accept
scans from the scanner (or images from a camera or webcam) until the user closes
the scan dialog. A few devices will close their window automatically after sending
one image - in some cases EZTwain can detect this and will prompt the user asking if
there are more images. All of this is invisible to your application.
If you do not want to display the device’s user interface, you can use code like the
following. If the default TWAIN device is a scanner with an Automatic Document
Feeder (ADF), this code will scan all the pages in the feeder:
if (TWAIN_OpenDefaultSource()) {
TWAIN_SetHideUI(1); // ask for no user interface
TWAIN_SetResolution(300); // ask for 300 DPI
TWAIN_SetPixelType(TWPT_BW); // black & white
TWAIN_SelectFeeder(1); // from feeder (if possible)
TWAIN_EnableDuplex(1); // both sides (if supported)
TWAIN_AcquireMultipageFile(hwnd, “multipage.tif”);
}
if (TWAIN_LastErrorCode() != 0) {
TWAIN_ReportLastError(“Error during scanning.”);
}
If the current TWAIN device is a flatbed scanner, this code will immediately scan
from the flatbed, then display a small message box asking if there are more pages to
scan. As long as the user answers ‘Yes’, the TWAIN_AcquireMultipageFile function
will continue to scan another page.
It’s important to specify at least the resolution and pixel type when the scanner user
interface is suppressed, otherwise you have no way of knowing what settings the
scanner will use.
Page 14
EZTwain Pro User Guide
In theory
Make the following call before any Acquire calls, and images will arrive from your
device with no distracting dialogs or windows on screen:
TWAIN_SetHideUI(1)
In practice
Some devices will refuse to cooperate and will display their user interface (UI)
anyway. A few particularly bad TWAIN device drivers will crash when used this way.
Even in No-UI mode, many devices will display a status or progress box while
scanning or transferring data. Sometimes the progress box can be suppressed [see
TWAIN_SetIndicators, p. 125.]
If the device is not connected and powered up, if the paper jams, or if anything else
happens that requires human attention, most devices will display an error dialog.
Suppressing such error messages requires low-level Windows programming outside
the scope of TWAIN or EZTwain.
You can count on almost all desktop scanners, departmental scanners, and high-
volume scanners to scan well without showing their UI.
Some webcams will transfer with no UI, for example the Logitech QuickCams.
You cannot count on a digital still camera (DSC) to transfer all its images from
memory in No-UI mode. Last time we checked (2005) most DSCs ignore the request
to hide their UI.
If you must automate a device that insists on displaying its user interface (almost
any webcam, for example) you can try the function TWAIN_AutoClickButton.
Page 15
EZTwain Pro User Guide
if (!TWAIN_OpenDefaultSource()) {
return; // unable to open device?
}
TWAIN_SetHideUI(1); // hide the user interface
TWAIN_SetMultiTransfer(1); // leave device open after Acquire
TWAIN_SelectFeeder(1); // tell device: ‘use feeder’
TWAIN_SetAutoFeed(1); // tell device: ‘feed automatically’
TWAIN_SetAutoScan(1); // tell device: ‘scan ahead’
TWAIN_EnableDuplex(1); // tell device: ‘both sides, if you can’
// OK - start scanning
do {
HANDLE hdib = TWAIN_Acquire (0);
if (hdib==0) {
// something went wrong…
break;
}
ProcessThisPage(hdib);
DIB_Free(hdib);
} while (TWAIN_State() > 5);
TWAIN_CloseSource();
Be aware that TWAIN_SelectFeeder can fail on a scanner that looks for all the world
to have a document feeder. One of the biggest players in consumer scanners has
shipped a variety of sheet-feeding models that deny (through TWAIN) having
feeders. The above code fragment will probably drive such devices, even though
both the Feeder-related functions fail.
Page 16
EZTwain Pro User Guide
TWAIN_SetBlankPageMode(1)
If you are not using AcquireMultipageFile, you will need to call functions to detect
blank pages and handle them in your control flow. Below we have taken a standard
multipage scanning loop in Visual Basic generated by the Code Wizard, and added
code to ignore blank pages:
Page 17
EZTwain Pro User Guide
TWAIN_SetCapability(ICAP_PATCHCODEDETECTIONENABLED, 1)
or EZTwain.SetCapability(ICAP_PATCHCODEDETECTIONENABLED, 1)
Then we need to tell EZTwain to ask for 'extended image info' after each scan,
specifically the patch code. Something like this:
TWAIN_EnableExtendedInfo(TWEI_PATCHCODE, 1)
That 1 may need to be TRUE, True or true, depending on programming language.
Page 18
EZTwain Pro User Guide
TWAIN_SetFileAppendFlag(1);
TWAIN_AcquireMultipageFile(0, “papertrail.pdf”);
This will scan pages from the default TWAIN device, appending them to the file
“papertrail.pdf” until the operator closes the device dialog. The effect of adding the
call to TWAIN_SetFileAppendFlag is that if papertrail.pdf already exists the new
pages are added to it. If papertrail.pdf does not exist, it is created.
Obscure Exception: This cannot be used with TWAIN_AcquireFile, because with that
function the TWAIN driver writes the file, not EZTwain.
To turn off the 'auto rotation' feature of certain scanners, such as the Canon network
scanners:
TWAIN_SetCapBool(ICAP_AUTOMATICROTATION, 0)
Page 19
EZTwain Pro User Guide
Function Reference
Functions – Application Name & Licensing
Note: If you installed the EZTwain Pro developer kit on your system, the terms of the
EZTwain License are available under Start – Programs – Dosadi, in License.txt in the
EZTwain folder, and on the web at: http://www.dosadi.com/EZT3_License.pdf
TWAIN_SetAppTitle
void TWAIN_SetAppTitle(string Title)
TWAIN_ApplicationLicense
void TWAIN_ApplicationLicense(string pzAppTitle, int nAppKey)
Sets the title of the application (as far as EZTwain is concerned) and unlocks
EZTwain using a Single Application Redistribution Key. It unlocks EZTwain Pro, if the
numeric key (nAppKey) matches the application title. Make sure you use the exact
string used to purchase the license – it is listed with the key in the grant-of-license
e-mail. This should be the first EZTwain call your application makes, other than
TWAIN_LogFile.
TWAIN_SetApplicationKey
void TWAIN_SetApplicationKey(int nAppKey)
TWAIN_SetVendorKey
void TWAIN_SetVendorKey(string pzVendorName, int nKey)
Page 21
EZTwain Pro User Guide
This should be the first EZTwain call your application makes, except for
TWAIN_LogFile.
Use TWAIN_SetAppTitle to tell EZTwain the name of the application.
TWAIN_OrganizationLicense
void TWAIN_OrganizationLicense(string pzOrganization, int nKey)
Unlocks EZTwain using an In-House Application License key – Sometimes also called
an Organization License key. Make sure you use the exact string that was entered
for ‘Organization’ on the order – it is listed with the key in the grant-of-license e-
mail. This should be the first EZTwain call your application makes, except for
TWAIN_LogFile.
Page 22
EZTwain Pro User Guide
TWAIN_SingleMachineLicense
BOOL TWAIN_SingleMachineLicense(string Prompt)
This function is for use in applications that will deployed on a small number of
computers, using the EZTwain Pro Single Machine License – which is a per-machine
license. Call this function when your application starts up, perhaps even during
installation of your application, and it will prompt as needed for a license key on each
machine.
When called, this function checks to see if EZTwain Pro is licensed to run on this
computer at this time.
1. If the running copy of EZTwain is licensed in any way - including a trial license
- this function silently returns TRUE(1) to the caller.
2. If no license is found, this function displays a 'license needed' dialog, with the
Prompt argument at the top of the dialog. If an application title has been set
with TWAIN_SetAppTitle, it is used as the title of the dialog.
The user is told how to obtain a license key and how to enter it. Once a key is
entered and found valid, it is stored on the computer and the function returns
TRUE(1). Note: For this function to accept and store a license key, it must be
running with Administrative privileges.
3. If the user cancels the licensing dialog, this function will normally return
FALSE(0), which means that EZTwain is not licensed to run on the computer.
You can use the Prompt argument to direct users to an in-house support person who
can help resolve licensing problems. For example:
If the Prompt string is empty, a default prompt similar to the following is used:
Page 23
EZTwain Pro User Guide
General Comments
EZTwain is built on a principal of brevity: You should only need to make calls or pass
parameters, where EZTwain cannot reasonably guess what you want.
Advice: When developing, we strongly suggest that you start with a simple call to
TWAIN_AcquireToFilename (if you need a file), TWAIN_AcquireMultipageFile (to scan
a multipage document) or TWAIN_Acquire (if you need an image in memory.) Then
add additional calls one by one to get the exact behavior you ultimately want.
By default, all Acquire functions shut down TWAIN before returning. If you are doing
a series of transfers from the same device, it is much faster to leave the device open
between transfers. You can use a multipage scanning function to do this, or use
TWAIN_SetMultiTransfer (p 33) to keep the device open for multiple transfers.
All Acquire functions load TWAIN and then open and enable the default Source, if
needed. EZTwain goes to great lengths to track the TWAIN State, and will generally
move TWAIN automatically from state to state as needed. For example, if you start
by calling TWAIN_OpenSource, EZTwain makes the necessary calls to transition from
State 1 to State 4. If you then call an Acquire function, EZTwain sees that there is a
Source open, and proceeds with acquisition from that device.
By default, the Acquire functions tell the device to display its user interface. Use
TWAIN_SetHideUI to change this.
Page 24
EZTwain Pro User Guide
TWAIN_AcquireToFilename
int TWAIN_AcquireToFilename(HWND hwndApp, string pszFile)
Acquire an image and save it to a file. If the filename contains a standard extension
(.bmp, .jpg, .jpeg, .tif, .tiff, .png, .pdf, .gif, .dcx) then the file is saved in the implied
format. Otherwise the file is saved in the default save format– see
TWAIN_SetSaveFormat (p 94).
If pszFile is NULL or an empty string, the user is prompted for the file name and
format with a standard Save File dialog. Only available and appropriate formats are
presented in the Save File dialog. In this case if you need to know the filename the
user chose, you can call TWAIN_LastOutputFile (p ).
Return values:
0 success.
-1 the Acquire failed.
-2 file open error (invalid path or name, or access denied)
-3 invalid DIB, or image incompatible with file format, or...
-4 writing failed, possibly output device is full.
-10 user cancelled File Save dialog
The minimal use of EZTwain is to call this function with null arguments:
TWAIN_Acquire
HANDLE TWAIN_Acquire(HWND hwndApp)
Acquires a single image, from the currently selected Source, using EZTwain's
preferred transfer mode.
To acquire an RGB image with 8 bits/channel, you need to do something like this:
TWAIN_SetPixelType(TWPT_RGB);
hdib = TWAIN_Acquire(hwnd)
if (hdib) {
// process image
DIB_Free(hdib);
}
Page 25
EZTwain Pro User Guide
TWAIN_AcquireMultipageFile
int TWAIN_AcquireMultipageFile(HWND hwndApp, string Filename)
If the filename ends with a recognized extension, the file is written in the implied
format: .TIF/.TIFF/.MPT => TIFF, .DCX => DCX format, and .PDF => PDF.
If the filename has no recognized extension, the file is written in the default
multipage format as set by TWAIN_SetMultipageFormat (p 34).
If Filename is NULL or the empty string, the user will be prompted for the file name.
The only format offered will be the current default multipage format. If you use this
feature, you can call TWAIN_LastOutputFile to obtain the actual filename.
Return values:
0 success
-1 the Acquire failed.
-2 file open error (invalid path or name, or access denied)
-3 invalid DIB
-4 writing failed, possibly output device is full.
-10 user cancelled File Save dialog
If you want to set scanning parameters (resolution, pixeltype...) first open the source
(see OpenDefaultSource or OpenSource) then negotiate the settings using the
capability functions, and then call AcquireMultipageFile.
Page 26
EZTwain Pro User Guide
TWAIN_AcquireToArray
int TWAIN_AcquireToArray(HWND hwnd, HDIB ahdib[], int nMax)
Page 27
EZTwain Pro User Guide
TWAIN_AcquireImagesToFiles
int TWAIN_AcquireImagesToFiles(HWND hwndApp, string Filename)
If the filename is NULL or points to the empty string, the user is prompted for the
name of the first file using a standard Save dialog.
Auto-numbering
The first image acquired is written to the specified filename. Subsequent filenames
are auto-numbered according to this algorithm:
1. If the previous filename, excluding extension, does not end in one or more
digits, then it is treated as if it ended with '0'.
2. If the previous name, excluding extension, ends in a sequence of d digits
specifying the number n, then the next filename is created by replacing the
sequence of digits with a sequence of digits representing the number n+1,
padded with leading 0's to make it at least d digits long.
Examples
Filename (1st File) 2nd File 3rd File
Document.tif Document1.tif Document2.tif
Page98.jpg Page99.jpg Page100.jpg
Invoice00001.pdf Invoice00002.pdf Invoice00003.pdf
Page 28
EZTwain Pro User Guide
TWAIN_AcquirePagesToFiles
int TWAIN_AcquirePagesToFiles(HWND hwnd, int nPPF, string sFile)
Like AcquireImagesToFiles, but can handle duplex scanning and multipage files.
See Controlling Duplex Mode.
hwnd = parent window. Use 0 (NULL) if you can't obtain the window handle.
Example: Assume you want to load a batch of 2-page single-sided forms into your
ADF-equipped scanner and turn them into individual PDF files. Following the code
needed to open and configure the scanner for paper size, pixel type, resolution,
duplex(off) and so on, the actual scan can be performed by:
TWAIN_AcquirePagesToFiles(hwnd, 2, “form0001.pdf”)
This will scan 2 pages at a time until the feeder runs empty, writing the first two
pages into form0001.pdf, the next two pages into form0002.pdf, and so on.
If you later need to scan forms that are printed on both sides - and assuming your
scanner can scan duplex - you would insert a line to select duplex mode before
starting the scan:
TWAIN_EnableDuplex(TRUE)
TWAIN_AcquirePagesToFiles(hwnd, 2, “form0001.pdf”)
The AcquirePages function adapts correctly, scanning 2 pages at a time, which now
produces 4 images (front, back, front, back), and collecting each 2-page form into a
sequentially numbered PDF file, as before.
If you condense your original 2-page single-sided forms onto 1 double-sided page,
then you have to change the number of pages per file:
TWAIN_EnableDuplex(TRUE)
TWAIN_AcquirePagesToFiles(hwnd, 1, “form0001.pdf”)
This takes each 1-page form in the feeder, scans both sides, and writes a
corresponding PDF file containing the front and back image.
Page 29
EZTwain Pro User Guide
TWAIN_AcquireCount
int TWAIN_AcquireCount()
Returns the number of images received from the scanner during the most recent
multipage Acquire function (such as TWAIN_AcquireMultipageFile).
TWAIN_BlankDiscardCount
int TWAIN_BlankDiscardCount()
Returns the number of pages discarded as blank during the most recent multipage
Acquire function. See TWAIN_SetBlankPageMode (p 35).
Page 30
EZTwain Pro User Guide
TWAIN_AcquireMemory
HANDLE TWAIN_AcquireMemory (HWND hwnd)
Note: This function must be used to transfer 16-bit per channel images (16-bit
grayscale, 48-bit color) – assuming your scanner supports this. These ‘deep’ images
are returned in a DIB format that most software (including Windows) will not
understand – but most of EZTwain’s DIB_ functions will operate on these deep DIBs,
and they can be written to TIFF.
Page 31
EZTwain Pro User Guide
TWAIN_AcquireFile
int TWAIN_AcquireFile(HWND hwndApp, int nFF, string pszFile)
Acquire one image and write it to a file using TWAIN File Transfer Mode. This is an
exotic transfer mode, not supported by all TWAIN devices. Do not use this function
unless you have a specific reason and understand the consequences. If you just
want to scan one image or page to a file, use TWAIN_AcquireToFilename.
Warning: File Transfer Mode is not supported by all TWAIN devices, and
when it is supported, often BMP is the only supported file format.
You can open a Source and then use TWAIN_SupportsFileXfer to see if the DS
supports File Transfer Mode.
nFF can be any file format supported by the DS, see the TWFF_* constants in twain.h
for the list of allowed formats. A compliant DS should at least support TWFF_BMP,
but as usual there are no guarantees.
If pszFile is NULL or an empty string, the user is prompted for the file name in a
standard Save File dialog. If you use this feature, you can call
TWAIN_LastOutputFile to obtain the actual filename.
TWAIN_AcquireToClipboard
int TWAIN_AcquireToClipboard(HWND hwndApp, unsigned wPixTypes)
Like AcquireNative, but puts the resulting image, if any, into the system clipboard as
a CF_DIB item. If this call fails, the clipboard is either empty or retains its previous
content.
Useful for environments like Visual Basic where it is hard to make direct use of a DIB
handle. TWAIN_AcquireToClipboard uses TWAIN_AcquireNative and
DIB_PutOnClipboard.
Page 32
EZTwain Pro User Guide
TWAIN_EasyVersion
int TWAIN_EasyVersion()
TWAIN_IsAvailable
int TWAIN_IsAvailable()
Call this function any time to find out if TWAIN is installed on the system. It takes a
little time on the first call, after that it's extremely fast. It returns 1 if the TWAIN
Source Manager is installed and can be loaded, 0 otherwise.
TWAIN_SetHideUI / TWAIN_GetHideUI
TWAIN_SetHideUI(int fHide)
int TWAIN_GetHideUI()
These functions control the 'hide source user interface' flag. This flag is initially
FALSE(0), but if you set it non-zero, then when a source is enabled it will be asked to
hide its user interface. Note this is a request - some sources will ignore it.
See: How To: Hide the Datasource User Interface.
If the user interface is hidden, you will probably want to set at least some of the
basic acquisition parameters yourself – see Negotiating Scanning Parameters . See
also: HasControllableUI
TWAIN_SetMultiTransfer / TWAIN_GetMultiTransfer
TWAIN_SetMultiTransfer(int fYes)
int TWAIN_GetMultiTransfer()
If the multi-transfer flag is non-zero: After an Acquire, the Source is left open and
enabled to allow additional images to be acquired in the same session. The
programmer may need to close the Source after all images have been transferred, for
example by calling TWAIN_CloseSource or TWAIN_UnloadSourceManager
Page 33
EZTwain Pro User Guide
TWAIN_DisableParent / TWAIN_GetDisableParent
void TWAIN_DisableParent(int fYes)
int TWAIN_GetDisableParent (void)
Note 1: If you set this to FALSE, your window can receive user input while an Acquire
is in progress, and your code must be prepared for this.
Note 2: Some TWAIN Sources will disable the parent window on their own, and
EZTwain cannot prevent this.
TWAIN_SetMultipageFormat
TWAIN_GetMultipageFormat
int TWAIN_SetMultipageFormat(int nFF)
int TWAIN_GetMultipageFormat()
Select/query the default multipage file save format, the file format used to write
multipage files when the file format cannot be inferred from the file extension.
If you use a recognized extension in the name of your multipage file - such as .tif,
.tiff, .mpt, .pdf or .dcx, then the file will be written in the implied format. The file
extension overrides SetMultipageFormat.
SetMultipageFormat returns:
0 success,
-1 invalid/unrecognized format (bad parameter value)
-3 format is currently unavailable (missing/bad DLL)
-7 Multipage support is not installed.
Page 34
EZTwain Pro User Guide
Functions – Post-Processing
Post-processing is the industry term for everything you do to an image after it has
been scanned or captured, before you store it or pass it on.
TWAIN_SetAutoCrop/TWAIN_GetAutoCrop
TWAIN_SetAutoCrop(int nMode)
int TWAIN_GetAutoCrop()
TWAIN_SetAutoContrast/TWAIN_GetAutoContrast
TWAIN_SetAutoContrast(int nMode)
int TWAIN_GetAutoContrast()
TWAIN_SetAutoDeskew/TWAIN_GetAutoDeskew
TWAIN_SetAutoDeskew(int nMode)
int TWAIN_GetAutoDeskew()
TWAIN_SetBlankPageMode / TWAIN_GetBlankPageMode
TWAIN_SetBlankPageMode(int nMode)
int TWAIN_GetBlankPageMode()
Set or get the Skip Blank Pages mode. When this mode is 1, blank pages are
automatically discarded by TWAIN_AcquireMultipageFile.
When this mode is 0 (the default), EZTwain does not look for blank pages or treat
them in any special way.
See TWAIN_SetBlankPageThreshold (below) for more details.
Page 35
EZTwain Pro User Guide
TWAIN_SetBlankPageThreshold /
TWAIN_GetBlankPageThreshold
TWAIN_SetBlankPageThreshold(double dDarkness)
double TWAIN_GetBlankPageThreshold()
Set or get the blank page threshold, which affects the operation of Skip Blank Pages
mode. The blank page threshold is a number between 0 and 1.0. If the number of
‘dark’ pixels on a page divided by the total number of pixels on the page is less than
this threshold, the page is considered ‘blank’.
See DIB_IsBlank (p 62) and DIB_Darkness (p 62) for more details about the
algorithm for computing ‘dark’ pixels.
TWAIN_SetAutoOCR / TWAIN_GetAutoOCR
TWAIN_SetAutoOCR(int nMode)
int TWAIN_GetAutoOCR()
Sets or gets the auto-OCR mode. By default this mode is OFF(0). When this mode
is on(1), EZTwain applies OCR, if available, to each incoming scanned page or image
and temporarily stores the result. Also in this mode, if you scan directly to PDF
format using TWAIN_AcquireToFilename or TWAIN_AcquireMultipageFile, the OCR'd
text is written invisibly to each PDF page, to facilitate indexing and searching. If you
are scanning individual pages you can call OCR_Text or OCR_GetText to retrieve the
text found on the last scanned page.
The currently selected OCR engine is used: See OCR_SelectEngine and related
functions. Caution: If OCR fails for some reason in auto-OCR mode, an error is
recorded (see TWAIN_LastErrorCode, TWAIN_ReportLastError) but the scanning
function may report success.
TWAIN_SetAutoNegate/TWAIN_GetAutoNegate
TWAIN_SetAutoNegate(BOOL bYes)
BOOL TWAIN_GetAutoNegate()
Controls the 'auto-negate' mode. Unlike most post-processing modes, this mode is
on by default.
Auto-negate mode analyzes each incoming B&W (1-bit/pixel) image during scanning.
If the image is more than 80% black, it is ‘negated’ - black and white are reversed.
A surprising number of scanners incorrectly deliver negative images under certain
circumstances, and this mode compensates for that.
Page 36
EZTwain Pro User Guide
TWAIN_SelectImageSource
int TWAIN_SelectImageSource(HWND hwnd)
This function posts the Source Manager's Select Source dialog box, which allows the
user to see and possibly change the default TWAIN device for their computer. Note:
If only one TWAIN device is installed on a system, it is selected automatically, so
there is no need for the user to do Select Source. You should not require your users
to do Select Source before Acquire.
Note that this dialog is displayed by the TWAIN Source Manager (twain_32.dll) not
by EZTwain, and we have no direct control over its size, location, layout, etc. If you
want a different UI, you can create your own using the functions below.
It usually works well to pass a 0 to this function: EZTwain then finds and refers to
the ‘Foreground Window’, and the Select Source dialog acts as a modal child of that
window. If for some reason that isn’t what you want, you’ll need to pass another
valid HWND (Windows window-handle) to this function.
TWAIN_GetSourceList
int TWAIN_GetSourceList(void)
Fetches the list of sources into memory, so they can be returned one by one by
TWAIN_GetNextSourceName, below.
Returns TRUE (1) if successful (at least one Source was found), FALSE (0) otherwise.
TWAIN_GetNextSourceName/TWAIN_NextSourceName
int TWAIN_GetNextSourceName(LPSTR pzName)
string TWAIN_NextSourceName()
TWAIN_GetNextSourceName copies the next source name in the list into pzName –
up to 32 characters (ANSI) plus a terminating NUL (0 byte).
Returns TRUE (1) if successful, FALSE (0) if there are no more.
TWAIN_GetDefaultSourceName
TWAIN_DefaultSourceName
int TWAIN_GetDefaultSourceName(LPSTR pzName)
Page 37
EZTwain Pro User Guide
char* TWAIN_DefaultSourceName()
TWAIN_SourceName
char* TWAIN_SourceName(void)
Returns the name of the currently or last opened source, as a string. C/C++
developers: Note that this is always an 8-bit ASCII string.
TWAIN_GetSourceName
void TWAIN_GetSourceName(LPSTR pzName)
Like TWAIN_SourceName, but copies the name string into its argument. Please
allocate enough space: 64 char at least.
Page 38
EZTwain Pro User Guide
The EZTwain model of this feature is fairly simple. As part of configuring for a scan,
the application uses TWAIN_EnableExtendedInfo to specify which type of extended
information should be collected. Each type of information is represented by a
numeric constant defined in the TWAIN standard, such as TWEI_BARCODETEXT or
TWEI_SKEWORIGINALANGLE. After an image is received, using TWAIN_Acquire for
example, we provide functions to count and read the collected information.
We have included the necessary TWEI_ constants in our declaration files, but for
explanation and details you should contact us (www.dosadi.com) or visit the TWAIN
website (www.twain.org) to obtain a copy of the TWAIN Standard.
TWAIN_IsExtendedInfoSupported
BOOL TWAIN_IsExtendedInfoSupported()
Asks the currently open device if it can generate Extended Image Info.
Returns TRUE(1) if yes, FALSE(0) if not. This will fail and record an error if no
TWAIN device is currently open through EZTwain.
TWAIN_EnableExtendedInfo
BOOL TWAIN_EnableExtendedInfo(long eiCode, BOOL enabled)
TWAIN_IsExtendedInfoEnable
BOOL TWAIN_IsExtendedInfoEnabled(long eiCode)
TWAIN_DisableExtendedInfo
void TWAIN_DisableExtendedInfo()
Disables all extended image info – calling this function stops collection of extended
image information.
Page 39
EZTwain Pro User Guide
You can think of the extended image information as returning an array of 0 or more
values for each enabled TWEI_ code. TWAIN_ExtendedInfoItemCount tells you how
many values were returned for a given TWEI_ code. When you ask for a value, you
always have to specify both the TWEI_ code and a value index. The value index is
overkill in almost all cases: You will commonly specify an index of 0, meaning the
first available value.
Remember: All of these functions refer to information collected from the last scan.
TWAIN_ExtendedInfoItemCount
long TWAIN_ExtendedInfoItemCount(long tweiCode)
TWAIN_ExtendedInfoItemType
long TWAIN_ExtendedInfoItemType(long tweiCode)
Returns a number indicating the type of data returned for the specified extended
info, using the same TWTY_ codes as CONTAINER_ItemType (see page 164).
TWAIN_ExtendedInfoInt
long TWAIN_ExtendedInfoInt(long tweiCode, long n)
Returns the (32-bit integer) value of the 'nth' item of the specified extended info.
TWAIN_ExtendedInfoFloat
double TWAIN_ExtendedInfoFloat(long tweiCode, long n)
Returns the (floating point) value of the 'nth' item of the specified extended info.
TWAIN_GetExtendedInfoString
BOOL TWAIN_GetExtendedInfoString(long tweiCode, long n, LPSTR
Buffer, long Bufsize)
Read the string value of the nth item of the specified info into Buffer, which has been
allocated by the caller to hold Bufsize characters.
Note that the value returned is ASCII (byte) text, not unicode, and always
includes an ending 0 byte, even if it must be truncated to fit.
Returns TRUE if the data was retrieved and could fit in the buffer, FALSE otherwise.
In all languages, the caller must ensure that the 3rd parameter (Buffer) has been
allocated as a block of characters (bytes) and that the address of the first byte of the
allocated buffer is passed to the function. In classic VB for example, this requires
Page 40
EZTwain Pro User Guide
passing the first buffer element by reference. Contact Dosadi Support if you have
questions about this.
TWAIN_ExtendedInfoString
string TWAIN_ExtendedInfoString(long tweiCode, long n)
If your programming language has strings that are natively UNICODE, this function,
if available at all, will return a native string and the comments above about
ASCII/byte text do not apply: The string is converted to native format when it is
returned from the function.
TWAIN_GetExtendedInfoFrame
BOOL TWAIN_GetExtendedInfoFrame(
long tweiCode, long n,
double *L, double *T, double *R, double *B)
Fetch the TW_FRAME value of the 'nth' item of the specified extended info. A frame
is a TWAIN concept usually used to represent a rectangle – left, top, right, bottom.
This is rarely used, but is here for completeness.
Page 41
EZTwain Pro User Guide
DIB_Width
int DIB_Width (HANDLE hdib)
DIB_Height
int DIB_Height (HANDLE hdib)
DIB_Depth
int DIB_Depth (HANDLE hdib)
DIB_PixelType
int DIB_PixelType(HANDLE hdib)
Analyzes the DIB and returns a pixel type code that describes the format of the DIB’s
pixels:
DIB_XResolution
double DIB_XResolution(HANDLE hdib)
DIB_YResolution
double DIB_YResolution (HANDLE hdib)
Page 42
EZTwain Pro User Guide
DIB_SetResolution/DIB_SetResolutionInt
void DIB_SetResolution(HANDLE hdib, double xdpi, double ydpi)
void DIB_SetResolutionInt(HANDLE hdib, int xdpi, int ydpi)
Sets the horizontal or vertical resolution of the DIB. The ‘Int’ form is for languages
that cannot easily pass double (64-bit floating point) parameters.
DIB_PhysicalWidth / DIB_PhysicalHeight
double DIB_PhysicalWidth(HDIB hdib, int nUnits)
double DIB_PhysicalHeight(HDIB hdib, int nUnits)
Return the width(height), in the specified units, of the given image, calculated using
its pixel width(height) and X(Y) resolution.
If the resolution is 0, these functions return 0.
nUnits is one of the TWUN_ values - see page 118 - 0=inches, 1=cm, etc.
DIB_Allocate
HANDLE DIB_Allocate(int nDepth, int nWidth, int nHeight)
Create a DIB with the given dimensions. Resolution is set to 0. A default grayscale
table is provided if depth <= 8. The image data is uninitialized i.e. garbage.
DIB_Create
HANDLE DIB_Create(int nType, int nWidth, int nHeight, int nDepth)
Create a DIB with the given pixel type, dimensions, and depth. See Pixel Types,
page 42. If a depth of 0 is given, the default depth for the given pixel type is used.
Resolution is set to 0. If the pixel type calls for a color table (TWPT_BW,
TWPT_GRAY, or TWPT_PALETTE) a default color table is provided. The image data is
uninitialized.
DIB_Copy
HANDLE DIB_Copy(HANDLE hdib)
DIB_Free
void DIB_Free(HANDLE hdib)
DIB_RowBytes
size_t DIB_RowBytes(HANDLE hdib)
Page 43
EZTwain Pro User Guide
DIB_ReadRow
DIB_ReadRowRGB
DIB_ReadRowGray
DIB_ReadRowChannel
void DIB_ReadRow(HANDLE hdib, int r, BYTE* prow)
void DIB_ReadRowRGB(HANDLE hdib, int r, BYTE* prow)
void DIB_ReadRowGray(HANDLE hdib, int r, BYTE *prow)
void DIB_ReadRowChannel(HANDLE hdib, int r, BYTE *prow, int c)
DIB_ReadRow reads the raw row data from the DIB, including BGR pixels from 24-bit
DIBs, 1-bit, 4-bit or 8-bit, 16-bit, or even 48-bit pixels.
DIB_ReadRowRGB converts each pixel into the nearest equivalent 3-byte RGB pixel.
DIB_ReadRowGray converts every pixel to an 8-bit grayscale or “brightness” value.
DIB_ReadRowChannel extracts the 8-bit channel or component of each pixel, as
described in Component Codes, page 62
The caller is responsible for making sure there is enough room in the buffer (pointed
to or referenced by the prow parameter.) Buffer sizes required are as follows:
DIB_WriteRow
void DIB_WriteRow(HANDLE hdib, int r, const BYTE* pdata)
DIB_WriteRowChannel
void DIB_WriteRowChannel(HANDLE hdib, int r, const BYTE* pdata,
int nChannel)
Write data from buffer into one color channel of row r of the given image.
When writing a 24-bit RGB image, valid channels are: 1=Red, 2=Green, 3=Blue.
When writing to a 32-bit RGBA image, channel 4=alpha.
When writing to an 8-bit gray image, channel 0 = gray.
When writing to a 24-bit CMY or 32-bit CMYK image, 1=Cyan, 2=Magenta, 3=Yellow,
4=blacK.
This function should not be used on any other image format.
Page 44
EZTwain Pro User Guide
DIB_Equal
BOOL DIB_Equal(HANDLE hdib1, HANDLE hdib2)
Return TRUE (1) if the two DIBs are valid, have the same parameters, and are the
same color pixel-for-pixel.
DIB_ColorCount
int DIB_ColorCount(HANDLE hdib)
DIB_SetGrayColorTable
void DIB_SetGrayColorTable(HANDLE hdib)
Fill the DIB's color table with a gray ramp - so color 0 is black, and the last color
(largest pixel value) is white. No effect if depth > 8. The DIB must already have a
color table allocated.
DIB_SetColorTableRGB
void DIB_SetColorTableRGB(HANDLE hdib, int i, int R, int G, int
B)
Set the ith entry in the DIB's color table to the specified color. R G and B range from
0 to 255.
Return the R,G, or B component of the ith color table entry of a DIB.
If i < 0 or >= DIB_ColorCount(hdib), returns 0.
Page 45
EZTwain Pro User Guide
DIB_DrawOnWindow
void DIB_DrawOnWindow(HANDLE hdib, HWND hwnd)
DIB_DrawToDC
void DIB_DrawToDC( HANDLE hdib, // DIB handle
HDC hDC, // destination device context
int dx, int dy,// destination (x,y)
int w, int h, // width and height
int sx, int sy // source (x,y) in DIB
)
Draws the DIB on the device context. You should call CreateDibPalette, select that
palette into the DC, and do a RealizePalette(hDC) first. Before using this call, you
should have some understanding of the Windows GDI and Device Contexts.
Page 46
EZTwain Pro User Guide
EZTwain Pro uses this format internally, representing each image as a global
handle to a block of memory containing a DIB header immediately followed by
the pixel data. DIBs can store a wide variety of image formats, and retain
resolution (DPI) information. In native Win32 programming, the DIB is the
standard general-purpose image format, although it is usually referenced using
pointers rather than a global handle.
Often simply called a ‘bitmap’, and referenced in the Win32 API by a handle
called an HBITMAP, a DDB has a device-dependent pixel format (although
actually the 1-bit format is standardized) and can only be manipulated by the
video device driver that created it. DDBs do not store resolution (DPI)
information. It is not generally meaningful to save a DDB to a file.
Today, DDBs are only useful in two contexts: They are still the easiest way to
embed fixed graphics as resources into a Windows program in C/C++. And if you
need the absolute maximum speed, they are probably the fastest way to move
pixels to and from the display.
3. The DibSection
This is a strange hybrid object, an HBITMAP that wraps a DIB. Many languages
and imaging classes (such as GDI+, .NET Image, Delphi TBitmap) do not easily
accept DIBs but readily accept a DIBSection as an HBITMAP.
This is a COM object wrapper for an image - it can wrap either a bitmap or a
Windows Metafile (WMF). VB supports this format as the Picture type - when
calling EZTwain from VB, you can use DIB_ToPicture and DIB_FromPicture.
The .NET framework introduced the Image class. When using EZTwain from
VB.NET, you can use the function DIB_ToImage.
Page 47
EZTwain Pro User Guide
DIB_ToDibSection
HBITMAP DIB_ToDibSection(HANDLE hdib)
Convert the given DIB into a kind of bitmap called a DIBSection, which is a special
kind of Windows native bitmap. The returned HBITMAP (bitmap handle) can be used
with many Windows functions and controls. Many class libraries (such as .NET
Image and Delphi TBitmap) also prefer this kind of bitmap.
Note: The input DIB is freed and can no longer be accessed or used.
DIB_FromBitmap
HANDLE DIB_FromBitmap(HBITMAP hbm, HDC hdc)
Most programmers can pass 0 (NULL) for the HDC argument. The HDC (handle to
device context) should only be used if you understand GDI programming and know
that the HDC is compatible with the HBITMAP and contains useful color palette
information. If the incoming HBITMAP is a DIBSection (for example from
DIB_ToDibSection) the HDC is never needed and can always be 0.
DIB_ToImage/DibToImage
Function DIB_ToImage(ByVal hdib As System.IntPtr) As Image
Function DibToImage(ByVal hdib As System.IntPtr) As Image
Converts a DIB into a .NET Image object and returns it. Note that with this function,
the input DIB is not freed - your code must free the DIB when you are done with it.
Page 48
EZTwain Pro User Guide
Warning: VB’s Picture objects do not retain resolution (DPI) – or we have not found
the secret that makes it work. The resolution is what determines the implied
physical (printed) size of an image, so if you need this information, you will have to
somehow restore it when you convert from Picture to DIB. See p. 43 –
DIB_SetResolution. We recommend not converting Pictures back to DIBs.
Note: The Picture type is replaced in .NET by the Image class, so these functions are
not available in .NET languages - See DIB_ToImage.
The EZTwain Developer Kit contains a non-trivial sample application called VBTwerp
written for VB 5.0, which demonstrates use of these and many other EZTwain
functions.
DIB_ToPicture
Picture DIB_ToPicture(HANDLE hdib)
Reformat the given DIB into a Picture. Note: This frees the input DIB – it can no
longer be accessed or used.
DIB_FromPicture
HANDLE DIB_FromPicture(Picture pic)
Page 49
EZTwain Pro User Guide
Text Annotation
DIB_DrawText
void DIB_DrawText(HANDLE hdib, const char *pzText, int x, int y,
int w, int h)
Draw text into the specified DIB image, inside the specified rectangle. All the
coordinates are in pixels. The y-coordinate is measured down from the top, so (0,0)
is the upper-left corner of the image. A width or height of -1 means ‘as much as
needed’. When you first use this function, we recommend using w = h = –1.
The text color, typeface, character height, rotation angle and format can be set with
the functions below. The default text settings are:
Normal (plain) style
flush left, push to top
character height: 14 pixels
rotation angle: 0 degrees (horizontal)
color: black
font: Arial
Example:
DIB_SetTextColor(255, 0, 0);
DIB_SetTextFormat(EZT_TEXT_RIGHT+EZT_TEXT_BOTTOM);
DIB_DrawText(hdib, “Captured 2003.07.08 11:52”, 0, 0,-1,-1);
This will draw the annotation in the bottom-right corner of the image in bright red.
When drawing text into an image that has different DPI in X and Y, such as a digital
fax file, the text height is reinterpreted as a physical height relative to the higher DPI
value. In other words, if you set text height=25 and draw text into an image with
200 DPI horizontal and 96 DPI vertical, the text height is interpreted as 25/200 =
0.125 inches, and text is drawn correctly proportioned to be 0.125 in. high no matter
how it is oriented. In this example, horizontal text would be drawn 25 pixels high
and would print out 0.125 inches high. Text drawn sideways (angles of 90 or 270)
will be drawn in the image 0.125 * 96 = 12 pixels high, which causes it to print and
display at 12/96 = 0.125 inches high, the same as horizontal text.
DIB_SetTextHeight
void DIB_SetTextHeight(int nH)
Set the character height in pixels (image rows) for subsequent calls to
DIB_DrawText. If you need to set the text height in physical units (inches) convert
as follows:
nH = round_to_nearest_integer(HeightInInches * DIB_Yresolution(hdib))
Page 50
EZTwain Pro User Guide
DIB_SetTextColor
void DIB_SetTextColor(int R, int G, int B)
DIB_SetTextAngle
void DIB_SetTextAngle(int nDegrees)
Set the text orientation for subsequent calls to DIB_DrawText, in degrees of rotation
clockwise from horizontal. Only multiples of 90 degrees are supported. Negative
values (representing counter-clockwise rotation) are accepted.
DIB_SetTextFace
void DIB_SetTextFace(const char *pzFace)
Set the text typeface (text font) for subsequent calls to DIB_DrawText. Default is
“Arial”. The fonts that are absolutely universal on Windows (including 95 and NT):
Arial
Courier New
Lucida Console
MS Sans Serif
Times New Roman
Symbol: ΑΒΧ∆ΕΦΓ
WingDings:
A machine that has Internet Explorer installed will have additional fonts:
Arial Black
Comic Sans MS
Georgia
Impact
Trebuchet MS
Verdana
Page 51
EZTwain Pro User Guide
DIB_SetTextFormat
void DIB_SetTextFormat(int nFlags)
Sets the alignment and formatting of text for for subsequent calls to DIB_DrawText.
These format attributes can be added or OR’ed together:
SetTextFormat Flags
Named Constant Value Meaning / Effect
EZT_TEXT_NORMAL 0x0000 ‘plain’ text style, like this
EZT_TEXT_BOLD 0x0001 bold
EZT_TEXT_ITALIC 0x0002 italic
EZT_TEXT_UNDERLINE 0x0004 underlined
EZT_TEXT_STRIKEOUT 0x0008 strikeout
EZT_TEXT_BOTTOM 0x0100 Push text to bottom of rectangle
EZT_TEXT_VCENTER 0x0200 Center text vertically within rectangle
EZT_TEXT_TOP 0x0000 Float text to top of rectangle
EZT_TEXT_LEFT 0x0000 Push text to the left side of the rectangle
EZT_TEXT_CENTER 0x1000 Center text horizontally
EZT_TEXT_RIGHT 0x2000 Push text to the right side of the rectangle
EZT_TEXT_WRAP 0x4000 Break lines into multiple lines if needed
Page 52
EZTwain Pro User Guide
DIB_DrawLine
void DIB_DrawLine(HDIB hdib, // DIB to draw into
int x1, int y1, // starting point
int x2, int y2, // ending point
int R, int G, int B) // color
Draw a straight line in an image (DIB) from the starting point to the ending point,
using the nearest available match to the specified color. R, G, B are interpreted as
8-bit red/green/blue values 0..255. The coordinates are in pixels, with (0,0) being
the upper-left corner of the image. If hdib is a B&W, grayscale, or palette image, the
mathematically nearest representable color to (R,G,B) is used.
DIB_Fill
void DIB_Fill(HANDLE hdib, int R, int G, int B)
Fill all the pixels of the DIB with the specified color. R, G, B are interpreted as 8-bit
red/green/blue values 0..255. If hdib is a B&W, grayscale, or palette image, the
mathematically nearest representable color to (R,G,B) is used.
DIB_Negate
void DIB_Negate(HANDLE hdib)
Negates all the pixels in the DIB. Note that the color table if any is left untouched –
this call will not have the desired effect on an indexed-color image.
DIB_AdjustBC
void DIB_AdjustBC(HDIB hdib, int nB, int nC)
DIB_FlipVertical
void DIB_FlipVertical(HANDLE hdib)
DIB_FlipHorizontal
void DIB_FlipHorizontal(HANDLE hdib)
Page 53
EZTwain Pro User Guide
DIB_Rotate180
void DIB_Rotate180(HANDLE hdib)
DIB_Rotate90
HANDLE DIB_Rotate90(HANDLE hOld, int nSteps)
Return a copy of hOld rotated clockwise nSteps * 90°. If nSteps is 0, the result is a
copy of hOld. Negative values of nSteps rotate counterclockwise. Note that hOld is
not destroyed so you need to DIB_Free it if you are done with it.
Page 54
EZTwain Pro User Guide
DIB_ScaledCopy
HANDLE DIB_ScaledCopy(HANDLE hOld, int w, int h)
Create and return a copy of hOld scaled (resampled) to have width w and height h.
This only works on 24-bit color and 8-bit grayscale images, other input will cause the
function to fail and return NULL. Don't forget to DIB_Free the old DIB when you are
done with it. This operation is sometimes called resampling because you have the
same image, but with a different number of samples of its color values.
DIB_Resample
HDIB DIB_Resample(HDIB hOld, double xdpi, double ydpi)
Return a new image that is a copy of the old image, but resampled to the specified
resolution. Resampling is the technical term for recomputing the pixels of an image,
when you want to change the number of pixels in the image but not the physical size
(like 8.5" x 11").
If you resample from 300DPI to 100DPI, you will have 1/3 as many rows, 1/3 as
many columns, 1/9 as many pixels - but the pixels will be marked in the image as
being 3 times as 'wide' and 'tall' - so the physical size of the image stays the same.
This is the same as DIB_ScaledCopy (above), just looked at in a different way.
DIB_Resample will fail if the input image has either resolution <= 0, or if xdpi or
ydpi is <= 0. It can also fail from insufficient memory.
Remember to DIB_Free the old DIB when you are done with it.
DIB_Thumbnail
HANDLE DIB_Thumbnail(HANDLE hdib, int MaxWidth, int MaxHeight)
Return an image (Dib) containing a copy of hdib, scaled so that its width is no more
than MaxWidth, and height is no more than MaxHeight. Can accept any image
produced by EZTwain. B&W images are converted to grayscale thumbnails.
Remember to DIB_Free the original image and the thumbnail, when you are done
using them.
DIB_SimpleThreshold
HDIB DIB_SimpleThreshold(HDIB hdib, int nT)
Returns a B&W copy of the given image using the given threshold. The gray value
(0..255) of each input pixel is calculated: If the value < nT that pixel is black (0) in
the returned image, if the value >= nT the pixel becomes white in the returned
image. Remember to DIB_Free each image when you are done using it.
DIB_SmartThreshold
HDIB DIB_SmartThreshold(HDIB hdib)
Page 55
EZTwain Pro User Guide
Returns a B&W copy of the given image, using a ‘smart’ thresholding algorithm. This
function examines the entire image and chooses a threshold value that is ‘optimal’ in
some sense, for text and line-art. Remember to DIB_Free each image when you are
done using it.
DIB_ConvertToPixelType
HANDLE DIB_ConvertToPixelType(HANDLE hdib, int nPT)
Takes a DIB handle and a pixel-type code (see Pixel Types, p 2) and returns a copy
of the input DIB, converted into the specified pixel type. The input DIB is not
affected, and must be freed with DIB_Free when no longer needed.
This function can be used to expand B&W images into grayscale, to convert between
RGB and CMY or CMYK formats, to convert color scans to grayscale, grayscale to
B&W, and so forth.
When converting to B&W, the image is thresholded using a ‘smart threshold’ - see
DIB_SmartThreshold above. When converting a color image to TWPT_PALETTE, an
optimized color table is computed, and the image is rendered into that set of colors
with a ‘random dither’ technically known as error diffusion.
DIB_ConvertToFormat
HANDLE DIB_ConvertToFormat(HDIB hOld, int nPT, int nBPP)
Create and return a new DIB containing the hOld image converted to the specified
pixel type and bits per pixel. Similar DIB_ConvertToPixelType but allows for non-
standard depth in the output, such as 4-bit/pixel grayscale, or 16-bit/sample RGB.
Unsupported and impossible combinations cause a NULL return.
DIB_ScaleToGray
HANDLE DIB_ScaleToGray(HDIB hdibOld, int r)
Create and return a new grayscale DIB by averaging each r x r pixel square of
hdibOld to create each output pixel. The output image has 1/r times the width and
height, and resolution, of the input image. Works well to convert B&W images to
lower-resolution grayscale images, which are not as ‘crisp’ but are smoother, look
better when scaled, and can be JPEG-compressed.
Page 56
EZTwain Pro User Guide
DIB_RegionCopy
HANDLE DIB_RegionCopy(HANDLE hOld, int x, int y, int w, int h,
int fill)
Create and return a new DIB that is a copy of a rectangular region of hOld. The
copied region is w pixels wide, h pixels high, starting at (x, y) in the hOld image,
where (0,0) is the upper-left corner of hOld, visually. Pixels that don't fit into the
new DIB are discarded. If the new DIB is taller or wider than the old, the new pixels
on the right and bottom are filled with bytes = fill. Common values for fill are:
-1 (or 255 or 0xFF) fills with 1's producing white
0 which produces black fill.
This function is useful for cropping or extending an image.
DIB_Blt
void DIB_Blt(
HANDLE hdibDst, // DIB destination
int dx, int dy, // destination (x,y)
HANDLE hdibSrc, // DIB source
int sx, int sy, // where to start in source
int w, int h, // width and height
unsigned uRop) // operation to apply
Copy pixels from hdibSrc into hdibDst, starting at (dx,dy) in the destination, and
(sx,sy) in the source, and transferring a rectangular region w columns by h rows.
Any pixels that fall outside the actual bounds of the source and destination DIBs are
ignored. Put another way, the coordinates and sizes are clipped to boundaries of the
actual DIBs. The operations available are:
EZT_ROP_COPY 0
EZT_ROP_OR 1
EZT_ROP_AND 2
EZT_ROP_XOR 3
DIB_BltMask
void DIB_BltMask(
HANDLE hdibDst, // DIB destination
int dx, int dy, // destination (x,y)
HANDLE hdibSrc, // DIB source
int sx, int sy, // where to start in source
int w, int h, // width and height
unsigned uRop, // operation to apply (see note below)
HANDLE hdibMask) // the ‘mask’
Like DIB_Blt, but hdibMask contains an 8-bit mask. hdibMask must be the same size
as hdibSrc, and must be 8-bits per pixel. For each pixel of the affected region, if D is
the destination pixel, S is the source, and M is the mask:
D = (M / 255) * S + (1 – M / 255) * D
Page 57
EZTwain Pro User Guide
So a mask value of 255 (usually white) causes the source pixel to replace the old
destination value, a mask value of 0 leaves the destination value unchanged, and in
between the source and destination are blended according to the mask value.
DIB_PaintMask
void DIB_PaintMask(
HANDLE hdibDst, // DIB destination
int dx, int dy, // starting destination (x,y)
int R, int G, int B, // color to paint with
int sx, int sy, // starting mask (x,y)
int w, int h, // width and height
unsigned uRop, // operation to apply (see note below)
HANDLE hdibMask) // the ‘mask’
Like DIB_BltMask, but applies a solid color. hdibMask must be 8-bits deep. For each
pixel of the affected region, if D is the destination pixel value, P is the paint color,
and M is the mask:
D = (M / 255) * P + (1 – M / 255) * D
A destination pixel D is only affected if it exists in hdibDst, falls within the rectangle
specified by (dx, dy, w, h), and if the corresponding mask pixel exists in hdibMask.
A width value (w) of –1 is interpreted as ‘as wide as possible’, similarly for height
(h). If you paint into a grayscale DIB, the paint color is converted to a gray value if
necessary. If you paint into a B&W DIB, the paint color is converted to gray, then to
whichever is closest: black, or white.
Page 58
EZTwain Pro User Guide
DIB_OpenInDC
int DIB_OpenInDC(HANDLE hdib, HDC hdc)
Create a temporary copy of the DIB and select it into the specified DC (Device
Context). Allows use of any Win32 GDI function to draw through the DC into the
image. The drawing actually takes place in a temporary bitmap called a DIBSection,
the result are only copied back into your hdib when you call DIB_CloseInDC – see
below.
Only one DIB can be open this way at a time: You cannot nest DIB_OpenInDC.
A second call to DIB_OpenInDC without an intervening DIB_CloseInDC will display an
error message and return –4.
Return values:
0 Success
-1 Could not lock the hdib – probably not a valid handle
-2 CreateDIBSection failed: hdc is invalid, hdib is not a DIB handle, or insufficient
memory.
-3 Unable to select the DIBSection into the hdc (Unknown cause)
-4 Nested call – two calls to OpenInDC without a call to CloseInDC.
DIB_CloseInDC
void DIB_CloseInDC(HANDLE hdib, HDC hdc)
Call this function exactly once for each call to DIB_OpenInDC. It has no effect at any
other time. Copies the image from the DC back into the DIB and detaches it from
the DC. Example:
Page 59
EZTwain Pro User Guide
DIB_AutoCrop
HANDLE DIB_AutoCrop(HDIB hOld, int nOptions)
Return a copy of the image in hOld, with the surrounding border of uniform color (if
there is one) cropped off. Of course this will normally change the dimensions of the
image - the pixel type and depth are not changed.
After this call, remember to DIB_Free(hOld) if you don't need it.
nOptions is currently unused and must be 0 (zero).
DIB_GetCropRect
BOOL DIB_GetCropRect(HDIB hdib, int nOptions,
int *x, int *y, int *w, int *h)
Returns a suggested crop rectangle to remove blank or unused border from the
image. The returned rectangle is defined by an upper-left point and a width and
height, in pixels. (Precisely the arguments needed by DIB_RegionCopy.) As usual, y
and h are measured down from the top of the image.
A return of FALSE means no crop rectangle was found - generally this means that the
image has content that extends to the edges, or has no definite borders of dark
color. For convenience, when this function returns FALSE it sets x, y, w and h to
specify the entire image.
DIB_AutoDeskew
HANDLE DIB_AutoDeskew(HANDLE hOld, int nOptions)
DIB_DeskewAngle
double DIB_DeskewAngle(HANDLE hdib)
Compute and return the small clockwise rotation that would best deskew (vertically
align) the given image. The returned angle is in radians, which may be negative or
positive. Only rotations in the range ±4° are considered. A value < -9.0 means that
Page 60
EZTwain Pro User Guide
an optimal rotation could not be determined. A deskew angle in the range ±0.001
can probably be ignored - the image is already nearly perfectly upright.
DIB_AutoContrast
int DIB_AutoContrast(HANDLE hdib)
Automatically adjust the brightness and contrast of an image to ‘improve’ it. For
bimodal images, where the original material appears to be ‘perceptually black and
white’, this function will adjust the brightness and contrast to make the dominant
light color into white, and the primary dark tone into black. For other images, this
function evaluates whether the images is using the available tonal range, and if not
attempts to adjust brightness and contrast to expand the image’s tonal range.
DIB_AutoContrast has no effect on B&W images.
DIB_MedianFilter
void DIB_MedianFilter(HDIB hdib, int W, int H, int nStyle)
The median filter is effective at removing speckle noise from color and grayscale
images, because it smooths out pixels that differ radically in value from their
neighbors.
Page 61
EZTwain Pro User Guide
Image Analysis
DIB_IsBlank
BOOL DIB_IsBlank(HDIB hdib, double dDarkness)
Return TRUE(1) if the DIB has less than dDarkness fraction of 'dark' pixels, FALSE(0)
otherwise. A typical value of dDarkness would be 0.02 which means 2% dark pixels.
A page with less than 2% dark pixels is probably blank.
See How To: Skip Blank Pages, p 17.
DIB_Darkness
double DIB_Darkness(HDIB hdibFull)
Returns the fraction of an image that consists of 'dark' pixels i.e. pixels that would be
black if the image was converted to B&W using a smart thresholding. (See
DIB_SmartThreshold p. 55 for more details.) A return of 0.0 means none, 1.0 means
all. A typical office document is 0.02 (2%) to 0.32 (32%) dark pixels. This function
is used by DIB_IsBlank to decide if an image is blank.
DIB_GetHistogram
void DIB_GetHistogram(HANDLE hdib, int nComp, int nHisto[256])
This function computes a histogram of the given DIB. The third parameter must be
an array of 256 32-bit integers – it need not be initialized, it is output-only. When
DIB_GetHistogram returns, each entry nHisto[v] contains the number of pixels in
hdib that have a value of v in the specified component. This function works on B&W,
grayscale, RGB, and Palette images.
Component/Channel Codes
Symbol C Description
COMPONENT_GRAY 0 Grayscale equivalent or lightness
COMPONENT_RED 1 Red component / red channel
COMPONENT_GREEN 2 Green component
COMPONENT_BLUE 3 Blue component
COMPONENT_SAT 4 Saturation (as in HSB color model)
COMPONENT_HUE 5 Hue (as in HSB/HSV/HSL color models)
COMPONENT_LUMINANCE 0 synonym for COMPONENT_GRAY
DIB_Avg/DIB_AvgRegion/DIB_AvgRow/DIB_AvgColumn
double DIB_Avg(HDIB hdib, int nComp)
double DIB_AvgRegion(HDIB hdib,int nComp,int x,y,w,h)
double DIB_AvgRow(HDIB hdib, int nComp, int y)
double DIB_AvgColumn(HDIB hdib, int nComp, int x)
Average the values of pixels in an image, region, row or column, and return the
resulting value between 0 and 255.
Note that row 0 (y=0) is the visually top-most row of an image.
Page 62
EZTwain Pro User Guide
DIB_ComponentCopy
HDIB DIB_ComponentCopy(HDIB hdib, int nComponent)
Extract and return an image containing one component (channel) of the input image.
See component codes under DIB_Histogram.
The returned image is an 8-bit grayscale image containing the specified channel of
the input image, with the same width, height, and DPI as the input image.
Caution: Future versions may return a 16-bit deep image if given a 16 bit/channel
input image.
Page 63
EZTwain Pro User Guide
Miscellaneous
DIB_IsCompressed
BOOL DIB_IsCompressed(HANDLE hdib)
DIB_Compression
int DIB_Compression(HANDLE hdib)
DIB_SetColorCount
void DIB_SetColorCount(HANDLE hdib, int n)
DIB_SwapRedBlue
void DIB_SwapRedBlue(HANDLE hdib)
DIB_CreatePalette
HPALETTE DIB_CreatePalette (HANDLE hdib)
Create and return a logical palette to be used for drawing the DIB.
For 1, 4, and 8-bit DIBs the palette contains the DIB color table.
For 24-bit DIBs, a default halftone palette is returned.
DIB_Lock
BITMAPINFOHEADER* DIB_Lock(HANDLE hdib)
Lock the given DIB handle and return a pointer to the header structure. Technically,
increments the lock count of hdib and returns its address.
DIB_Unlock
void DIB_Unlock(HANDLE hdib)
Page 64
EZTwain Pro User Guide
Functions – Clipboard
DIB_PutOnClipboard
int DIB_PutOnClipboard(HANDLE hdib)
DIB_CanGetFromClipboard
BOOL DIB_CanGetFromClipboard(void)
Return 1 if there is something on the clipboard that can be delivered as a DIB (by
DIB_GetFromClipboard below.) Returns 0 if not. If you are implementing ‘paste’,
call this function to enable and disable the Paste command.
DIB_GetFromClipboard
DIB_FromClipboard
HANDLE DIB_GetFromClipboard(void)
HANDLE DIB_FromClipboard(void)
Page 65
EZTwain Pro User Guide
Printing
Configuration
DIB_SpecifyPrinter
int DIB_SpecifyPrinter(string pzPrinterName)
DIB_EnumeratePrinters
int DIB_EnumeratePrinters()
Enumerate the available printers and return the count of printers found. A return
value < 0 indicates some serious internal error. After this call, use DIB_PrinterName
or DIB_GetPrinterName (below) to get the names of the available printers. This call
can take several seconds - possibly more on some versions of Windows, depending
on whether there are remote printers in the list.
DIB_PrinterName / DIB_GetPrinterName
char* DIB_PrinterName(int i)
int DIB_GetPrinterName(int i, LPSTR PrinterName)
Get the name of the ith available printer. DIB_PrinterName returns the name as a
string. DIB_GetPrinterName copies it into the specified character array (string
buffer). In most languages, you will need to allocate and/or initialize the string
variable to be 256 characters.
DIB_SetPrintToFit / DIB_GetPrintToFit
void DIB_SetPrintToFit(int nYes)
int DIB_GetPrintToFit()
Page 66
EZTwain Pro User Guide
Single-Page Printing
DIB_Print
int DIB_Print(HANDLE hdib, string pzJobname)
Display the standard Print dialog, and if OK’d by user, print the DIB on the user-
selected printer. By default, prints the DIB at 'physical size' - the DIB resolution
values are used to convert the width and height from pixels to physical units (e.g.
inches.) If the DIB has resolution values of 0, 72 DPI is assumed. However, if the
print-to-fit flag is set (see DIB_SetPrintToFit above) any image too large to print on
the printer page is scaled smaller until it fits. The image is always printed centered
on the page.
The 2nd parameter is a string that appears in the print queue; If it is NULL or the
empty string, the application title is used (See TWAIN_SetAppTitle.)
DIB_PrintNoPrompt
int DIB_PrintNoPrompt(HANDLE hdib, string pzJobname)
Like DIB_Print, but does not prompt the user. The image is printed on the default
printer with default print settings.
Page 67
EZTwain Pro User Guide
If you don't have your images in a file, you can print multipage documents from
memory using these functions. DIB_PrintArray prints an array of images as a single
print job. Or you can compose a print job yourself: Call DIB_PrintJobBegin to start
the job, call DIB_PrintPage with each page image and call DIB_PrintJobEnd when
done. Try to always call DIB_PrintJobEnd, even in event of an error: Otherwise
various things are left in an undesirable state.
DIB_PrintArray
int DIB_PrintArray(HDIB hdibs[], int nCount,
string Jobname, BOOL bNoPrompt)
Prints the first nCount images in the hdibs array, under the given print-job name.
If the job-name parameter is NULL or the empty string, the application title is used.
If bNoPrompt is TRUE(non-zero), the print job is sent directly to the default printer.
If bNoPrompt is FALSE(0), the user is prompted with the standard print dialog.
Return value is same as DIB_Print (above).
DIB_PrintJobBegin
int DIB_PrintJobBegin(string pzJobname, BOOL bUseDefaultPrinter)
Begins a multipage print job. Jobname is the name of the print job: This appears in
the print queue , and in some environments it is printed on a job-separator page
ahead of the job. If Jobname is null or empty, the application title is used. (See
TWAIN_SetAppTitle)
DIB_PrintPage
int DIB_PrintPage(HDIB hdib)
Print a page as part of the current job. See DIB_Print for more details.
Return values:
0 success
-3 the DIB is null or invalid
-4 printing output error
-5 no print job is open
DIB_PrintJobEnd
int DIB_PrintJobEnd(void)
End the current print job and release it for printing.
(Some environments will start printing as soon as the first page is available.)
Page 68
EZTwain Pro User Guide
Return values:
0 success
-4 printing output error
-5 no print job is open
Page 69
EZTwain Pro User Guide
Introduction
EZTwain barcode recognition is based on a multi-engine architecture with a specific
set of supported engines in each release. You can enumerate the supported or
available engines, select an engine, and use that engine to search scanned or loaded
images for barcodes.
A symbology is a style of barcode, such as Code 128, defined by a set of rules for bar
widths, heights, clearance, character encoding, and error detection/correction.
A symbol is what the rest of the world calls 'a barcode'. This can be confusing – in
barcode talk, a symbol is an entire barcode. Also called a patch, although that tends
to be used more for 2D barcodes.
The general paradigm for analyzing barcodes in a scanned or loaded image is this:
If you would like to learn more about the theory and practice of barcoding, we
recommend The Bar Code Book by Roger C. Palmer (available through Amazon.com).
There are also some helpful links on our website, at
http://www.dosadi.com/barcode.htm
BARCODE_IsAvailable
BOOL BARCODE_IsAvailable(void)
Page 70
EZTwain Pro User Guide
The barcode manager and Dosadi built-in engine are implemented in the helper
library EZSymbl.dll. EZSymbol.dll must be installed next to Eztwain3.dll – i.e. In the
same folder. Additional barcode engine DLLs, if any, must be placed where
LoadLibrary can find them: Next to the Eztwain3.dll, in the System or System32
folders, or somewhere on the PATH.
BARCODE_IsEngineAvailable
BARCODE_SelectEngine
BARCODE_SelectedEngine
BARCODE_EngineName
BOOL BARCODE_IsEngineAvailable(int nEngine)
BOOL BARCODE_SelectEngine(int nEngine)
int BARCODE_SelectedEngine(void)
string BARCODE_EngineName(int nEngine)
These four functions allow you to detect which engines are available, to select the
engine to use for recognition, and to get human-readable engine names.
Note: 'engine 0' is the null engine – it does nothing and recognizes no barcode types.
As of EZTwain Pro version 3.10, four barcode engines (recognition modules) are
supported. Contact Dosadi support (support@dosadi.com) if you are interested in
using another barcode engine.
A very limited built-in barcode engine which recognizes only horizontal and vertical ‘3
of 9 code’. This engine is selected by default.
For more advanced barcode recognition, EZTwain can detect and use the following
third party barcode engines, which must be licensed from their respective vendors:
Page 71
EZTwain Pro User Guide
This product is no longer available from Axtel. However, if you have a copy of
AXBAR32.DLL, EZTwain Pro can use it. Select EZBAR_ENGINE_AXTEL.
http://www.leadtools.com/SDK/Document/Document-Addon-Barcodelinear1D.htm
We have the impression that the LeadTools engine is the fastest and one of the most
accurate, and it seems to handle slanted or skewed barcodes extremely well. In
keeping with its superior performance, the licensing is relatively expensive and
restrictive: You must license the LeadTools Raster Imaging SDK as well as the Linear
1D Barcode SDK, and purchase a barcode run-time license for each machine that will
use barcode recognition. Check the website above for the latest information.
The following files are required when using LeadTools barcode recognition:
Ltkrn15u.dll
Ltbar15u.dll
Ltdis15u.dll
Ltimgcor15u.dll
Ltimgutl15u.dll
Ltbar415u.dll
In addition:
Note: All Unicode versions of LEADTOOLS require Microsoft Unicode Layer for Windows
(UNICOWS.DLL) in order to function on Windows 95/98/Me. You can obtain MSUL
from: http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/dnanchor/html/anch_mslu.asp.
Note: LEADTOOLS Requires the following Microsoft C/C++ Runtime files to be distributed in
the application's PATH:
Win32 Platforms: x64 Platforms:
msvcr80.dll msvcr80.dll
msvcp80.dll msvcp80.dll
Microsoft.VC80.CRT.manifest Microsoft.VC80.CRT.manifest
mfc80u.dll mfc80u.dll
Microsoft.VC80.MFC.manifest Microsoft.VC80.MFC.manifest
MFC80ENU.dll MFC80ENU.dll
Microsoft.VC80.MFCLOC.manifest Microsoft.VC80.MFCLOC.manifest
NOTE: that the filenames are the same for Win32 and x64. However, the actual
binares are different. For more information about distributing the Microsoft C/C++
runtime files, refer to:
http://msdn2.microsoft.com/en-us/library/ms235291.aspx
Page 72
EZTwain Pro User Guide
See http://www.blackice.com/barcodeLinear1D.htm
The Black Ice engine can be licensed with a one-time license fee, and seems fast
when dealing with horizontal and vertical symbols (less than 6° of skew). However
we experienced much slower scanning when searching for diagonal barcodes. Some
customers have reported that they found the Black Ice engine a bit more accurate
than the LeadTools and Axtel engines.
EZTwain looks for and loads “BiBrw1D.dll” - check the Black Ice SDK for information
about other DLLs required by BiBrw1D.dll.
BARCODE_ReadableCodes
int BARCODE_ReadableCodes(void)
BARCODE_TypeName
String BARCODE_TypeName(int nType)
Page 73
EZTwain Pro User Guide
BARCODE_SetDirectionFlags
BARCODE_GetDirectionFlags
BARCODE_AvailableDirectionFlags
BOOL BARCODE_SetDirectionFlags(int nDirFlags)
int BARCODE_GetDirectionFlags(void)
int BARCODE_AvailableDirectionFlags(void)
Define the directions the engine will scan for barcodes. The default is left-to-right.
Scanning for barcodes in multiple directions will slow the recognition process.
BARCODE_SetDirectionFlags will return TRUE if completely successful, FALSE if any
requested direction is invalid or not supported. As a special case, setting the
direction flags to -1 is interpreted as “select all supported directions.”
Note that as of EZTwain Pro 3.10, the Dosadi barcode engine does not support
recognition of diagonal (highly skewed) symbols.
BARCODE_SetZone
BARCODE_NoZone
void BARCODE_SetZone(int x, int y, int w, int h)
void BARCODE_NoZone()
Page 74
EZTwain Pro User Guide
BARCODE_Recognize
int BARCODE_Recognize(HDIB hdib, int nMaxCount, int nType)
Not surprisingly, recognition slows down as you allow more barcodes to be found,
and as you allow more symbologies to be recognized.
BARCODE_Type
int BARCODE_Type(int n)
Return the type of the nth barcode found by the last call to BARCODE_Recognize.
The returned code will be one of those listed above under Barcode Types.
BARCODE_Text
string BARCODE_Text(int n)
Return the text of the nth barcode found by the last call to BARCODE_Recognize.
Barcodes found by BARCODE_Recognize are numbered from 0. If there is any
problem of any kind, this function returns the empty string. In some programming
languages this function is not available and you must use BARCODE_GetText
(below).
BARCODE_GetText
BOOL BARCODE_GetText(int n, LPSTR Text)
Get the text of the nth barcode found by the last BARCODE_Recognize.
Please allow 64 characters in your text buffer. Use a smaller buffer only if you know
that the barcode type is limited to shorter strings.
BARCODE_GetRect
BOOL BARCODE_GetRect(int n, double *L, double *T, double *R,
double *B)
Get the rectangle around the nth barcode found by the last BARCODE_Recognize,
returning the top-left and bottom-right coordinates, in pixels, in the four parameters.
(0,0) is the visual top left corner of the image. Returns TRUE(1) if successful,
FALSE(0) otherwise. The only likely cause of a FALSE return would be an invalid
value of n, or if you are in C or C++, a null pointer parameter.
Page 75
EZTwain Pro User Guide
Page 76
EZTwain Pro User Guide
Introduction
Optical Character Recognition (OCR) is the industry term for the reading of text in an
image by machine. You will also sometimes see it called Intelligent Character
Recognition (ICR). This is highly relevant to scanning because so much of what we
scan contains text. Extracting the text on a scanned page can be useful for indexing
documents, for searching them, and for automatic routing and processing.
EZTwain Pro currently supports only one OCR engine, the TOCR engine by Transym
Computer Services Ltd (www.transym.com) This engine is not provided by Dosadi –
it must be separately licensed and installed. The TOCR engine was chosen because it
was the engine most recommended by our customers for its speed and accuracy at
plain text recognition. It outputs plain text – no font, font-size, style or other
formatting information is provided.
Although this release of EZTwain Pro only supports one engine, we expect to support
additional engines in the future. Please code defensively: Engine codes are constants
and will never change, but the default OCR engine may change from release to
release. At start-up, EZTwain Pro will select the available engine that we think will
give the most satisfactory results for the greatest number of new customers. Keep in
mind that in the future this may not be the Transym engine, or it could be a
substantially different version of the Transym engine.
OCR_IsAvailable
BOOL OCR_IsAvailable()
This function returns True (1) if any OCR services are available. This does not mean
that any particular engine is available: Always check for the particular engine you
prefer using OCR_IsEngineAvailable.
OCR_Version
int OCR_Version()
Page 77
EZTwain Pro User Guide
Returns the version number of the EZTwain Pro OCR subsystem, as the usual m.nn
fraction multiplied by 100. So a version 1.25 OCR subsystem will return 125. Note
that this is the version of our OCR subsystem, not the version of an OCR engine.
OCR_IsEngineAvailable
OCR_SelectEngine
OCR_SelectDefaultEngine
OCR_SelectedEngine
OCR_EngineName
These functions allow you to test for availability of a specific OCR engine, to select an
engine, to see what the currently selected engine is, and to retrieve the human-
readable name of any supported engine.
Using OCR_EngineName, you can enumerate the supported OCR engines, to populate
a listbox for example. Just call OCR_EngineName(i) with i = 0, 1, ... until it returns
an empty string.
OCR_SetEngineKey
void OCR_SetEngineKey(string key)
For example, Transym Computer offers a reseller version of their TOCR engine. When
you license this product, you receive a special version of TOCR, and a 16-digit
registration number. Once the reseller version of TOCR is installed on a computer,
you can use it through EZTwain by passing in the registration number with a call like
this:
OCR_SetEngineKey(“0123-4567-89AB-CDEF”)
OCR_SetLineBreak
OCR_SetLineBreak(string sEOL)
Set the character sequence to use for line breaks in OCR'd text (as returned by
OCR_Text and OCR_GetText).
Page 78
EZTwain Pro User Guide
OCR_RecognizeDib
int OCR_RecognizeDib(HDIB hdib)
Recognize text in the specified image, using the currently selected engine. The
recognized text can be retrieved with OCR_Text or OCR_GetText, and the position
information with OCR_GetCharPositions and OCR_GetCharSizes.
Return codes:
0 no error, but no text found.
n>0 n characters of text are available – including spaces and newlines.
-1 OCR services or selected engine not available.
-3 the image handle is null or invalid.
-5 there was an internal error or the OCR engine returned an error.
OCR_RecognizeDibZone
int OCR_RecognizeDibZone(HDIB hdib, int x, int y, int w, int h)
Recognize text in the specified rectangle (zone) of the specified image, using the
currently selected engine. Otherwise identical to OCR_RecognizeDib.
Be sure you understand the parameters: (x,y,w,h) specify a rectangle w pixels wide,
h pixels high, starting y pixels down from the top of the image and x pixels in from
the left edge.
OCR_Text
string OCR_Text()
Returns the text recognized by the last call to OCR_RecognizeDib. If there is any
problem, returns the empty string.
OCR_GetText
BOOL OCR_GetText(char *buffer, int buflen)
Page 79
EZTwain Pro User Guide
OCR_TextLength
int OCR_TextLength()
Returns the number of characters in the stored OCR text. Does not include the
terminating NUL, for those of you working in languages that care about that.
OCR_TextOrientation
Int OCR_TextOrientation()
Example: If the original was turned 90 degrees clockwise before scanning, it will be
auto-rotated 90 degrees *counter-clockwise* before OCR, so in that case the value
of this function will be 270.
OCR_GetCharPositions
OCR_GetCharSizes
BOOL OCR_GetCharPositions(long x[], long y[])
BOOL OCR_GetCharSizes(long w[], long h[])
Retrieve the positions and sizes, respectively, of the characters recognized by the
last call to OCR_RecognizeDib. Positions are in pixels relative to the top left corner
of the processed image. Sizes are in pixels.
It is the caller's responsibility to ensure that x, y, w, and h are arrays of long (32-bit)
integers, allocated large enough to hold N entries, where N is the character count
returned by OCR_TextLength or the last call to OCR_RecognizeDib. Sorry we don't
have example code yet.
OCR_ClearText
void OCR_ClearText()
Clear the text and other information stored by the last OCR recognition. After this
call, OCR_TextLength will return 0, and OCR_Text and OCR_GetText will return the
empty string.
OCR_WritePage
BOOL OCR_WritePage(HDIB hdib)
Recognize the text in the specified image, then write the image plus the (hidden)
text to the currently open PDF output file. An available OCR engine must be
selected. There must be a PDF file currently open for output, opened with
TWAIN_BeginMultipageFile.
Page 80
EZTwain Pro User Guide
OCR_WriteTextToPDF
BOOL OCR_WriteTextToPDF()
Write the text from the last OCR to the next PDF page. The output text is retained
until a page is written to a PDF file, then it is placed (invisibly) on that page.
Page 81
EZTwain Pro User Guide
Gray(8) EZTwain can read and write this format, but some
other programs may interpret a BMP of this format
as a palette-color image with 256 colors (which all
happen to be shades of gray...)
Page 82
EZTwain Pro User Guide
CMY(48)
Page 83
EZTwain Pro User Guide
If the specified filename ends in .BMP, .JPG, .JPEG, .TIF, .TIFF, .PNG, .GIF, .DCX
or .PDF, then the file is saved in the corresponding format. Otherwise the current
Save Format is used. The Save Format is set by TWAIN_SetSaveFormat and is
initially BMP.
The EZTwain main module (Eztwain3.dll) by itself can only read and write the BMP
file format. To write the other file formats, the optional EZ* DLLs must be properly
installed - See EZTwain Components, page 2.
Important: If you use either EZTiff.dll or EZPdf.dll, you must also install
EZJpeg.dll (whether or not you actually use JPEG compression.)
Page 84
EZTwain Pro User Guide
TWAIN_SetFileAppendFlag/TWAIN_GetFileAppendFlag
void TWAIN_SetFileAppendFlag(int nAppend)
int TWAIN_GetFileAppendFlag(void)
These functions set and query the File Append Flag. This flag controls what EZTwain
does in the event of writing to a TIFF or DCX file which already exists. If the File
Append Flag is non-zero and the program attempts to write to an existing TIFF or
DCX file, EZTwain appends images to the existing file. Otherwise if the File Append
Flag is 0 (the default case), writing a TIFF, DCX (or any other) file overwrites any
previous contents of that file. Note: If there is no existing file, this flag is ignored.
TWAIN_SetJpegQuality / TWAIN_GetJpegQuality
void TWAIN_SetJpegQuality(int nQ)
int TWAIN_GetJpegQuality(void)
You cannot directly control the size of JPEG files – lower quality means smaller files,
higher quality means larger, but the relationship is non-linear and depends on the
content of the image being compressed.
Even at quality 100 JPEG is still a lossy compression - there will still be degradation
of the image, although it is very unlikely to be detectable by the human eye.
Nonetheless there are subtle mathematical changes in the image, and repeated
compression and recompression even at quality level 100 can lead to cumulative
(visible) image degradation.
PDF: By default, PDF uses JPEG compression for grayscale and RGB or CMYK color
images. See PDF_SetCompression for more information.
TIFF: Subject to some warnings about compatibility, TIFF files can be written with
JPEG compression (See TWAIN_SetTiffCompression.
Page 85
EZTwain Pro User Guide
DIB_WriteToFilename/TWAIN_WriteToFilename
int DIB_WriteToFilename(HANDLE hdib, string pszFile)
int TWAIN_WriteToFilename(HANDLE hdib, string pszFile)
Writes an image to a file. If the file string ends with a recognized extension (BMP,
JPG, JPEG, TIF, TIFF, PNG, GIF, DCX or PDF), then the file is written in the implied
format. Otherwise, the file is written using the current save format: See
TWAIN_SetSaveFormat. Normally if the output file exists it is overwritten, but TIFF,
PDF and DCX files can be appended to: See TWAIN_SetFileAppendFlag.
If pszFile is NULL or points to a null string, the user is prompted for the filename and
format with a standard Windows File Save dialog. The Save dialog will only offer
formats that are available and valid for the given image.
Return values:
0 success
-1 user cancelled File Save dialog
-2 file open error (invalid path or name, or access denied)
-3 image is invalid, or cannot be written in this format.
-4 writing data failed, possibly output device is full
DIB_WriteArrayToFilename
int DIB_WriteArrayToFilename(HDIB ahdib[], int n, string File)
Return values:
0 success
-1 user cancelled File Save dialog
-2 file open error (invalid path or name, or access denied)
-3 a) image is invalid (null or invalid DIB handle)
b) support for the save format is not available (missing DLL?)
c) DIB format incompatible with save format e.g. B&W to JPEG.
-4 writing data failed, possibly output device is full
-5 other unspecified internal error
-6 a multipage file is already open
-7 multipage support is not installed.
Page 86
EZTwain Pro User Guide
TWAIN_BeginMultipageFile
int TWAIN_BeginMultipageFile(string pszFile)
If the filename ends with .TIF, .TIFF, or .MPT, a TIFF file is started. If it ends with
.DCX a DCX file is started. If it ends with .PDF a PDF file is started. Otherwise the
file uses the current default multipage file format (see p 34), and if no extension is
present, an appropriate extension for the format is added.
If the file already exists (and is writable) its content is deleted if the File Append Flag
is 0, or it is appended to if the File Append Flag is non-zero. See
TWAIN_SetFileAppendFlag.
Return values:
0 success.
-1 user was prompted for file and cancelled the File Save dialog.
-2 file open error (invalid path or name, or access denied)
-3 the required EZTiff.dll, EZDcx.dll or EZPdf.dll failed to load.
-5 unexpected internal error
-6 multipage file already open.
TWAIN_DibWritePage
int TWAIN_DibWritePage(HANDLE hdib)
Append a page (image) to the currently open multipage file. This call will fail unless
it follows a successful call to TWAIN_BeginMultipageFile.
Return values:
0 success.
-3 the required library (EZTiff.dll, EZDcx.dll, EZPdf.dll) failed to load or
invalid DIB or DIB handle, or
image format not supported (e.g. 16-bit/pixel to PDF)
-4 Write error: Output device is full?
-5 unexpected internal error.
-6 multipage file not open.
TWAIN_EndMultipageFile
int TWAIN_EndMultipageFile(void)
Return values:
0 success.
-3 the required EZTiff.dll, EZDcx.dll or EZPdf.dll failed to load.
-4 Write error: Output device is full?
-5 some internal error
-6 multipage file not open
TWAIN_IsMultipageFileOpen
BOOL TWAIN_IsMultipageFileOpen()
Page 87
EZTwain Pro User Guide
TWAIN_MultipageCount
TWAIN_MultipageCount() => int
Return the number of images written to the most recently started multipage file. In
other words, this returns a counter that is reset by BeginMultipageFile, and is
incremented by DibWritePage. Can also be used during or after
TWAIN_AcquireMultipageFile.
If you might be appending to a file and want to know the total page count of the file,
see DIB_GetFilePageCount/TWAIN_PagesInFile 90.
TWAIN_SetOutputPageCount
void EZTAPI TWAIN_SetOutputPageCount(int nPages)
Tell EZTwain how many pages you are about to write to a file. This is OPTIONAL: The
only effect is to add PageNumber tags to TIFF files. You can use nPages=0, which
means "I don't know". See Faxing with TIFF: TIFF Class F and RFC 2301, p 97.
Page 88
EZTwain Pro User Guide
DIB_WriteToBuffer
int DIB_WriteToBuffer(HANDLE hdib, int nFormat, BYTE* pbuffer,
int nbMax)
Write the image into the buffer in the specified file format, not exceeding nbMax
bytes. The return value is the actual size of the image, which may be more or less
than nbMax. If the return value > nbMax, it means only part of the image was
written, and the buffer needs to be bigger. If pBuffer is NULL or nbMax=0 this
function simply returns the required buffer size in bytes.
DIB_WriteArrayToBuffer
int DIB_WriteArrayToBuffer(const HDIB ahdib[], int n, int
nFormat, BYTE* pBuffer, int nbMax)
Page 89
EZTwain Pro User Guide
DIB_LoadFromFilename
(also: TWAIN_LoadFromFilename)
(also: TWAIN_LoadNativeFromFilename)
HANDLE DIB_LoadFromFilename(string pszFile)
HANDLE TWAIN_LoadFromFilename(string pszFile)
HANDLE TWAIN_LoadNativeFromFilename(string pszFile)
Load an image from the specified file. If anything goes wrong the return value is
NULL (0) - call TWAIN_LastErrorCode and related functions for details. If the file is
multipage, normally the first image is loaded but see DIB_SelectPageToLoad. If
pszFile is NULL or points to an empty string, the user is prompted to choose a file
with a standard File Open dialog.
TWAIN_FormatOfFile
int TWAIN_FormatOfFile(string pszFile)
Return the format of the specified file. See File Format Codes (TWFF_* Codes)
above. A return value < 0 means unrecognized format.
DIB_GetFilePageCount/TWAIN_PagesInFile
int DIB_GetFilePageCount(string pszFile)
int TWAIN_PagesInFile(string pszFile)
Return the number of pages in the specified file. The multipage formats supported
are TIFF, PDF and DCX, all other recognized formats will return a page count of 1. A
return value < 0 indicates an error: No such file, unreadable, unrecognized format,
etc.
DIB_SelectPageToLoad
void DIB_SelectPageToLoad(int nPage)
For use when loading multipage files. Tells DIB_LoadFromFilename which page to
load next, from a multipage file. Default is page 0 (first page in file). This value is
reset to 0 after each call to DIB_LoadFromFilename. Example:
DIB_LoadPage
HDIB DIB_LoadPage(string pszFile, int nPage)
Page 90
EZTwain Pro User Guide
Remember that EZTwain cannot generally read PDF files generated or modified by
other software.
DIB_LoadArrayFromFilename
int DIB_LoadArrayFromFilename(HDIB ahdib[], int n,
string Filename)
Load up to n images as DIBs into an array, reading from the specified file.
If filename is null or the empty string, the user is prompted to select a file.
If this function returns < 0, the first n entries of the DIB array will be NULL (0).
If returns r >= 0, the first r entries of the DIB array will contain handles to DIBs
representing the first r images in the file.
The remaining n-r entries in the DIB array will be NULL (0).
Make sure you eventually call DIB_Free on all the loaded DIBs!
DIB_LoadPagesFromFilename
int DIB_LoadPagesFromFilename(HDIB ahdib[], int i, int n,
string Filename)
Similar to DIB_LoadArray, this function loads n images from the specified file,
starting with the ith image in the file (counting from 0 as the first image) into the
ahdib array.
Page 91
EZTwain Pro User Guide
DIB_FormatOfBuffer
int DIB_FormatOfBuffer(const BYTE* pBuffer, int nBytes)
DIB_PageCountOfBuffer/DIB_BufferPageCount
int DIB_PageCountOfBuffer(const BYTE* pBuffer, int nBytes)
int DIB_BufferPageCount(const BYTE* pBuffer, int nBytes)
DIB_LoadFromBuffer
HANDLE DIB_LoadFromBuffer(const BYTE* pBuffer, int nBytes)
Load an image from a buffer in memory containing data formatted as an image file.
For multipage files, if DIB_SelectPageToLoad was called first the designated page will
be loaded, otherwise the first image in the file is loaded.
pBuffer is the address of the buffer (memory block) holding the file to read.
nBytes is the number of bytes of data in buffer.
DIB_LoadPageFromBuffer
HDIB DIB_LoadPageFromBuffer(const BYTE* pBuffer, int nBytes,
int nPage)
Load the specified page from a buffer - the buffer must contain data in a supported
image file format. If the image format is one that can hold only one image, the page
number is ignored.
pBuffer is the address of the buffer (memory block) holding the file to read.
nBytes is the number of bytes of data in buffer.
nPage is the index of the page (image) to read, counting from 0.
DIB_LoadArrayFromBuffer
int DIB_LoadArrayFromBuffer(HDIB ahdib[], int nMax,
const BYTE* pBuffer, int nBytes)
Load up to nMax images as DIBs into an array, reading from a file in memory.
pBuffer is the address of the buffer (memory block) holding the file to read.
nBytes is the number of bytes of data in the buffer.
Returns the number of images loaded if successful, otherwise it returns -1 and you
should call TWAIN_ReportLastError, TWAIN_LastErrorCode, or similar.
Make sure you eventually call DIB_Free on all the loaded DIBs.
Page 92
EZTwain Pro User Guide
TWAIN_IsJpegAvailable
int TWAIN_IsJpegAvailable(void)
TWAIN_IsPngAvailable
int TWAIN_IsPngAvailable(void)
TWAIN_IsTiffAvailable
int TWAIN_IsTiffAvailable(void)
TWAIN_IsPdfAvailable
int TWAIN_IsPdfAvailable(void)
TWAIN_IsGifAvailable
int TWAIN_IsGifAvailable(void)
TWAIN_IsDcxAvailable
int TWAIN_IsDcxAvailable(void)
TWAIN_IsFormatAvailable
int TWAIN_IsFormatAvailable(int nFF)
Return TRUE (1) if the specified image file format is available i.e. the necessary
EZ*.dll files can be found and loaded. Returns FALSE(0) if not.
TWAIN_FormatVersion
int TWAIN_FormatVersion(int nFF)
Returns the version number, times 100, of the module that implements the specified
file format. For example, TWAIN_FormatVersion(TWFF_PDF) returns the version of
the PDF module. A return value of 123 means version 1.23. If the format code is
unrecognized or the file format module is not available, this function returns 0.
TWAIN_IsFileExtensionAvailable
int TWAIN_IsFileExtensionAvailable(string sExt)
This function takes a file-extension as a string and returns TRUE (1) if the
corresponding file format support is available. It returns FALSE (0) if the format is
not available (presumably because the required DLL or DLLs are not installed) or if it
does not recognize the extension. Case does not matter, and a leading ‘.’ is optional.
Examples:
TWAIN_IsFileExtensionAvailable(“tiff”)
TWAIN_IsFileExtensionAvailable(“.PNG”)
Page 93
EZTwain Pro User Guide
TWAIN_FormatFromExtension
int TWAIN_FormatFromExtension(string sExt, int nFF)
Return the format implied by a file specification or extension. See File Format Codes
(TWFF_* Codes) above. If the extension is not recognized, returns nFF. If you pass
this function a filename it will parse it to find the extension. If the string contains no
‘.’, it is assumed to be an exact extension string e.g. “tif”. Case is ignored of course.
TWAIN_ExtensionFromFormat
string TWAIN_ExtensionFromFormat(int nFF, string sDefExt)
Return the default extension for the file format, including leading ‘.’. See File Format
Codes (TWFF_* Codes) above. If nFF is not a valid format code, the string sDefExt is
returned.
TWAIN_SetSaveFormat
int TWAIN_SetSaveFormat(int nFF)
Specifies the default file format for subsequent calls to DIB_WriteToFilename and
TWAIN_AcquireToFilename. Displays a warning message if the format is not
available: See TWAIN_IsFormatAvailable
This function is not normally needed: All functions that write an image file will infer
the file format from the file extension. If your filenames include recognizable
extensions like “.tif”, you do not need to call TWAIN_SetSaveFormat.
Returns TRUE (1) if successful, FALSE (0) if format is invalid or not available.
TWAIN_GetSaveFormat
int TWAIN_GetSaveFormat()
TWAIN_LastOutputFile
string TWAIN_LastOutputFile()
Page 94
EZTwain Pro User Guide
TWAIN_Compression/TWAIN_GetTiffCompression
int TWAIN_SetTiffCompression(int nPT, int nComp)
int TWAIN_GetTiffCompression(int nPT)
Set or get the compression mode to use when writing TIFF files. You must specify
the pixel type (image type) to which this compression applies (See p. 42 for the pixel
type codes.) If you are not familiar with the properties of these compression
algorithms, try Google – or contact Dosadi technical support: support@dosadi.com.
TIFF Compression Modes
Constant Name Value Compression Algorithm Applies to
TIFF_COMP_NONE 1 No compression all
TIFF_COMP_CCITTRLE 2 CCITT modified Huffman RLE BW
TIFF_COMP_CCITTFAX3 3 CCITT Group 3 fax encoding1 BW
TIFF_COMP_CCITTFAX4 4 CCITT Group 4 fax encoding BW
TIFF_COMP_LZW 5 LZW2,3 all
TIFF_COMP_JPEG 7 JPEG-in-TIFF4 RGB, GRAY
The default compression for 1-bit BW is TIFF_COMP_CCITTFAX4, and for all other
image types is TIFF_COMP_NONE.
Note 1: Enables TIFF Class F - see comments on page 97.
Note 2:The Unisys patent on LZW compression has expired.
Note 3: LZW compression works poorly on almost all scans and camera images.
Note 4: JPEG-in-TIFF has compatibility issues: EZTwain writes revised TIFF 6 JPEG.
TWAIN_SetTiffStripSize/TWAIN_GetTiffStripSize
void TWAIN_SetTiffStripSize(int nBytes)
int TWAIN_GetTiffStripSize(void)
By default, images in TIFF files are stored in horizontal strips with a default size of
32768 bytes (roughly). A few nonconforming TIFF Readers cannot handle images
with more than one strip, or images with large strips. Use these functions to work
around this. Setting the TIFF strip size to –1 causes all images to be written using 1
strip.
TWAIN_SetTiffImageDescription
TWAIN_SetTiffDocumentName
void TWAIN_SetTiffImageDescription(string pszText)
void TWAIN_SetTiffDocumentName(string pszText)
These functions set the value of two standard TIFF tags, ImageDescription and
DocumentName. These apply only to the next TIFF file written by EZTwain, and
when EZTwain finishes writing a TIFF file, it forgets (clears) these values.
Page 95
EZTwain Pro User Guide
TWAIN_SetTiffTagShort
TWAIN_SetTiffTagLong
TWAIN_SetTiffTagDouble
TWAIN_SetTiffTagString
TWAIN_SetTiffTagRational
TWAIN_SetTiffTagRationalArray
TWAIN_SetTiffTagBytes
TWAIN_ResetTiffTags
BOOL TWAIN_SetTiffTagShort(int tag, short sValue)
BOOL TWAIN_SetTiffTagLong(int tag, long nValue)
BOOL TWAIN_SetTiffTagString(int tag, const char* pzText)
BOOL TWAIN_SetTiffTagDouble(int tag, double dValue)
BOOL TWAIN_SetTiffTagRational(int tag, double dValue)
BOOL TWAIN_SetTiffTagRationalArray(int tag, double da[], int n)
BOOL TWAIN_SetTiffTagBytes(int tag, const BYTE* pdata, int nLen)
void TWAIN_ResetTiffTags(void)
The tag values you set with these functions will be included in each image
subsequently written to TIFF until you call TWAIN_ResetTiffTags.
The specific data formats needed by each tag are documented here:
http://www.remotesensing.org/libtiff/man/TIFFSetField.3tiff.html
We recommend you use the Set function that corresponds to the TIFF data type of
the tag, although TWAIN_SetTiffTagDouble will correctly set any standard RATIONAL,
SRATIONAL, FLOAT or DOUBLE tag, and TWAIN_SetTiffTagLong will set any standard
SHORT, LONG, or SLONG tag.
Custom and private TIFF tags: Please reference the TIFF standard for more details on
private and custom tags. The SetTiffTag functions can be used to set such tags -
However for such tags you must use the function of the correct type: No conversion
will be performed.
Page 96
EZTwain Pro User Guide
TWAIN_GetTiffTagAscii / TWAIN_TiffTagAscii
BOOL TWAIN_GetTiffTagAscii(string file, int page, int tag, int
len, char buffer)
string TWAIN_TiffTagAscii(string file, int page, int tag)
Read the value of an ASCII-string-valued TIFF tag from the specified page of the
specified TIFF file.
TWAIN_TiffTagAscii returns the tag value as a string, returning the empty string if
anything goes wrong.
TWAIN_GetTiffTagAscii copies the string into buffer, which has room for at least len
characters. Usually the buffer variable mst be allocated or resized before you call
this function, to reserve the space. Returns True(1) if successful, False(0) otherwise.
There are several variations of TIFF specialized for facsimile (fax) applications.
TIFF Class F is a variant of TIFF for storing faxes, which according to one source “has
been in common usage for many years” - as of 1997. It is not an official standard.
See for example:
http://palimpsest.stanford.edu/bytopic/imaging/std/tiff-f.html
IETF RFC 2301 - “File Format for Internet Fax” is a draft Internet standard:
http://www.ietf.org/rfc/rfc2301.txt
EZTwain Pro can write TIFF Class F files: You will need to set a few tags ‘by hand’, as
demonstrated by this code fragment which writes out a DIB. Note that the image
needs to be B&W (1 bit/pixel), have a width of 1728, 2048, or 2482 pixels, and have
a resolution of 204 DPI horizontal and either 98 or 196 DPI vertical.
Page 97
EZTwain Pro User Guide
PDF-Specific Features
PDF_SetTitle
PDF_SetAuthor
PDF_SetSubject
PDF_SetKeywords
PDF_SetCreator
PDF_SetProducer
int PDF_SetTitle(string pzText)
int PDF_SetAuthor(string pzText)
int PDF_SetSubject(string pzText)
int PDF_SetKeywords(string pzText)
int PDF_SetCreator(string pzText)
int PDF_SetProducer(string pzText)
These functions set the value of standard keys in the document information
dictionary of the next PDF file. These apply only to the next PDF file written by
EZTwain, and when EZTwain finishes writing a PDF file, it forgets (clears) these
values.
EZTwain defaults both ‘Creator’ and ‘Producer’ to “Dosadi EZPdf module Vn.nn”
PDF_SetCompression
BOOL PDF_SetCompression(int pt, int comp)
int PDF_GetCompression(int pt)
Set or query the compression algorithm to use when images of the specified pixel
type are written to PDF.
Special cases:
pt=-1 means all applicable pixel types.
comp=-1 means default compression for the pixel type.
Thus PDF_SetCompression(-1,-1) resets the compression for all pixel types to the
default.
For pixel types codes and definitions, see EZTwain Pixel Types, page 42.
Page 98
EZTwain Pro User Guide
PDF_SelectPageSize
BOOL PDF_SelectPageSize(int nPaper)
Designates the page size for subsequent PDF output. See Standard Paper Sizes, page
131. By default, the PDF output page size is PAPER_NONE which means when an
image is written to PDF, it is placed on a page that is the same size as the image.
Images of unknown size (0 DPI) or abnormally small DPI, are arbitrarily reinterpreted
as being 100 DPI. If you select a standard paper size, each image subsequently
written to PDF is placed on a page of that size, and the image is reduced
proportionally, if necessary, to fit on the page.
You can return to the default setting at any time by calling PDF_SelectPageSize with
an argument of PAPER_NONE.
PDF_SelectedPageSize
int PDF_SelectedPageSize()
Returns the current page size for PDF output. See PDF_SelectPageSize above.
PDF_DrawText
PDF_DrawText(double x, double y, string text)
Draw the specified text into the next PDF page that is written, at coordinates (x,y) on
the page. Normally this function is used to draw text on a page that consists of a
single image, such as a scanned page. In this case, the coordinates x and y are in
pixels relative to the top-left of the image.
PDF_SetTextVisible
PDF_SetTextVisible(BOOL bVisible)
PDF_DrawInvisibleText
PDF_DrawInvisibleText(double x, double y, string text)
Like PDF_DrawText, but always draws the text in invisible mode, i.e. as hidden text.
Does not change the text visibility mode.
Page 99
EZTwain Pro User Guide
PDF/A is a file format, a proper subset of Adobe PDF 1.4, defined by international
standard ISO 19005-1 in 2005. It was created to facilitate the long-term storage of
digital documents. Quoting from the Introduction to that standard:
“The primary purpose of this part of ISO 19005 is to define a file format based on PDF,
known as PDF/A, which provides a mechanism for representing electronic documents in
a manner that preserves their visual appearance over time, independent of the tools and
systems used for creating, storing or rendering the files.”
For an overview and answers to frequently asked questions about PDF/A, see:
http://www.aiim.org/documents/standards/PDF-A/19005-1_FAQ.pdf
As a proper subset of PDF 1.4, PDF/A files should be readable by any PDF reader
which conforms to PDF 1.4 or higher.
Embedded fonts
Device-independent color
XMP metadata
Encryption
LZW Compression
Embedded files
External content references
PDF Transparency
Multi-media
JavaScript
The published PDF/A-1 standard may be purchased directly from ISO or from
national standards bodies around the world, such as ANSI (the American National
Standards Institute).
PDF_SetPDFACompliance
PDF_GetPDFACompliance
BOOL PDF_SetPDFACompliance(int nLevel)
int PDF_GetPDFACompliance()
Page 100
EZTwain Pro User Guide
Starting with release 3.30, EZTwain Pro can write and read back encrypted,
password-protected PDF files, in accordance with the PDF 1.4 specification.
A PDF file can be protected with a user password, an owner password, or both. In
theory, a user must present one of the passwords to gain access to the contents of
the file. Quoting from PDF Reference, Third Edition (PDF 1.4):
A PDF document can be encrypted (PDF 1.1) to protect its contents from
unauthorized access. Encryption applies to all strings and streams in the
document’s PDF file, but not to other object types such as integers and boolean
values, which are used primarily to convey information about the document’s
structure rather than its content. Leaving these values unencrypted allows
random access to the objects within a document, while encrypting the strings
and streams protects the document’s substantive contents.
The encryption used by this feature, a 40-bit RC4 encryption, while not weak, is not
particularly strong by current standards. For more information and technical details,
please refer to the PDF Reference, or to the many sources on the web.
The expected behavior of PDF reading programs (such as Acrobat Reader or Foxit
Reader) is described this way in the PDF Reference:
• Opening the document with the correct owner password (assuming it is not
the same as the user password) allows full (owner) access to the document.
This unlimited access includes the ability to change the document’s passwords
and access permissions.
• Opening the document with the correct user password (or opening a
document that does not have a user password) allows additional operations to
be performed according to the user access permissions specified in the
document’s encryption dictionary.
When EZTwain functions are called to read an image or other content from an
encrypted PDF file, they follow the guidelines given above with one difference:
EZTwain first checks to see if the application has supplied a password using the
PDF_SetOpenPassword function below. If so, that password is used exactly as if the
user had entered it at a password prompt. Otherwise, if the PDF has a user
password, the user is prompted for a password. If the supplied password matches
either the user or owner password of the document, the document is opened and the
requested content is retrieved. EZTwain Pro does not and cannot enforce any access
restrictions.
Page 101
EZTwain Pro User Guide
A. If the existing file is not encrypted, the appended new data may not be encrypted.
If any password supplied by the application or the user does not validate against the
existing PDF, the attempted append is aborted without any effect on the file, and the
calling function returns an error, probably EZTEC_PDF_PASSWORD.
PDF_SetOpenPassword
PDF_SetOpenPassword(string sPass)
Sets the password to be used to open encrypted PDF files. When EZTwain is asked
to read content (usually an image) from an encrypted PDF, if the open password has
been set with this function, that password is used to attempt to open the PDF, as if
the user had entered it at a password prompt. If no password has been defined
using this function, then the PDF read routines follow the guidelines quoted above
from the PDF Reference.
PDF_SetUserPassword
PDF_SetUserPassword(string sPass)
Specify the user password for the next PDF file to be written. Setting a non-empty
password for a PDF file causes that PDF to be encrypted using the standard
encryption of PDF 1.4 as discussed above. When EZTwain completes writing a PDF
file, this password is cleared to the empty string.
PDF_SetOwnerPassword
PDF_SetOwnerPassword(string sPass)
Define an owner password for the next output PDF file. Setting a non-empty
password for a PDF file causes that file to be encrypted.
When a PDF file is completed and closed, the owner password is cleared.
Page 102
EZTwain Pro User Guide
PDF_SetPermissions / PDF_GetPermissions
PDF_SetPermissions(long nPermMask)
long PDF_GetPermissions()
Set or Get the access permissions mask to be written into the next output PDF file.
This mask asks PDF viewer programs to restrict certain activities by the user, beyond
simply opening and viewing the file.
You can use bitwise operations, or +/- to combine these constants, for example, to
disallow copying text and graphics from the file:'
PDF_SetPermissions(PDF_PERMIT_ALL - PDF_PERMIT_COPY)
Page 103
EZTwain Pro User Guide
Overview
EZTwain Pro provides some basic services for uploading one or more images to a
webserver, using the HTTP ‘POST’ command. The upload functions emulate the HTTP
handshake produced by a web browser when a user submits a form containing a file-
selection control. However using the EZTwain UPLOAD feature, no browser is
required and there is no user interaction.
UPLOAD_IsAvailable
BOOL UPLOAD_IsAvailable()
UPLOAD_Version
int UPLOAD_Version()
Returns the version number of the upload services module, EZCurl.dll, as an integer:
major version * 100 + minor version. For example at the time of this writing, this
function returns 715 which signifies EZCurl version 7.15.
UPLOAD_MaxFiles
int UPLOAD_MaxFiles()
Returns the maximum number of files that can be uploaded in one upload operation.
At the time of this writing, this function returns 999.
Page 104
EZTwain Pro User Guide
UPLOAD_AddFormField
BOOL UPLOAD_AddFormField(string name, string value)
Set a form field to a value for the next upload. The name of the field must be
expected by the page/script you upload to. All fields set with this function are
discarded and forgotten after the upload that uses them.
This function returns True if successful, False otherwise. It can fail if more than 32
fields are defined prior to an upload, or if either argument is NULL. A successful
return means only that the field was recorded, not that it was sent to or received by
the server.
For example, suppose you have been uploading scanned documents to your server
using a web form like this:
You might replace this form with an automatic upload of a scanned document with
code similar to this:
Page 105
EZTwain Pro User Guide
UPLOAD_DibToURL
UPLOAD_DibsToURL
UPLOAD_DibsSeparatelyToURL
UPLOAD_FilesToURL
int UPLOAD_DibToURL(HDIB hdib, string url, string filename,
string field)
int UPLOAD_DibsToURL(HDIB ahdib[], int n, string url, string
filename, string field)
int UPLOAD_DibsSeparatelyToURL(HDIB ahdib[], int n, string url,
string filename, string field)
int UPLOAD_FilesToURL(string files, string url, string field)
Parameters
hdib handle to image to upload
ahdib address or reference to array of image handles
n number of images to take from ahdib
url the receiving script as a URL. For example:
http://www.dosadi.com/upload.php
filename the (pretended) name of the uploaded file. This is not the name of an
actual file! The images to be uploaded are collected into a temporary
file, and POSTed to the server: The server is told that it is receiving a
file of this name. The extension on this filename determines the format
of the uploaded file: .tif for TIFF format, .jpg for JPEG format, and so
on.
files A string containing one or more filenames, separated by semicolons (;)
or vertical bars (|) e.g. “c:\file1.jpg;c:\file2.tif”
field the name of the file-upload field on the form. Some scripts require a
specific field name. When multiple files are being sent to the server,
the value of field is modified by appending “1”, “2”, etc. to it.
Operation
All of these functions have in common that they emulate a web browser submitting
to a server a multipart form with one or more files attached. The UPLOAD_Dib...
functions do not actually read or create the named files – they just send the data to
the server as if such a file was being uploaded. On the other hand,
UPLOAD_FilesToURL expects to find the specified file or files on the local disk, and it
uploads their contents and sends along their names.
Page 106
EZTwain Pro User Guide
Return values
0 success (transaction completed)
Note: A success return means only that the data was sent to the
server and a response was received, not that the receiving script
necessarily accepted the submitted file. See DIB_UploadResponse
below.
-1 user cancelled File Save dialog (should never happen!)
-2 could not write temp file - access denied, volume protected, etc.
-3 a) image is invalid (null or invalid DIB handle)
b) The DLL(s) needed to save that format failed to load
c) DIB format incompatible with save format e.g. uploading a B&W
image as JPEG.
d) filename extension isn’t one EZTwain recognizes.
-4 writing data failed, maybe the disk with the temp folder is full?
-5 other unspecified internal error
-1xx libcurl (the library EZTwain uses) returned error code xx
For example:
-106 Could not resolve host
-107 Couldn't connect
-126 (UPLOAD_FilesToURL only) The specified files could not be opened and
read.
-155 Connection was aborted.
Page 107
EZTwain Pro User Guide
Server Response
These functions deal with the text returned by the server in response to an UPLOAD
operation such as UPLOAD_DibToURL. EZTwain collects and stores the text returned
by the server in response to the last upload, up to an implementation-defined limit,
currently around 12000 bytes.
UPLOAD_ResponseLength
int UPLOAD_ResponseLength()
UPLOAD_ClearResponse
void UPLOAD_ClearResponse()
UPLOAD_ClearResponse clears the stored response text. You usually don't need to
call UPLOAD_ClearResponse, all the UPLOAD functions call it when they start.
UPLOAD_Response
string UPLOAD_Response()
UPLOAD_GetResponse
void UPLOAD_GetResponse(string s)
Page 108
EZTwain Pro User Guide
UPLOAD_AddHeader
BOOL UPLOAD_AddHeader(string header)
Add the specified line to the HTTP header of the next upload. This can be used, for
example, to send a cookie or a pragma to the server. This allows you to tinker with
the headers sent by EZTwain Pro.
UPLOAD_EnableProgressBar
UPLOAD_IsEnabledProgressBar
UPLOAD_EnableProgressBar(BOOL bEnable)
BOOL UPLOAD_IsEnabledProgressBar()
Enable or disable – that is, show or hide - the progress-bar that appears during
uploads. The default state of this setting is enabled (True)
Page 109
EZTwain Pro User Guide
TWAIN_ViewFile
int TWAIN_ViewFile(string pszFile)
Opens an image viewer window and displays the specified image file in it. The
window can be resized by the user. If the file contains multiple pages/images,
controls are displayed for stepping between the pages. The filename is displayed as
the title/caption of the window. By default, the dialog is modal with an [OK] button.
Return values:
-1 error creating the window or opening/reading the file
0 user cancelled the window (by clicking the close box)
1 user clicked the OK button.
Caution: EZTwain cannot generally read PDF files generated or modified by other
software.
DIB_View
int DIB_View(HDIB hdib, string pzTitle, HWND hwndParent)
Display the given image in a viewer window with the given title.
If hdib is 0 (NULL), the viewer window still opens but no image is displayed.
hwndParent is the window handle of the parent window - if you use 0 (NULL) for this
parameter, EZTwain uses the active window of the application if there is one, or no
parent window.
By default, the window contains only an [OK] button, the style of the window is a
resizable dialog box, the dialog is modal, and this function does not return until the
user closes the dialog or clicks the [OK] button.
DIB_SetViewImage
BOOL DIB_SetViewImage(HDIB hdib)
If the image viewer is open, this displays the specified image in the viewer window.
To use this function, first call DIB_SetViewOption(“modeless”, “true”) and then
DIB_View(0, “<title>”, 0) This opens the image viewer window with no current
image. Then you can call DIB_SetViewImage repeatedly to display images, and
DIB_ViewClose when you are done.
DIB_IsViewOpen/TWAIN_IsViewOpen
BOOL DIB_IsViewOpen()
Page 110
EZTwain Pro User Guide
Returns TRUE(1) if the viewer window is open, FALSE(0) otherwise. Normally this is
only possible if the viewer is operating as a modeless dialog - set
DIB_SetViewOption.
DIB_ViewClose/TWAIN_ViewClose
BOOL DIB_ViewClose()
Page 111
EZTwain Pro User Guide
DIB_SetViewOption/TWAIN_SetViewOption
BOOL DIB_SetViewOption(string option, string value)
1: Default value.
2. We show all options and values with quotes because they are strings. Your
language may use another way of quoting strings.
3: In place of “true” you may use: “1”, “yes”, “vrai”, “oui”, “si”, or “ja”.
4: In place of “false” you may use: “0”, “no”, “faux”, “non”, or “nein”.
Page 112
EZTwain Pro User Guide
TWAIN_SuppressErrorMessages
int TWAIN_SuppressErrorMessages (int nSuppress)
TWAIN_ReportLastError
void TWAIN_ReportLastError(string pzMsg)
Like TWAIN_ErrorBox, but if some details are available from TWAIN about the last
failure, they are included in the message box. This function uses
TWAIN_LastErrorText to find out about the last error – see below.
TWAIN_LastErrorCode
int TWAIN_LastErrorCode(void)
Return the most recent EZTwain error code, one of the EZTEC_ codes – See the
EZTwain declaration file for your programming language, or refer to eztwain.h.
TWAIN_LastErrorText / TWAIN_GetLastErrorText
void TWAIN_GetLastErrorText(LPSTR pzMsg)
string TWAIN_LastErrorText(void)
Returns a text string describing the last error encountered by EZTwain. In other
words, this function is like TWAIN_LastErrorCode, but it translates the error into a
human-readable (English) string. For example, if you try to scan from a device that
is disconnected, this function may return something like: "Could not open TWAIN
device: EPSON TWAIN 5\n(check power and connections.)". This string may contain
end-of-line characters. The returned string will not exceed 512 (ASCII) characters
long – if you use TWAIN_GetLastErrorText, make sure you pre-allocate the variable
to have enough room.
TWAIN_ClearError
void TWAIN_ClearError(void)
Set the EZTwain internal error code to EZTEC_NONE and clears the last error text.
TWAIN_GetResultCode
unsigned TWAIN_GetResultCode(void)
Return the result code (TWRC_xxx) from the last triplet sent to TWAIN
Page 113
EZTwain Pro User Guide
TWAIN_GetConditionCode
unsigned TWAIN_GetConditionCode(void)
Return the condition code from the last triplet sent to TWAIN. (To be precise, from
the last call to TWAIN_DS) If no Source is open, return the condition code of the
source manager.
TWAIN_ErrorBox
void TWAIN_ErrorBox(string pzMsg)
Post an error message box with an OK button. The string argument is used as the
text of the box, and the application title (see TWAIN_RegisterApp and
TWAIN_SetAppTitle) is used as the title or caption of the box. If messages are
suppressed (see below) this function does nothing.
TWAIN_LogFile
void TWAIN_LogFile(int fLog)
EZTwain can write a quite detailed log of its activity, including every TWAIN call it
makes and the result. Log output goes to c:\eztwain.log. You can use
TWAIN_SetLogFolder to direct the log file to another directory.
If logging is already turned on, TWAIN_LogFile(1) flushes the logfile to disk so prior
output won’t be lost in a subsequent crash.
TWAIN_WriteToLog
void TWAIN_WriteToLog(string pzText)
Write text to the EZTwain log file, eztwain.log. If the text does not end with an end-
of-line character, one is added. If logging is turned off, this call has no effect.
TWAIN_LogFile controls logging. TWAIN_SetLogFolder controls the location of the
log file.
TWAIN_SetLogFolder
void TWAIN_SetLogFolder(string pzFolder)
Set the directory that will contain the eztwain.log file. By default this folder is the
root of the C drive: c:\
Calling this function with a NULL pointer or an empty string resets the log folder to
the default c:\. TWAIN_SetLogFolder(“c:\ top\middle\logs”) will create the ‘logs’
folder if necessary, but will not create the ‘top’ or ‘middle’ folders.
If this function is called while logging is active, the current logfile is relocated, intact,
to the new folder.
Page 114
EZTwain Pro User Guide
EZTwain carefully tracks the TWAIN State, and hides a lot of the details of managing
the state, but not all. The following group of functions are the ones concerned with
directly reading and modifying the TWAIN State.
TWAIN_State
int TWAIN_State(void)
TWAIN_LoadSourceManager
int TWAIN_LoadSourceManager(void)
TWAIN_OpenSourceManager
int TWAIN_OpenSourceManager(HWND hwnd)
TWAIN_OpenDefaultSource
int TWAIN_OpenDefaultSource(void)
Page 115
EZTwain Pro User Guide
TWAIN_OpenSource
int TWAIN_OpenSource(string pzName)
TWAIN_EnableSource
int TWAIN_EnableSource(HWND hwnd)
Enables the open Source for image acquisition. ‘Enabled’ in TWAIN parlance means
that the Source has permission to begin acquiring images. Until it is enabled, a
Source will never begin any image acquisition, nor will it offer an image for transfer.
This call returns TRUE(1) if it leaves the Source in State 5 or higher. A return of
FALSE(0) indicates that either the Enable failed, or that the Source asked to be
closed immediately! If the Source is already enabled when you make this call, it
does nothing and returns TRUE.
By default the Source is asked to display its user interface, but this can be controlled
with TWAIN_SetHideUI. If a Source is enabled without its user interface, it should if
possible immediately offer to transfer an image – on return from
TWAIN_EnableSource, the TWAIN_State() should be 6 (Transfer Ready.)
By default the parent window is not affected, but this can be changed using
TWAIN_DisableParent.
TWAIN_DisableSource
int TWAIN_DisableSource(void)
TWAIN_CloseSource
int TWAIN_CloseSource(void)
TWAIN_UnloadSourceManager
int TWAIN_UnloadSourceManager(void)
Closes and unloads the TWAIN Source Manager. If necessary, it will abort transfers,
close the open Source if any, and close the Source Manager.
If successful, it returns 1 (TRUE) otherwise 0 (FALSE).
Page 116
EZTwain Pro User Guide
TWAIN_EndXfer
int TWAIN_EndXfer(void)
Only valid in State 7, it signals the DS to go to either State 6 if it has more transfers
ready, or to State 5 if it does not.
It would be very unusual to need to call this: The Acquire functions call this after
each transfer. The other state-changing functions will call this if they find
themselves in State 7 and need to move down.
TWAIN_AbortAllPendingXfers
int TWAIN_AbortAllPendingXfers(void)
Page 117
EZTwain Pro User Guide
Functions – Capability
TWAIN_SetXferCount
int TWAIN_SetXferCount(int nXfers)
Tell the Source the number of images the application will accept.
nXfers = -1 means any number (the default, when a device is opened.)
Returns: 1 for success, 0 for failure.
TWAIN_GetCurrentUnits
int TWAIN_GetCurrentUnits(void)
Return the current unit of measure: inches, cm, pixels, etc. – see list below. Many
TWAIN parameters such as resolution are set and returned in the current unit of
measure. There is no error return - in case of error it returns 0 (TWUN_INCHES)
TWAIN_SetUnits
int TWAIN_SetUnits(int nUnits)
Set the current unit of measure for the source. Common unit codes are given above.
• Most sources do not support all units, some support only inches. Some
cameras support only pixels.
• If you want to get or set resolution in DPI, make sure the current units are
inches, or you might get Dots-Per-Centimeter!
TWAIN_GetPixelType
int TWAIN_GetPixelType(void)
Ask the open device for the current pixel type. See table below.
If anything goes wrong (it shouldn't), this function returns 0 (TWPT_BW).
Page 118
EZTwain Pro User Guide
TWAIN_SetPixelType
int TWAIN_SetPixelType(int nPixType)
TWAIN_GetBitDepth
int TWAIN_GetBitDepth(void)
Get the current scanning bit depth, which can depend on the current PixelType.
In theory, bit depth is per color channel e.g. 24-bit RGB has bit depth 8. In practice
a lot of devices return 24 as the bit depth for RGB. If anything goes wrong, this
function returns 0.
TWAIN_SetBitDepth
int TWAIN_SetBitDepth(int nBits)
Try to set the scanning bit depth for the current pixel type.
Note: You should set a PixelType, and then set the bitdepth for that type.
Tip: Some scanners advertise ’12-bit scanning’ or ’14-bit A/D’. Just because this
appears in the specifications does not mean the TWAIN driver supports it, but if it
does, you usually use it by setting BitDepth to 16. You generally cannot use
TWAIN_AcquireNative to scan 16-bit/channel images, because there is no such DIB
format! The TWAIN drivers just don’t know what to do. Use memory transfer [See
TWAIN_AcquireMemory, p. 31] to acquire 16-bit/channel images.
TWAIN_GetCurrent Resolution
double TWAIN_GetCurrentResolution(void)
TWAIN_GetYResolution
double TWAIN_GetYResolution(void)
Page 119
EZTwain Pro User Guide
TWAIN_SetResolution/TWAIN_SetResolutionInt
int TWAIN_SetResolution(double dRes)
int TWAIN_SetResolutionInt(int nRes)
Try to set the current resolution for scanning. This call sets both vertical (y) and
horizontal (x) resolution to the same value. See TWAIN_SetXResolution below if you
want to set x and y resolution separately. With scanners if this call succeeds,
subsequent scans will be made at this resolution. Naturally, this will not be useful on
devices that store images ahead of time, like digital cameras. And generally video-
capture devices ignore or reject resolution settings.
TWAIN_SetXResolution / TWAIN_SetYResolution
int TWAIN_SetXResolution(double dxRes)
int TWAIN_SetYResolution(double dyRes)
Be aware that many scanners will not accept different x and y resolution values -
they will either ignore the different y-resolution value, or they will lock the two
parameters together: Setting either parameter will set both to the same value.
TWAIN_SetContrast
int TWAIN_SetContrast(double dCon)
Try to set the current contrast for acquisition. Contrast is not a required capability,
do not assume a particular scanner supports it.
The TWAIN standard says that the range for this cap is -1000 ... +1000.
TWAIN_SetBrightness
int TWAIN_SetBrightness(double dBri)
Try to set the current brightness for acquisition. Brightness is not a required
capability, do not assume a particular scanner supports it.
The standard range for this cap is -1000 ... +1000 – we have seen other ranges…
Page 120
EZTwain Pro User Guide
TWAIN_SetThreshold
int TWAIN_SetThreshold(double dThresh)
Try to set the threshold (TWAIN: ICAP_THRESHOLD) for black and white scanning.
Legal values for threshold are 0 to 255. Returns TRUE(1) for success, FALSE(0) for
failure.
If a device is not open (TWAIN_State=4) this function will record an error and fail.
How does Threshold work? In B&W scanning mode, you can think of the scanner as
measuring each pixel of the document to get an 8-bit number (0..255) where 0 is the
darkest measurable black, and 255 is the lightest white. When the scanner delivers
the B&W image to your application, pixels that fall below the threshold are set to
black, pixels above the threshold are set to white. Nobody can say what happens to
pixels that are equal to the threshold – don't worry about it!
As you lower the threshold your scanned images tend to become whiter, and as you
raise the threshold the scans tend to become darker.
Field Notes
The TWAIN default threshold value is 128, but that does not mean much: Most
scanners default to a threshold of 128 when they are opened but other scanners
seem to default to a stored value, perhaps the last user-selected value.
This setting usually affects only 1-bit scans i.e. PixelType == TWPT_BW.
This setting applies to document scanners, and perhaps film scanners – it is likely to
be omitted or ignored by cameras and video digitizers.
A few low-cost scanners will accept this setting without error, but then ignore the
value!
TWAIN_GetCurrentThreshold
double TWAIN_GetCurrentThreshold(void)
Try to get the current B&W threshold setting – the value of the ICAP_THRESHOLD
capability. If this fails for any reason, it will return -1. Note: EZTwain *VERSIONS
BEFORE 2.65 RETURNED 128.0*
Page 121
EZTwain Pro User Guide
TWAIN_SetAutoBright
int TWAIN_SetAutoBright(BOOL bOn)
TWAIN_SetLightPath
int TWAIN_SetLightPath(BOOL bTransmissive)
TWAIN_SetGamma
int TWAIN_SetGamma(double dGamma)
TWAIN_SetShadow
int TWAIN_SetShadow(double d) // 0..255
TWAIN_SetHighlight
int TWAIN_SetHighlight(double d) // 0..255
Page 122
EZTwain Pro User Guide
TWAIN_HasFeeder
BOOL TWAIN_HasFeeder(void)
Return TRUE(1) if the source indicates it has a document feeder, FALSE(0) otherwise.
You will need to have a device open for this query to work.
TWAIN_IsFeederSelected
BOOL TWAIN_IsFeederSelected(void)
TWAIN_SelectFeeder
int TWAIN_SelectFeeder(int fYes)
TWAIN_IsAutoFeedOn
BOOL TWAIN_IsAutoFeedOn(void)
TWAIN_SetAutoFeed
int TWAIN_SetAutoFeed(int fYes)
TWAIN_SetAutoScan
int TWAIN_SetAutoScan(int fYes)
TWAIN_IsFeederLoaded
BOOL TWAIN_IsFeederLoaded(void)
Page 123
EZTwain Pro User Guide
The way duplex scanning works surprises some people, although it is elegant and
logical: Duplex scanning treats each page as if it were two pages being scanned
single-sided. If you scan 5 pages in duplex mode, the data transfer and the TWAIN
activity is essentially the same as scanning 10 pages in simplex mode.
This means that all duplex scanning is multipage scanning. If you allow duplex
scanning we recommend that you use one of the Multi-image Scanning Functions:
TWAIN_AcquireMultipageFile, TWAIN_AcquireArray, TWAIN_AcquirePagesToFiles, etc.
TWAIN_GetDuplexSupport
int TWAIN_GetDuplexSupport(void)
TWAIN_EnableDuplex
int TWAIN_EnableDuplex(int fYes)
TWAIN_IsDuplexEnabled
BOOL TWAIN_IsDuplexEnabled(void)
Page 124
EZTwain Pro User Guide
Other Settings
TWAIN_HasControllableUI
int TWAIN_HasControllableUI(void)
Return 1 if source claims UI can be hidden (see SetHideUI above)
Return 0 if source says UI *cannot* be hidden
Return -1 if source (pre TWAIN 1.6) cannot answer the question.
TWAIN_SetIndicators
int TWAIN_SetIndicators(BOOL bVisible)
TWAIN_SetXferMech / TWAIN_XferMech
int TWAIN_SetXferMech(int mech)
int TWAIN_XferMech(void)
Normally you do not need to set this mode – the Acquire functions will select the
transfer mode they need.
TWAIN_NegotiatePixelTypes
int TWAIN_NegotiatePixelTypes(unsigned wPixTypes)
Negotiate with the source to specify a set of pixel types that can be acquired. Note
that this function does not take pixel type codes - it requires pixel mask codes:
See TWAIN_AcquireNative for some mask constants.
A parameter of 0 (TWAIN_ANYTYPE) causes no negotiation & no restriction. You
should not assume that the source will honor your restrictions, even if this call
succeeds!
TWAIN_SupportsFileXfer
int TWAIN_SupportsFileXfer(void)
Returns TRUE(1) if the open Source claims to support file transfer mode
(XFERMECH_FILE)
This mode is optional. If TRUE, you can use AcquireFile.
Page 125
EZTwain Pro User Guide
TWAIN_Get
HCONTAINER TWAIN_Get(unsigned uCap)
TWAIN_GetDefault
HCONTAINER TWAIN_GetDefault(unsigned uCap)
TWAIN_GetCurrent
HCONTAINER TWAIN_GetCurrent(unsigned uCap)
TWAIN_Set
int TWAIN_Set(unsigned uCap, HCONTAINER hcon)
TWAIN_Reset
int TWAIN_Reset(unsigned uCap)
Issue a MSG_RESET, which should reset the specified capability to its default value.
Returns 1 (TRUE) if successful, 0 (FALSE) otherwise.
TWAIN_GetCapBool
BOOL TWAIN_GetCapBool(unsigned cap, BOOL bDefault)
Page 126
EZTwain Pro User Guide
TWAIN_GetCapFix32
double TWAIN_GetCapFix32(unsigned cap, double dDefault)
TWAIN_GetCapUint16
int TWAIN_GetCapUint16(unsigned cap, int nDefault)
TWAIN_SetCapability
int TWAIN_SetCapability(unsigned Cap, double dVal)
TWAIN_SetCapBool
int TWAIN_SetCapBool(unsigned Cap, BOOL bVal)
Set the value of a capability that has type TWTY_BOOL. Only valid in State 4.
Return Value: TRUE (1) if successful, FALSE (0) otherwise.
TWAIN_SetCapOneValue
int TWAIN_SetCapOneValue(unsigned Cap, unsigned ItemType, long
ItemVal)
TWAIN_SetCapFix32 / TWAIN_SetCapFix32R
int TWAIN_SetCapFix32(unsigned Cap, double dVal)
int TWAIN_SetCapFix32R(unsigned Cap, int Num, int Den)
Use SetCapFix32 and SetCapFix32R for capabilities that take a FIX32 value.
Page 127
EZTwain Pro User Guide
TWAIN_SetRegion
void TWAIN_SetRegion(double L, double T, double R, double B)
Example: The following code, with an 8.5” x 11” flatbed scanner, will scan a 3” x 4”
square towards the center of the platen, in color at 300dpi, and save it as a TIFF file:
If (TWAIN_OpenDefaultSource()) {
TWAIN_SetUnits(TWUN_INCHES);
TWAIN_SetResolution(300);
TWAIN_SetPixelType(TWPT_RGB);
TWAIN_SetRegion(2.0, 3.0, 5.0, 7.0);
// scan starts 2" from left side, 3" from top
// scan stops 5" from left side, 7" from top.
// scan is 5.0-2.0 = 3" wide and 7.0-3.0 = 4" high
TWAIN_SetHideUI(1);
TWAIN_AcquireToFilename(0, "myfile.tif");
}
TWAIN_ResetRegion
void TWAIN_ResetRegion(void)
Resets the region set with TWAIN_SetRegion, so that EZTwain stops trying to set or
crop to a region of interest.
Page 128
EZTwain Pro User Guide
TWAIN_SetImageLayout
int TWAIN_SetImageLayout(double L, double T, double R, double B)
L, T, R, B = distance to left, top, right, and bottom edge respectively of area to scan,
measured in the current unit of measure from the top-left corner of the 'original
page' (TWAIN 1.6 8-22). See the warning below about units.
Returns TRUE (1) if successful, FALSE (0) otherwise. Common causes of failure:
1. Not in State 4 / Source open. See TWAIN_OpenDefaultSource.
2. The device does not support image layout.
3. Incorrect parameters – see the example below.
Do not assume that image layout is pixel-precise. Many devices deliver images that
differ from the requested image layout by a few pixels in width or height.
In theory the numbers used in image layout are measurements in the current unit
of measure (see TWAIN_GetCurrentUnits / TWAIN_SetUnits.)
In practice quite a few TWAIN devices ignore the unit setting and always measure
image layout in inches.
TWAIN_GetImageLayout /
TWAIN_GetDefaultImageLayout
int TWAIN_GetImageLayout(double *L, double *T, double *R, double
*B)
int TWAIN_GetDefaultImageLayout(double *L, double *T, double *R,
double *B)
TWAIN_ResetImageLayout
int TWAIN_ResetImageLayout(void)
Page 129
EZTwain Pro User Guide
TWAIN_SetFrame
int TWAIN_SetFrame(double L, double T, double R, double B)
Page 130
EZTwain Pro User Guide
TWAIN_SetPaperSize
int TWAIN_SetPaperSize(int nPaper)
Note: Some devices support this, some don’t. Beginning with EZTwain Pro 3.05, if
the Source refuses to set the requested paper size, TWAIN_SetPaperSize will try the
two other ways to select the scan area: TWAIN_SetImageLayout and
TWAIN_SetFrame.
Caution: TWAIN defines no default paper size. This means that when you open a
device, it is free to select whatever paper size it feels like. If you are running a
device with its user interface suppressed, we recommend that you call
TWAIN_SetPaperSize. This may fail, but when it does the device usually has a
reasonable default – such as 8.5 x 11 inches, or the device's maximum scan area.
Page 131
EZTwain Pro User Guide
PAPER_A7 22
PAPER_A8 23
PAPER_A9 24
PAPER_A10 25
PAPER_ISOB0 26
PAPER_ISOB1 27
PAPER_ISOB2 28
PAPER_ISOB5 29
PAPER_ISOB7 30
PAPER_ISOB8 31
PAPER_ISOB9 32
PAPER_ISOB10 33
PAPER_JISB0 34
PAPER_JISB1 35
PAPER_JISB2 36
PAPER_JISB3 37
PAPER_JISB4 38
PAPER_JISB6 39
PAPER_JISB7 40
PAPER_JISB8 41
PAPER_JISB9 42
PAPER_JISB10 43
PAPER_C0 44
PAPER_C1 45
PAPER_C2 46
PAPER_C3 47
PAPER_C7 48
PAPER_C8 49
PAPER_C9 50
PAPER_C10 51
PAPER_USSTATEMENT 52
PAPER_BUSINESSCARD 53
Page 132
EZTwain Pro User Guide
TWAIN_GetPaperDimensions
BOOL TWAIN_GetPaperDimensions(int nPaper, int nUnits,
double *pdW, double *pdH)
Retrieves the width and height of a standard paper size, in specified units. For
nPaper, use one of the PAPER_ codes listed above. For nUnits, use one of the
TWUN_ unit codes, such as TWUN_INCHES(0) or TWUN_CENTIMETERS(1). For pdW
and pdH, pass pointers to 64-bit double-precision floating point variables – or in
languages that support passing parameters by reference, pass the names of two
double-precision float variables.
Page 133
EZTwain Pro User Guide
Tone Control
TWAIN_SetGrayResponse
TWAIN_SetColorResponse
int TWAIN_SetColorResponse(const long pred[256], const long
pgreen[256], const long pblue[256])
TWAIN_ResetGrayResponse/ TWAIN_ResetColorResponse
int TWAIN_ResetGrayResponse(void)
int TWAIN_ResetColorResponse(void)
These two functions reset the response curve to map every value V to itself i.e. a 'do
nothing' translation.
Page 134
EZTwain Pro User Guide
TWAIN_DoSettingsDialog
int TWAIN_DoSettingsDialog(HWND hwnd)
Display the device's settings dialog and allow the user to adjust any or all settings.
This function returns when the user closes the dialog. This feature is optional in
TWAIN. If a device has a settings dialog, it is normally very similar to the device's
scanning dialog, with the [Scan] button replaced with an [OK] button.
A device may remember its settings when it is closed and re-opened, but it may not:
TWAIN does not require this. You can use TWAIN_GetCustomDataToFile (below) to
save all the settings of a device, and TWAIN_SetCustomDataFromFile to restore them
later. Any device that supports a settings dialog supports the CustomData functions.
If a device is open, uses that device. If no device is currently open, uses the default
device.
Return values:
1 dialog was displayed and user clicked OK
0 dialog was displayed and user clicked Cancel
-1 dialog not displayed - some error. Call TWAIN_LastErrorCode,
ReportLastError, or similar function for more details.
TWAIN_EnableSourceUiOnly
int TWAIN_EnableSourceUiOnly(HWND hwnd)
Note: If successful, this call leaves the dialog open, so your program must run a
message pump at least until the user closes it. If you don't understand what that
means, don't call this function! Use TWAIN_DoSettingsDialog, above.
Page 135
EZTwain Pro User Guide
Good: 1. (If implemented properly) it reads and writes all settings of the device,
even settings that are not accessible through TWAIN, like “melt film after
scanning” and “pixel thickness.” Or... the imprinter step size and direction
on Fujitsu ‘fi’ series scanners.
Support for this feature can be tested when a device is open, by reading the value of
the Boolean capability CAP_CUSTOMDSDATA. In C:
if (TWAIN_GetCapBool(CAP_CUSTOMDSDATA, FALSE)) {
TWAIN_GetCustomDataToFile
int TWAIN_GetCustomDataToFile(string pzFile)
Takes a file specification, reads the Custom DS Data from the device and saves it in
the file. An existing file will be overwritten. Only valid in State 4 – a device must be
open. See TWAIN_OpenSource, 116. The device must support this optional feature,
see above.
Returns TRUE(1) if successful, FALSE(0) otherwise.
TWAIN_SetCustomDataFromFile
int TWAIN_SetCustomDataFromFile(string pzFile)
Takes a file specification, reads the Custom DS Data from the file and writes it to the
device. The file must exist. Only valid in State 4 – a device must be open. See
TWAIN_OpenSource, 116. The device must support this optional feature, see above.
Returns TRUE(1) if successful, FALSE(0) otherwise.
Page 136
EZTwain Pro User Guide
Functions – Container
For theory and practice of using containers, see the section How To: Work with
Containers (p 163).
CONTAINER_Free
void CONTAINER_Free(HCONTAINER hcon)
Free the memory and resources of a capability container.
CONTAINER_Copy
HCONTAINER CONTAINER_Copy(HCONTAINER hcon)
Create an exact copy of the container.
CONTAINER_Equal
BOOL CONTAINER_Equal(HCONTAINER hcon1, HCONTAINER hcon2)
Return TRUE (1) if all properties of hcon1 and hcon2 are the same. Otherwise return
FALSE (0).
CONTAINER_IsValid
BOOL CONTAINER_IsValid(HCONTAINER hcon)
Returns 1 (TRUE) if the container seems to be valid, 0 (FALSE) if not.
A valid container is one that will not cause errors or exceptions if accessed with the
other CONTAINER_ functions.
CONTAINER_Format
int CONTAINER_Format(HCONTAINER hcon)
Return the 'format' of this container: CONTAINER_ONEVALUE, etc.
CONTAINER_ItemCount
int CONTAINER_ItemCount(HCONTAINER hcon)
Return the number of values in the container. For a ONEVALUE, return 1.
CONTAINER_ItemType
int CONTAINER_ItemType(HCONTAINER hcon)
Return the item type (what exact kind of values are in the container.)
See the TWTY_* definitions in TWAIN.H
CONTAINER_TypeSize
int CONTAINER_TypeSize(int nItemType)
Return the size in bytes of an item of the specified type (TWTY_*)
Page 137
EZTwain Pro User Guide
CONTAINER_FloatValue / CONTAINER_IntValue
double CONTAINER_FloatValue(HCONTAINER hcon, int n)
int CONTAINER_IntValue(HCONTAINER hcon, int n)
Return the value of the nth item in the container.
n is forced into the range 0 to ItemCount(hcon)-1.
CONTAINER_StringValue / CONTAINER_GetStringValue
string CONTAINER_StringValue(HCONTAINER hcon, int n)
void CONTAINER_GetStringValue(HCONTAINER hcon, int n, LPSTR
pzText)
Return the nth value in a container, in the form of a string.
The first form is a function that returns the string as its value. (Not available in VB.)
The second form expects a string variable as its 3rd parameter - in most languages,
the string must be pre-allocated with enough space to hold the returned value - see
n is forced into the range 0 to ItemCount(hcon)-1.
CONTAINER_ValuePtr
BYTE* CONTAINER_ValuePtr(HCONTAINER hcon, int n)
CONTAINER_ContainsValue
int CONTAINER_ContainsValue(HCONTAINER hcon, double d)
Return 1 (TRUE) if the value d is one of the items in the container.
CONTAINER_FindValue
int CONTAINER_FindValue(HCONTAINER hcon, double d)
Return the index of the value d in the container, or -1 if not found.
CONTAINER_CurrentValue / CONTAINER_DefaultValue
double CONTAINER_CurrentValue(HCONTAINER hcon)
double CONTAINER_DefaultValue(HCONTAINER hcon)
Return the container's current or power-up (default) value.
Array containers do not have these and will return -1.0.
OneValue containers always return their (one) value.
CONTAINER_CurrentIndex / CONTAINER_DefaultIndex
int CONTAINER_DefaultIndex(HCONTAINER hcon)
int CONTAINER_CurrentIndex(HCONTAINER hcon)
Return the index of the Default or Current value, in an Enumeration.
Return -1 if the container is not an Enumeration.
CONTAINER_MinValue / CONTAINER_MaxValue
double CONTAINER_MinValue(HCONTAINER hcon)
double CONTAINER_MaxValue(HCONTAINER hcon)
Page 138
EZTwain Pro User Guide
CONTAINER_StepSize
double CONTAINER_StepSize(HCONTAINER hcon)
Return the step value of a Range container.
Returns -1.0 if the container is not a Range.
CONTAINER_OneValue / CONTAINER_Array
HCONTAINER CONTAINER_OneValue (int nItemType, double dVal)
HCONTAINER CONTAINER_Array (int nItemType, int nItems)
These functions create containers from scratch:
nItemType is one of the TWTY_* item types from TWAIN.H
nItems is the number of items, in an array or enumeration.
CONTAINER_Range / CONTAINER_Enumeration
HCONTAINER CONTAINER_Range(int nItemType, double dMin, double
dMax, double dStep)
HCONTAINER CONTAINER_Enumeration(int nItemType, int nItems)
These functions create containers from scratch:
nItemType is one of the TWTY_* item types from TWAIN.H
nItems is the number of items, in an array or enumeration.
dMin, dMax, dStep are the beginning, ending, and step value of a range.
CONTAINER_SetItem / CONTAINER_SetItemString
int CONTAINER_SetItem(HCONTAINER hcon, int n, double dVal)
int CONTAINER_SetItemString(HCONTAINER hcon, int n, LPCTSTR
pzVal)
CONTAINER_SetItemFrame
int CONTAINER_SetItemFrame(HCONTAINER hcon, int n, double l,
double t, double r, double b)
Page 139
EZTwain Pro User Guide
CONTAINER_SelectDefaultValue /
CONTAINER_SelectDefaultItem
int CONTAINER_SelectDefaultValue(HCONTAINER hcon, double dVal)
int CONTAINER_SelectDefaultItem(HCONTAINER hcon, int n)
CONTAINER_SelectCurrentValue /
CONTAINER_SelectCurrentItem
int CONTAINER_SelectCurrentValue(HCONTAINER hcon, double dVal)
int CONTAINER_SelectCurrentItem(HCONTAINER hcon, int n)
CONTAINER_DeleteItem
int CONTAINER_DeleteItem(HCONTAINER hcon, int n)
CONTAINER_InsertItem
int CONTAINER_InsertItem(HCONTAINER hcon, int n, double dVal)
Page 140
EZTwain Pro User Guide
TWAIN_Testing123
HANDLE TWAIN_Testing123(string pz, int n, HANDLE h, double d,
unsigned u)
Display a dialog box with the parameter values in it. Use this to test that you can
call EZTwain and pass parameters correctly. It returns the value of the HANDLE h
parameter.
TWAIN_SelfTest
int TWAIN_SelfTest(unsigned f)
Page 141
EZTwain Pro User Guide
TWAIN_AutoClickButton
Void TWAIN_AutoClickButton(string pzButtonName)
This odd little function can be used, sometimes, to automate image transfers from a
device that insists on displaying a user interface dialog. Call this function before
calling an Acquire function. When the Acquire starts and the device dialog pops up,
EZTwain will search the dialog for a button with the specified name and simulate the
user clicking that button. If you pass a null string to this function, it looks for a
button with one of the common (English) labels: “Scan”, “Capture”, “Start Scan”,
“Take Picture”, “Scan Now”. Case differences are ignored (‘A’ is the same as ‘a’) as
are the underlined letters in some button labels.
TWAIN_RegisterApp
void TWAIN_RegisterApp (
int nMajorNum, // version numbers are treated as
int nMinorNum, // nMajorNum.nMinorNum
int nLanguage, // language (see TWLG_xxx in TWAIN.H)
int nCountry, // country (see TWCY_xxx in TWAIN.H)
string lpszVer, // version as string e.g. "1.0b3 beta"
string lpszMfg, // vendor e.g. "Zzzzip Software"
string lpszFam, // product family e.g. "Whooshy"
string lpszApp) // specific product e.g. "Whooshy Paint"
This is the long form of TWAIN_SetAppTitle, and need only be used if you know that
some Source needs the additional information. TWAIN_RegisterApp should be called
as one of the first EZTwain calls.
TWAIN_Blocked
int TWAIN_Blocked(void)
TWAIN_UserClosedSource
int TWAIN_UserClosedSource(void)
Return TRUE (1) if during the last acquire the user asked the Source to close. 0
otherwise of course. This flag is cleared each time you start any kind of acquire, and
it is set if EZTwain receives a MSG_CLOSEDSREQ message through TWAIN.
TWAIN_BuildName
char* TWAIN_BuildName(void)
Page 142
EZTwain Pro User Guide
TWAIN_GetBuildName
void TWAIN_GetBuildName(LPSTR psName)
TWAIN_AcquireMemoryCallback
BOOL TWAIN_AcquireMemoryCallback(HWND hwnd, MEMXFERCALLBACK cb, LPVOID
data)
TWAIN_SetCompression / TWAIN_Compression
int TWAIN_Compression(void)
int TWAIN_SetCompression(int compression)
Set/Return compression style for transferred data. See twain.h for TWCP_xxx values
to use with this capability.
The meaning of this capability depends (in theory) on the current transfer mode (see
TWAIN_XferMech) If the transfer mode is File, this capability should reflect the
compression that will be used in the transferred file. If the transfer mode is Memory,
then this is how the incoming buffers of data will be compressed.
TWAIN_SetTiled / TWAIN_Tiled
BOOL TWAIN_Tiled(void)
int TWAIN_SetTiled(BOOL bTiled)
Set/Return whether source does memory xfer via strips or tiles.
bTiled = TRUE if it uses tiles for transfer.
TWAIN_SetPlanarChunky / TWAIN_PlanarChunky
int TWAIN_PlanarChunky(void)
int TWAIN_SetPlanarChunky(int shape)
Set/Return current pixel ‘packing’ for memory transfers. See the TWAIN specification
for details.
TWAIN_SetPixelFlavor / TWAIN_PixelFlavor
int TWAIN_PixelFlavor(void)
int TWAIN_SetPixelFlavor(int flavor)
Page 143
EZTwain Pro User Guide
TWAIN_GetCapCurrent
int TWAIN_GetCapCurrent(unsigned Cap,
unsigned ItemType,
void FAR *pVal)
TWAIN_ToFix32 / TWAIN_ToFix32R
long TWAIN_ToFix32(double d)
Convert a floating-point value to a 32-bit TW_FIX32 value that can be passed to e.g.
TWAIN_SetCapOneValue.
TWAIN_Fix32ToFloat
double TWAIN_Fix32ToFloat(long nfix)
Convert a TW_FIX32 value (as returned from some capability inquiries) to a double
(floating point) value.
TWAIN_MessageHook
int TWAIN_MessageHook(LPMSG lpmsg)
This function detects Windows messages that should be routed to an enabled Source,
and picks them off. In a full TWAIN app, TWAIN_MessageHook is called inside the
main GetMessage loop, whose skeleton code looks like something like this:
Page 144
EZTwain Pro User Guide
MSG msg;
BOOL bGot;
while ((bGot = GetMessage((LPMSG)&msg, NULL, 0, 0)) != 0) {
if (bGot < 0) {
// something weird.
} else if (!TWAIN_MessageHook ((LPMSG)&msg)) {
TranslateMessage ((LPMSG)&msg);
DispatchMessage ((LPMSG)&msg);
}
} // while
TWAIN_WaitForNativeXfer
HANDLE TWAIN_WaitForNativeXfer(HWND hwnd)
TWAIN_IsTransferReady
int TWAIN_IsTransferReady(void)
TWAIN_GetSourceIdentity
int TWAIN_GetSourceIdentity(LPVOID ptwid)
Get a copy of the TW_IDENTITY structure (see twain.h) used inside EZTwain to hold
information about the current / most recently opened Source.
TWAIN_DS
int TWAIN_DS(unsigned long DG, unsigned DAT, unsigned MSG, void
FAR *pData)
TWAIN_DS passes the triplet (DG, DAT, MSG, pData) to the open Source if any.
Returns 1 (TRUE) if the operation is successful, 0 (FALSE) otherwise.
The last result code can be retrieved with TWAIN_GetResultCode(), and the
corresponding condition code can be retrieved with TWAIN_GetConditionCode().
If no source is open this call will fail, result code TWRC_FAILURE, condition code
TWCC_NODS.
This function plus TWAIN_Mgr below give you direct access to the TWAIN API,
although this function does provide two hidden services: It tracks the TWAIN state,
and it traps exceptions inside TWAIN and turns them into failure returns.
TWAIN_Mgr
int TWAIN_Mgr(unsigned long DG, unsigned DAT, unsigned MSG, void
FAR *pData)
If the Source Manager is not open, this call fails setting result code TWRC_FAILURE,
and condition code=TWCC_SEQERROR (triplet out of sequence).
Page 145
EZTwain Pro User Guide
This function with TWAIN_DS above give you direct access to the TWAIN API.
Page 146
EZTwain Pro User Guide
Functions – Deprecated
The following functions are no longer actively supported and are not recommended
for new code. They will be retained as entry points in all future releases of EZTwain
Pro 3. As time permits, you should replace these functions as advised below.
TWAIN_FreeNative
void TWAIN_FreeNative(HANDLE hdib)
DIB_WriteToBmp
int DIB_WriteToBmp(HANDLE hdib, string pszFile)
DIB_WriteToJpeg
int DIB_WriteToJpeg(HANDLE hdib, string pszFile)
DIB_WriteToPng
int DIB_WriteToPng(HANDLE hdib, string pszFile)
DIB_WriteToGif
int DIB_WriteToGif(HANDLE hdib, string pszFile)
DIB_WriteToDcx
int DIB_WriteToDcx(HANDLE hdib, string pszFile)
DIB_WriteToTiff
int DIB_WriteToTiff(HANDLE hdib, string pszFile)
Page 147
EZTwain Pro User Guide
DIB_WriteToPdf
int DIB_WriteToPdf(HANDLE hdib, string pszFile)
TWAIN_AcquireNative (deprecated)
HANDLE TWAIN_AcquireNative(HWND hwndApp, unsigned wPixTypes)
See these functions for more details. Contact Dosadi support if you are uncertain.
Page 148
EZTwain Pro User Guide
Glossary
BMP (BitMaP) File
The standard raster image file format used by Microsoft® Windows. BMP files can
store 1-bit, 4-bit, 8-bit, and 24-bit (per pixel) images, and much less commonly, 16-
bit and 32-bit images. While there is an optional compression for BMP files, it is
rarely used and is particularly unsuitable for continuous tone images. A BMP file is
simply a DIB (q.v.) with a small header stuck in front.
Capability
TWAIN term for a property or setting of a device, that is accessible (‘exposed’) to
TWAIN applications. Every standard capability is given a name and code.
Other capabilities can be read and modified by the application, and can have
complex behavior: For example, ICAP_PIXELTYPE describes the ‘kind of pixels’ the
device can deliver. Most scanners can deliver 1-bit Black & White, Grayscale, or RGB
Color, and will allow the application to specify which it would like, but a webcam may
offer only RGB, and reject an attempt to set any other value.
Container
TWAIN term for a global memory block holding one or more values or data items,
used to represent a capability value i.e. a property or setting of a device.
Page 149
EZTwain Pro User Guide
The job of the DSM is to act as a go-between, coordinating and passing information
between TWAIN applications and TWAIN Sources. Many users and developers
assume that ‘TWAIN’ (meaning the DSM) does some kind of serious processing or
translation during scanning. This is not true. The DSM’s jobs are simple:
1. Find and enumerate the installed Sources, display the Select Source dialog on
request, and remember which DS is currently the default.
2. When an application issues an OPEN request, connect it with a Source.
3. Pass TWAIN operation requests from the application to the open DS, and pass
notifications back to the application from the DS.
All user interface, image processing, error handling, etc. etc. is divided between the
application and the DS.
If there is only one TWAIN device installed in the system, then - that’s it. Otherwise,
it is the last TWAIN device selected by the user in the Select Source dialog. Which is
the only bit of user interface provided by TWAIN itself, so to speak – it is displayed
by the TWAIN Source Manager.
Deskew
Scanning jargon meaning ‘to straighten up’. If you have done much scanning, you
have probably noticed that some documents are scanned at a slight angle, This is
called skew in the imaging industry. Some scanners, and many image software
packages including EZTwain, can straighten out or deskew such tilted scans.
Page 150
EZTwain Pro User Guide
FIX32 or TW_FIX32
A structure defined by TWAIN to represent fractional numeric values. It is a ‘fixed
point’ representation, a signed 32-bit integer with an implied binary point in the
middle - i.e. 16 fractional bits. EZTwain includes various functions for working
directly with FIX32 values, but for the most part EZTwain functions accept and return
double (64-bit floating point) values and convert to FIX32 values internally.
Nobody officially maintains this format, despite its incredibly wide use. The
definition is available for example at:
http://www.w3.org/Graphics/JPEG/jfif3.pdf
If you are seriously interested in JPEG compression, you can start here:
http://old.jpeg.org/public/jpeghomepage.htm
Resolution
In digital imaging and scanning, resolution is how finely a digital image divides up
the physical world, commonly measured in dots per inch (DPI). DPI is commonly
used, even in metric countries i.e. outside the USA. You will sometimes encounter
the term samples as a more highbrow synonym for “dots.”
Page 151
EZTwain Pro User Guide
If an image is “200 DPI” this means the image contains 200 rows per vertical inch,
and 200 columns per horizontal inch. Compared to a 100 DPI image, the 200 DPI
image can distinguish a line or dot that is half as wide. The 200 DPI image also has
4 times as many pixels in it.
Thumbnail
A thumbnail is a small image - typically 32 to 64 pixels high, similar to an icon
except that it is a low-resolution copy of the original that it represents.
Triplet
Specialized TWAIN term: Every communication from an application to TWAIN
consists of a triplet of codes plus a 32-bit datum. The functions TWAIN_DS and
TWAIN_Mgr expose this bottom-level interface to TWAIN. Discussions of the TWAIN
protocol often refer to sending triplets and the response to such-and-such triplet, and
the core of the TWAIN Specification is the list of triplet definitions.
TWAIN
The Technology Without An Interesting Name. Actually TWAIN is not an acronym,
which has caused endless confusion and frustration over the years.
Page 152
EZTwain Pro User Guide
TWAIN Compliance
Compliance with the TWAIN standard is voluntary: TWAIN is not a trademark, and
the TWAIN Working Group does not certify or enforce compliance of products. So,
while it is wonderfully comprehensive and flexible, TWAIN is correspondingly
burdened by its complexity, and a great amount of variation between devices.
Almost every “TWAIN compliant” device can be shown to be non-compliant in some
respect. EZTwain hides as much of this messiness as it can.
TWAIN States
TWAIN defines 7 states of a TWAIN ‘conversation’. Certain operations are only valid
in certain states, and certain state transitions tell the Source, or the application,
when they can get to work. Following are definitions of the 7 TWAIN States, please
see the TWAIN Specification for the final, official word.
Page 153
EZTwain Pro User Guide
Page 154
EZTwain Pro User Guide
Appendix 1 - History
Please refer to the file History.txt, which is installed as part of the EZTwain Pro
toolkit.
3.40
Changes / Corrections:
New:
▪ optional Save As... button in DIB_View/TWAIN_ViewFile dialog.
▪ Appending to PDF files with encryption.
▪ Page range selection in print dialog.
▪ Partial support for images compressed in memory: scanning them, displaying
them, writing them to disk without decompress/recompress.
DIB_IsCompressed, DIB_Compression, TWAIN_AcquireCompressed
Page 155
EZTwain Pro User Guide
3.30
Changes / Corrections:
New:
▪ optional Print... button in DIB_View/TWAIN_ViewFile dialog
DIB_PrintArray , DIB_SetNextPrintJobPageCount
▪ Writing and Reading encrypted (password-protected) PDFs
PDF_SetOpenPassword, PDF_SetUserPassword, PDF_SetOwnerPassword,
PDF_SetPermissions / PDF_GetPermissions
▪ Writing PDF files that comply with PDF/A-1(b) - ISO 19005-1:2005
PDF_SetPDFACompliance / PDF_GetPDFACompliance.
▪ OCR_SetLineBreak
▪ DIB_LoadArrayFromBuffer
DIB_LoadPageFromBuffer
DIB_LoadArrayFromFilename
DIB_LoadPagesFromFilename
DIB_PageCountOfBuffer / DIB_BufferPageCount
DIB_InUseCount
DIB_MeanFilter
DIB_XResolutionInt, DIB_YResolutionInt
▪ UPLOAD_SetProgressCallback
▪ TWAIN_AcquireArray
TWAIN_AcquireImagesToFiles
TWAIN_AcquirePagesToFiles
TWAIN_PromptForOpenFilename
TWAIN_SetLogName
▪ CONTAINER_GetItemFrame
CONTAINER_MinValueInt, CONTAINER_MaxValueInt, CONTAINER_StepSizeInt
CONTAINER_CurrentValueInt, CONTAINER_DefaultValueInt,
CONTAINER_ContainsValueInt, CONTAINER_FindValueInt,
CONTAINER_SetItemInt
Page 156
EZTwain Pro User Guide
3.20
Changes / Corrections:
▪ Recognize Window Vista
▪ Read yet another variant of TIFF – from Kodak xCVS software.
New:
▪ DIB_PrintFile/TWAIN_PrintFile (build 69)
▪ OCR functions – using 3rd party Transym TOCR engine:
OCR_IsAvailable, OCR_Version, OCR_IsEngineAvailable, OCR_SelectEngine,
OCR_SelectDefaultEngine, OCR_SelectedEngine, OCR_EngineName,
OCR_RecognizeDib, OCR_RecognizeDibZone (build 68), OCR_Text,
OCR_GetText, OCR_TextLength, OCR_TextOrientation, OCR_GetCharPositions,
OCR_GetCharSizes. OCR_WritePage, OCR_ClearText, OCR_SetEngineKey
▪ UPLOAD_FilesToURL, UPLOAD_MaxFiles, UPLOAD_AddHeader,
UPLOAD_EnableProgressBar, UPLOAD_IsEnabledProgressBar (build 36)
▪ Functions to write text into PDF files: PDF_DrawText, PDF_SetTextVisible,
PDF_DrawInvisibleText
▪ New aliases for existing functions: PDF_SetTitle, PDF_SetAuthor,
PDF_SetSubject, PDF_SetKeywords, PDF_SetCreator, PDF_SetProducer.
▪ New post-processing mode: TWAIN_SetAutoOCR/TWAIN_GetAutoOCR
▪ TWAIN_FormatVersion (build 11)
▪ DIB_PhysicalWidth, DIB_PhysicalHeight (build 13)
▪ Support for Extended Image Info (build 14)
TWAIN_IsExtendedInfoSupported
TWAIN_EnableExtendedInfo
TWAIN_IsExtendedInfoEnabled
TWAIN_DisableExtendedInfo
TWAIN_ExtendedInfoItemCount
TWAIN_ExtendedInfoItemType
TWAIN_ExtendedInfoInt
TWAIN_ExtendedInfoFloat
TWAIN_GetExtendedInfoString
TWAIN_ExtendedInfoString
TWAIN_GetExtendedInfoFrame
▪ BARCODE_TypeName (build 20)
▪ BARCODE_SetZone, BARCODE_NoZone (build 68)
▪ TWAIN_GetPaperDimensions (build 22)
▪ PDF_SelectPageSize (build 23)
▪ TWAIN_SingleMachineLicense (build 23)
▪ Definition of 'saturation' component changed slightly to give more intuitive
(low) values for dark pixels (build 24)
▪ DIB_Avg (build 24)
▪ All file-writing functions create folders as needed (build 27)
▪ New installer (Inno Setup) with option to install shared DLLs only (build 27)
▪ TWAIN_IsMultipageFileOpen (build 41)
3.10
Changes / Corrections:
▪ Improved behavior of DIB_AutoContrast
▪ DIB_WriteRowChannel - Interpretation of nChannel parameter changed.
Page 157
EZTwain Pro User Guide
▪ Explicit message when license key is delivered too late in program execution.
▪ Functions that return Strings can now be called directly from Visual Basic.
▪ When writing a PDF to a memory buffer, no temp file is created on disk.
New:
▪ UPLOAD_DibToURL, UPLOAD_DibsToURL, UPLOAD_DibsSeparatelyToURL
UPLOAD_Response, UPLOAD_GetResponse, UPLOAD_IsAvailable,
UPLOAD_Version, UPLOAD_AddFormField.
▪ Support for Black Ice barcode recognition engine (build 25)
▪ Support for LeadTools barcode recognition engine (build 28)
▪ BARCODE_ReadableCodes (build 28)
▪ TWAIN_Shutdown
▪ TWAIN_ReportLeaks
▪ DIB_ToImage (as an alias for DibToImage) in VB.NET
▪ DIB_WriteArrayToFilename
▪ DIB_WriteArrayToBuffer
▪ DIB_ReadRowChannel
▪ DIB_Resample
▪ DIB_DrawOnWindow
▪ DIB_DeskewAngle
▪ TWAIN_LogFileName
▪ TWAIN_SetBlankPageMode/TWAIN_GetBlankPageMode
TWAIN_SetBlankPageThreshold/TWAIN_GetBlankPageThreshold
TWAIN_SetAutoCrop/TWAIN_GetAutoCrop
TWAIN_SetAutoContrast/TWAIN_GetAutoContrast
▪ DIB_SetViewOption/TWAIN_SetViewOption
DIB_ViewClose/TWAIN_ViewClose
DIB_IsViewOpen/TWAIN_IsViewOpen
DIB_SetViewImage
▪ TWAIN_GetTiffTagAscii
▪ TWAIN_SetOutputPageCount, and improved TIFF Class F support.
3.09
Changes / Corrections:
▪ Many function parameters and return values that are Boolean (True or False)
are now declared as booleans in languages where this is possible, particularly
Delphi, Clarion, C#, and VB.NET. This may cause compile errors in existing
code but they are easy and local to correct.
▪ DIB_LoadFromFilename, TWAIN_LoadNativeFromFilename, and
DIB_GetFilePageCount all handle EZTwain-generated PDF files.
▪ DIB_Blt now converts source pixels to destination format as needed.
▪ DIB_Blt/DIB_RegionCopy: Several bugs for 1-bit B&W images are corrected.
▪ Statically linkable library EZT3MT.LIB added to toolkit.
▪ PDF files of ~7000 pages can now be written (previous limit was ~1000 pages)
▪ PDF files can be appended to! This is officially supported only for EZTwain-
written PDF files, contact Dosadi Support for other cases.
(See TWAIN_SetFileAppendFlag/TWAIN_GetFileAppendFlag)
▪ Images with x-resolution different from y-resolution (faxes for example) are
now displayed correctly and rendered to thumbnails correctly.
▪ Documentation added for DIB_SimpleThreshold, DIB_SmartThreshold
New:
Page 158
EZTwain Pro User Guide
▪ BARCODE_IsAvailable
BARCODE_Version
BARCODE_Recognize
BARCODE_IsEngineAvailable
BARCODE_SelectEngine
BARCODE_SelectedEngine
BARCODE_SetDirectionFlags
BARCODE_GetDirectionFlags
BARCODE_AvailableDirectionFlags
BARCODE_Text / BARCODE_GetText
BARCODE_Type
BARCODE_GetRect
▪ TWAIN_ExtensionFromFormat
▪ TWAIN_SetAutoDeskew, TWAIN_GetAutoDeskew
▪ TWAIN_LastOutputFile
▪ TWAIN_PagesInFile - same as DIB_GetFilePageCount, just easier to remember.
▪ TWAIN_SetTiffTagShort, TWAIN_SetTiffTagRational,
TWAIN_SetTiffTagRationalArray, TWAIN_SetTiffTagBytes
▪ DIB_AutoDeskew - automatically deskew an image.
▪ DIB_GetCropRect - return the crop rectangle found by the AutoCrop algorithm.
▪ DIB_BitsPerSample, DIB_SamplesPerPixel - more image queries.
▪ DIB_IsVanilla, DIB_IsChocolate - queries about how black & white are coded.
▪ DIB_LoadFromBuffer, DIB_LoadPageFromBuffer, DIB_FormatOfBuffer -
functions that read an image from memory instead of from a disk file.
▪ DIB_WriteToBuffer - save an image into a memory buffer.
▪ DIB_AutoContrast (beta) - automatically adjust contrast of an image.
▪ DIB_Create - create an image of specified pixel type.
▪ DIB_SpecifyPrinter, DIB_EnumeratePrinters, DIB_GetPrinterName
▪ DIB_SetPrintFit/DIB_GetPrintToFit - control scale-to-fit during printing.
3.08
Corrected:
▪ The Trial License would sometimes not initialize, or would expire immediately.
▪ Incorrect declaration of several string-valued functions in .NET languages.
New:
▪ TWAIN_SetCapability, TWAIN_SetCapString - for setting custom capabilities.
▪ TWAIN_SetTiffTagLong, TWAIN_SetTiffTagString, TWAIN_SetTiffTagDouble,
TWAIN_ResetTiffTags - functions for setting specific tag values in TIFF files.
▪ TWAIN_SetPdfTitle, TWAIN_SetPdfAuthor, TWAIN_SetPdfSubject,
TWAIN_SetPdfKeywords, TWAIN_SetPdfCreator, TWAIN_SetPdfProducer -
functions for setting specific summary (DID) fields in PDF files.
▪ TWAIN_SetAutoNegate/TWAIN_GetAutoNegate - control ‘autonegate’ of
excessively black scans.
▪ DIB_Thumbnail - creates a thumbnail of any image in memory.
▪ DIB_FromClipboard, DIB_CanGetFromClipboard - for implementing ‘Paste’.
▪ DIB_ComponentCopy - extract one channel from RGB or CMY(K) image.
▪ DIB_AdjustBC - change brightness and/or contrast of an image.
▪ DIB_ConvertToFormat - more general image format conversion, including
conversions to and from 4-bit grayscale.
Page 159
EZTwain Pro User Guide
3.07
Corrected:
▪ With Visioneer Strobe XP450, 2nd and later pages blank or garbage - FIXED.
▪ CPU usage goes to 100% sometimes on 2nd batch - FIXED.
▪ Orientation tag in TIFF files correctly interpreted.
New:
▪ Clarion binding.
▪ TWAIN_SetLogFolder
▪ TWAIN_OrganizationLicense (allowing embedded In-House App Licenses)
▪ TWAIN_ApplicationLicense
▪ TWAIN_ViewFile
▪ DIB_View
▪ DIB_ScaleToGray, DIB_Posterize, DIB_GetHistogram.
▪ DIB_Convolve, DIB_Correlate, DIB_CrossCorrelate, DIB_MedianFilter.
▪ DIB_Darkness
▪ DIB_PrintJobBegin, DIB_PrintJobEnd, DIB_PrintPage
▪ Streaming buffered memory transfers: TWAIN_BeginAcquireMemory,
TWAIN_AcquireMemoryBlock, TWAIN_EndAcquireMemory.
▪ TWAIN_WaitForImage
▪”.tiff” and “.jpeg” recognized as standard file extensions when saving files.
▪ PDF files now support indexed-color (‘palette color’) images.
▪ PDF and JPEG files now support CMY/CMYK images.
▪ DCX multipage file support - .dcx extension recognized, DIB_WriteToDcx
▪ TWAIN_DoSettingsDialog.
▪ TWAIN_EnableSourceUiOnly
▪ TWAIN_GetCustomDataToFile, TWAIN_SetCustomDataFromFile
▪ TWAIN_SetImageReadyTimeout
▪ TWAIN_IsFileExtensionAvailable, TWAIN_FormatFromExtension
▪ TWAIN_SetGrayResponse, TWAIN_SetColorResponse
▪ TWAIN_ResetGrayResponse, TWAIN_ResetColorResponse
▪ TWAIN_SetCapBool
▪ CONTAINER_StringValue/CONTAINER_GetStringValue
▪ BARCODE_IsAvailable, BARCODE_Recognize, BARCODE_Text,
BARCODE_GetText, BARCODE_Type, BARCODE_GetRect,
BARCODE_SetDirectionFlags, BARCODE_GetDirectionFlags - (BETA) pass-thru
to Axtel barcode engine.
3.06
Corrected:
▪ AcquireToFilename and Acquire were ignoring SetXferMech
▪ Conversion from RGB to 256-color made patches and ‘sprays’ sometimes.
▪ DIB_RegionCopy wasn’t copying DPI information.
▪ Distorted image when scanning native mode grayscale images to JPEG, with
certain scanners
New:
▪ Code Wizard.
▪ Reversed images from some scanners are detected and auto-reversed.
▪ TWAIN_SetRegion, TWAIN_ResetRegion.
▪ TWAIN_SetTiffImageDescription, TWAIN_SetTiffDocumentName.
▪ LZW compression enabled in TIFF files, for reading and writing.
Page 160
EZTwain Pro User Guide
3.05
Corrected:
▪ TWAIN_AcquireMultipageFile had a serious memory leak in the version 3.04!
▪ The C# and VB.NET wrappers have been improved.
(‘StringBuilder’ result parameters were passed incorrectly ByRef.)
▪ Writing high-density images to TIFF could cause “Rows Per Strip” warning.
New:
▪ Individual pages from a multipage TIFF file can now be loaded into memory
using DIB_SelectPageToLoad, DIB_GetFilePageCount, DIB_LoadPage.
▪ Scans and images can now be appended to existing TIFF files, using
TWAIN_SetFileAppendFlag/TWAIN_GetFileAppendFlag
▪ 16-bit grayscale and 48-bit RGB images can be scanned from capable scanners
using TWAIN_AcquireMemory, and the resulting DIB can be saved in TIFF
format at full depth.
▪ C# and VB.NET sample applications are included in the toolkit.
▪ TWAIN_SetPaperSize is much ‘smarter’ and will produce the desired result on
many more scanners.
▪ More detailed error codes are available from TWAIN_LastErrorCode, especially
after a file read or write has failed.
▪ DIB_FormatOfFile/TWAIN_FormatOfFile.
3.04
Configuration change:
▪ EZMultipage.dll has been removed, code folded into EZTwain3.dll – if you were
redistributing this file, please delete it from your distribution.
Corrected:
▪ DIB_DrawText had no effect on some systems.
▪ TIFF files were 'big-endian'.
▪ DIB_ToDibSection and DIB_ToPicture did not free the input DIB.
New:
▪ TWAIN_MultipageCount
▪ DIB_ConvertToPixelType
▪ C# and VB.NET bindings
▪ Perl binding
▪ DIB_DrawText uses anti-aliasing in grayscale and RGB images.
▪ TWAIN_WriteToLog
3.03
3.03 was primarily a ‘tune-up’ release: Reduced need to load EZTiff.dll, better
error diagnosis when there is a licensing error, better logging to the logfile, and
similar internal improvements.
Corrected:
▪ A 'cancel' return from Enabling a device could cause an inappropriate error box.
▪ Some devices return 0 resolution in the transferred image - EZTwain now
obtains the correct resolution using IMAGEINFO.
Page 161
EZTwain Pro User Guide
New:
▪ JPEG compression as an option for TIFF files. Sometimes called JPEG-in-TIFF,
this applies only to continuous-tone images in 8-bit grayscale and 24-bit RGB
or CMYK. See TWAIN_Compression/TWAIN_GetTiffCompression for more
details.
3.02
Corrected:
▪ PDF file scaling issues have been corrected – PDF files are generated at true
physical size if created from images that contain resolution (DPI) information.
▪ Bugs in the following functions: DIB_RegionCopy, DIB_Fill, DIB_Blt,
DIB_ScaledCopy, DIB_DrawText.
New:
▪ DIB_ToPicture and DIB_FromPicture (p. 49), specifically for VB developers.
▪ DIB_ToDibSection and DIB_FromBitmap (p. 47) which helps people working
with the native Windows graphics API, and with Delphi TBitmaps, among
others.
▪ TWAIN_SetTiffStripSize (p. )– Special setting to help achieve TIFF compatibility
with certain persnickity TIFF readers.
▪ TWAIN_SetTiffCompression (p. 95) – To select from the various compression
algorithms available when writing TIFF files.
Page 162
EZTwain Pro User Guide
Containers are the currency of TWAIN settings. TWAIN devices have dozens,
sometimes hundreds of properties that can be queried and set: Is there paper in the
feeder, resolution to use for the next scan, the serial number of the device. TWAIN
calls these properties capabilities, and capability values move back and forth
between application and TWAIN device in packages called containers. TWAIN calls
this exchange capability negotiation.
Because it is necessary for the application and device to communicate not just the
current value of a capability, but also its set of possible values, containers are quite
rich and complex.
Page 163
EZTwain Pro User Guide
A OneValue container holds a single value, like: 200. Commonly used to select a
specific value for a capability, such as 200 DPI for resolution, or to answer a simple
query like CAP_FEEDERLOADED (“is there paper in the feeder”.)
An Enumeration container is a set of values, with two values called out – Current
and Default. When queried with TWAIN_Get, many TWAIN capabilities return an
Enumeration representing the set of valid values, plus the current value and the
default (reset) value.
An Array container holds a list of values, none of which are special. Array containers
are used with capabilities whose values are actually sets - like
CAP_SUPPORTEDCAPS.
All the items in a container are of the same basic item type, chosen from the
following unecessarily baroque set.
TWAIN Container Item Types
Item Type What each item holds
TWTY_INT8 8-bit signed integer (-128..127)
TWTY_INT16 16-bit signed integer (-32768..32767)
TWTY_INT32 32-bit signed integer (go figure)
TWTY_UINT8 8-bit unsigned integer (0..255)
TWTY_UINT16 16-bit unsigned integer (0..65535)
TWTY_UINT32 32-bit unsigned integer (0.. 4294967295)
TWTY_BOOL TRUE (1) or FALSE (0)
TWTY_FIX32 32-bit fractional number about -32767.9999 to 32767.9999
TWTY_FRAME a rectangle defined by 4 TWTY_FIX32 values
TWTY_STR32 32-character ANSI string
TWTY_STR64 64-character ANSI string
TWTY_STR128 128-character ANSI string
TWTY_STR255 255-character ANSI string
TWTY_STR1024 1024-character ANSI string
TWTY_UNI512 512-character UNICODE string
All these appear as defined constants in the EZTwain declaration file for your
programming language. EZTwain tries to hide the details from you, but you should
be aware that underneath, every container has a specific item type, and every
capability has a specific item type that it works with.
Practice
Note: Because these are handles and not ‘objects’, you are responsible for releasing
them when you are done with them, using CONTAINER_Free. The amount of
Page 164
EZTwain Pro User Guide
memory involved is not as large as with images, but it is good practice to avoid
leaks.
Suppose you want to find out what resolutions a device supports. Assume the device
is open from a previous call to TWAIN_OpenSource or TWAIN_OpenDefaultSource, so
the device is in State 4. This is C/C++ code, the comments should help you
translate to other languages:
Page 165
EZTwain Pro User Guide
For simple query/set situations, you may not need to use containers at all - you can
usually use ETwain’s higher-level capability functions.
TWAIN reserves the upper 32,768 capability codes for custom capabilities -
capabilities that are defined by the device vendor for a specific product or product
family. There are only two ways to find out what these capabilities do - Ask the
manufacturer, or experiment - for example, with Twirl.
The Canon DR-2080C has a custom capability code hex 8025 (decimal 32805).
Using Twirl we find that this capability uses type TWTY_INT32, and it returns an
enumeration containing the values 2 and 0. By setting this capability through Twirl
and enabling the device so its dialog pops up, we find that this capability controls the
Page 166
EZTwain Pro User Guide
To read the current value of this capability, you could use code like this:
Page 167
EZTwain Pro User Guide
Example 3. Endorser/Imprinter
Some scanners have an internal printer (called an imprinter or endorser) that can
print something on each scanned page. There is wide variation in when, where, and
what they print - before or after scanning, top, bottom, front, back, strings, serial
numbers, etc. The TWAIN standard draws the following distinction:
“Imprinters are used to print data on documents at the time of scanning, and may be
used for any purpose. Endorsers are more specific in nature, stamping some kind of
proof of scanning on the document.” TWAIN 1.9 p. 9-393
EZTwain does not include any functions specifically for controlling an imprinter or
endorser, so you must roll your own from lower-level functions.
HCONTAINER hcon;
// Get the list of available printer devices:
hcon = TWAIN_Get(CAP_PRINTER);
if (hcon == 0) return; // no printer available
// Enumerate the available printer types:
for (int i = 0; i < CONTAINER_ItemCount(hcon); i++) {
// Look at each entry in the container, the TWAIN spec lists
// the printer types under CAP_PRINTER:
int PrinterType = CONTAINER_IntValue(hcon, i);
} // end for
CONTAINER_Free(hcon);
Here is code to enable the current printer (whatever type it is), and try to tell it to
imprint on each page a string of the form Document-NNN-eztwain, with NNN starting
at 640. Your scanner may not support this mode, of course.
Page 168
EZTwain Pro User Guide
Make all EZTwain calls in one single thread, and if you pass a Window handle to
EZTwain, it must belong to (have been created by) that thread.
1. Once a call is made in thread T that moves the TWAIN State above State 2, all
calls that require a State above State 2 must be made in thread T until the state
drops to State 2 or lower. This includes all calls that change, or can change, the
State, and all calls that set or query scanning capabilities or parameters. This
includes: TWAIN_GetSourceList and TWAIN_(Get)NextSourceName.
2. Any window handle passed as a parameter to an EZTwain call from thread T must
have been created in thread T.
3. DIB_ functions can be called in any thread, as long as they are given a valid DIB
handle. This also applies to:
TWAIN_WriteNativeToFilename, TWAIN_LoadNativeFromFilename
TWAIN_BeginMultipageFile, TWAIN_DibWritePage, TWAIN_EndMultipageFile
TWAIN_MultipageCount
TWAIN_FormatOfFile.
4. CONTAINER_ functions can be called in any thread, as long as they are given a
valid HCONTAINER.
5. Certain EZTwain global-state functions can be called in any thread, but EZTwain
does not protect itself from race conditions. For example:
TWAIN_State
TWAIN_RegisterApp, TWAIN_SetAppTitle
TWAIN_SetApplicationKey, TWAIN_SetVendorKey
TWAIN_ApplicationLicense, TWAIN_OrganizationLicense
TWAIN_SetHideUI / TWAIN_GetHideUI
TWAIN_SetMultiTransfer / TWAIN_GetMultiTransfer
TWAIN_SuppressErrorMessages
TWAIN_IsMultipageAvailable, TWAIN_IsJpegAvailable, etc.
TWAIN_FormatFromExtension
TWAIN_SetFileAppendFlag / TWAIN_GetFileAppendFlag
TWAIN_SetSaveFormat / TWAIN_GetSaveFormat
TWAIN_SetMultipageFormat / TWAIN_GetMultipageFormat
TWAIN_SetJpegQuality / TWAIN_GetJpegQuality
TWAIN_SetTiff* / TWAIN_GetTiff*
TWAIN_EasyVersion
TWAIN_DisableParent / TWAIN_GetDisableParent
Page 169
EZTwain Pro User Guide
EZTwain Datatypes
C/C++ type physical representation
void used as a placeholder to mean ‘nothing’ or ‘no value’
int 32-bit (4-byte) signed word
unsigned 32-bit (4-byte) unsigned word.
double 64-bit (8-byte) IEEE binary floating number
double* (1)
32-bit pointer to a double.
LPSTR 32-bit pointer to 0-terminated string of 8-bit ANSI characters.
char* same as LPSTR
LPCSTR same as LPSTR but pointed-to string cannot be modified.
LPVOID 32-bit pointer, not specified to what.
BYTE* 32-bit pointer to a byte (usually used to point to a buffer of
data.)
LPMSG 32-bit pointer to a Windows MSG structure.
HANDLE unsigned number, used to designate an object.
HWND HANDLE of a window.
HCONTAINER HANDLE to an EZTwain container object.
BOOL 32-bit word either 0 (FALSE) or 1 (TRUE)
HPALETTE HANDLE specifically for a Windows GDI palette.
HDC HANDLE of a Windows GDI Device Context.
HFILE HANDLE of a Windows file, for CreateFile, Write, _lclose, …
Note 1: In EZTwain, parameters declared as double* are used by the called function
to return values. In Visual Basic these would be declared as ByRef parameters. If
your language has the concept of reference parameter, you would translate double*
as a parameter of type double passed by reference.
Page 171
EZTwain Pro User Guide
Index
16-bit grayscale............................31 recommended book.....................70
48-bit color...................................31 symbology (definition)................70
A4 Letter (paper size)...................131 types (symbologies)....................75
A5 (paper size)............................131 BARCODE_AvailableDirectionFlags. . .74
Access............................................. BARCODE_GetDirectionFlags...........74
sample application........................3 BARCODE_GetRect.........................75
access restrictions........................101 BARCODE_GetText.........................75
Acrobat Reader............................101 BARCODE_IsAvailable....................70
ADF.............................................16 BARCODE_IsEngineAvailable...........71
anisotropic images.........................50 BARCODE_NoZone.........................74
anti-aliasing..................................... BARCODE_ReadableCodes.......73, 158
in DIB_DrawText......................161 BARCODE_Recognize......................75
arrays.............................................. BARCODE_SelectedEngine..............71
loading from file.........................91 BARCODE_SelectEngine..................71
loading from memory..................92 BARCODE_SetDirectionFlags...........74
printing.....................................68 BARCODE_SetZone........................74
scanning to................................27 BARCODE_Text..............................75
writing to file.............................86 BARCODE_Type.............................75
writing to memory......................89 BARCODE_TypeName.....................73
auto rotation.................................19 blank pages......................................
auto-numbered filenames...............28 DIB_IsBlank...............................62
auto-OCR mode.............................36 discarding, example....................17
autocontrast..................................... BMP.............................................82
mode........................................35 Borland C++ Builder....................3, 6
autocontrast adjust........................61 brightness........................................
autocrop.......................................... scanning..................................120
autocrop functions......................60 TWAIN_SetBrightness................120
mode........................................35 TWAIN_SetContrast..................120
autodeskew...................................... brightness & contrast.........................
definition...................................60 adjustment of an image...............53
mode........................................35 C#.................................................3
autonegate....................................... sample application........................3
mode........................................36 Canon DR-2080C.........................166
averaging......................................... CAP_PRINTER..............................168
B&W to grayscale........................56 capability negotiation.....26, 119, 126,
pixels in an image.......................62 153, 163
B&W................................................ CCITT Group 4 Fax compression......82
pixel type...........................42, 119 Chocolate (chocolate pixels)..........143
scanning..................................119 Clarion................................3, 6, 160
B4 (paper size)............................131 clipboard......................................65
B5 Letter (paper size)...................131 clipboard functions.........................65
barcode............................................ CMY...............................42, 119, 160
Axtel engine...............................71 CMYK....................................42, 119
Black Ice engine..................73, 158 code 39 barcode............................71
detection in hardware..................39 Code Wizard................................160
direction flags............................74 color table...........43, 45, 64, 119, 150
engines.....................................71 color table........................................
LeadTools engine.................72, 158 optimized..................................56
native (Dosadi) engine...............71 components......................................
recognition................................70 extracting color components........63
Page 173
EZTwain Pro User Guide
Page 174
EZTwain Pro User Guide
DIB_ColorTableR...........................45 DIB_Posterize..............................160
DIB_ComponentCopy.....................63 DIB_Print......................................67
DIB_Compression..........................64 DIB_PrintArray..............................68
DIB_ConvertToFormat.............56, 159 DIB_PrinterName...........................66
DIB_ConvertToPixelType.................56 DIB_PrintFile.................................67
DIB_Convolve..............................160 DIB_PrintJobBegin..................68, 160
DIB_Copy.....................................43 DIB_PrintJobEnd....................68, 160
DIB_Correlate..............................160 DIB_PrintNoPrompt........................67
DIB_Create...................................43 DIB_PrintPage........................68, 160
DIB_CreatePalette.........................64 DIB_PutOnClipboard......................65
DIB_CrossCorrelate......................160 DIB_ReadRow...............................44
DIB_Darkness........................62, 160 DIB_ReadRowChannel....................44
DIB_Depth....................................42 DIB_ReadRowGray.........................44
DIB_DeskewAngle..........................60 DIB_ReadRowRGB.........................44
DIB_DrawLine.................53, 157, 161 DIB_RegionCopy............................57
DIB_DrawOnWindow......................46 DIB_Resample...............................55
DIB_DrawText...............................50 DIB_Rotate180..............................54
DIB_DrawToDC.............................46 DIB_Rotate90...............................54
DIB_EnumeratePrinters..................66 DIB_RowBytes...............................43
DIB_Equal....................................45 DIB_ScaledCopy............................55
DIB_Fill........................................53 DIB_ScaleToGray...................56, 160
DIB_FlipHorizontal.........................53 DIB_SelectPageToLoad...................90
DIB_FlipVertical.............................53 DIB_SetColorCount........................64
DIB_FormatOfBuffer.......................92 DIB_SetColorTableRGB...................45
DIB_Free.................................25, 43 DIB_SetGrayColorTable..................45
DIB_FromBitmap...........................48 DIB_SetPrintToFit..........................66
DIB_FromClipboard................65, 159 DIB_SetResolutionInt.....................43
DIB_FromPicture...........................49 DIB_SetTextAngle..........................51
DIB_GetCropRect...........................60 DIB_SetTextColor..........................51
DIB_GetFilePageCount...................90 DIB_SetTextFace...........................51
DIB_GetFromClipboard...................65 DIB_SetTextFormat........................52
DIB_GetHistogram..................62, 160 DIB_SetTextHeight........................50
DIB_GetPrinterName......................66 DIB_SetViewImage......................110
DIB_GetPrintToFit..........................66 DIB_SetViewOption......................112
DIB_Height...................................42 DIB_SimpleThreshold.....................55
DIB_IsBlank..................................62 DIB_SmartThreshold...............55, 121
DIB_IsCompressed........................64 DIB_SpecifyPrinter.........................66
DIB_IsViewOpen..........................110 DIB_SwapRedBlue.........................64
DIB_LoadArrayFromBuffer..............92 DIB_Thumbnail.............................55
DIB_LoadArrayFromFilename..........91 DIB_ToDibSection..........................48
DIB_LoadFromFilename............90, 91 DIB_ToImage................................48
DIB_LoadPage...............................90 DIB_ToPicture...............................49
DIB_LoadPageFromBuffer...............92 DIB_Unlock...................................64
DIB_LoadPagesFromFilename..........91 DIB_View............................110, 160
DIB_Lock......................................64 DIB_ViewClose............................111
DIB_MedianFilter....................61, 160 DIB_Width....................................42
DIB_Negate..................................53 DIB_WriteArrayToBuffer.................89
DIB_OpenInDC..............................59 DIB_WriteArrayToFilename.............86
DIB_PageCountOfBuffer..................92 DIB_WriteRow...............................44
DIB_PaintMask..............................58 DIB_WriteRowChannel...................44
DIB_PhysicalHeight........................43 DIB_WriteToBmp.........................147
DIB_PhysicalWidth.........................43 DIB_WriteToBuffer.........................89
DIB_PixelType...............................42 DIB_WriteToDcx...................147, 160
Page 175
EZTwain Pro User Guide
DIB_WriteToFilename...............86, 94 PNG........................................151
DIB_WriteToGif............................147 TIFF........................................152
DIB_WriteToJpeg.........................147 File Save dialog.............................86
DIB_WriteToPdf...........................148 File Transfer Mode.........................32
DIB_WriteToPng..........................147 filling with solid color.....................53
DIB_WriteToTiff...........................147 FIX32.........................................151
DIB_XResolution............................42 Flate compression..........................83
DIB_YResolution............................42 flipping an image...........................53
DIBSection.........................47, 48, 59 form field.........................................
DibToImage..................................48 when uploading........................105
digital still camera.........................15 Foxit Reader................................101
displaying an image.....................110 Frames.......................................139
document feeder....................16, 123 frob............................................153
document information dictionary (DID) functions..........................................
................................................98 barcode.....................................70
drawing a line...............................53 capability.................................126
DS.............................................149 clipboard...................................65
DSC................................................. container...................126, 137, 140
see Digital Still Camera...............15 deprecated...............................147
encryption...................................100 extended image info...................39
enumerating..................................... image acquisition........................24
available printers........................66 licensing....................................21
barcode engines.........................70 OCR..........................................77
OCR engines..............................78 PDF specific...............................98
Sources.....................................37 post-processing..........................35
error diffusion...............................56 printing.....................................66
errors.............................................. source (device) selection.............37
reporting..........................113, 145 TIFF..........................................95
suppressing..............................113 tone curves..............................134
Extended Image Information...........39 TWAIN state.............................115
EZCurl.dll................................2, 104 uploading.................................104
EZDcx.dll........................................2 GDI+...........................................47
EZGif.dll.........................................2 GIF..........................................2, 83
EZJpeg.dll......................................2 automatic quantization..............147
EZMultipage.dll............................161 definition.................................151
EZPdf.dll........................................2 Glossary.....................................149
EZPng.dll........................................2 grayscale.........................................
EZSymbol.dll.............................2, 71 converting to..............................56
EZT3MT.LIB................................3, 7 HBITMAP.................................47, 48
EZTiff.dll........................................2 HCONTAINER.......................164, 171
EZTWAIN_Attach.............................7 HDC.............................................48
EZTWAIN_Detach............................7 hidden text...................................99
eztwain.log file............................114 histogram.....................................62
Eztwain3.dll....................................2 History.txt......................................3
fax file..........................................50 how to.............................................
feeder.........................................123 acquire an image........................12
file extension from format...............94 append to TIFF & PDF files...........19
file format from extension...............94 call EZTwain from other languages. 6
file formats...1, 12, 14, 32, 82, 84, 85, check for device on-line...............19
93, 94, 147, 149, 151 choose a file format....................82
BMP........................................149 control a feeder (ADF).................16
JFIF.........................................151 enumerate installed sources.........11
PDF.........................................151 get started with EZTwain...............4
Page 176
EZTwain Pro User Guide
Page 177
EZTwain Pro User Guide
Page 178
EZTwain Pro User Guide
Page 179
EZTwain Pro User Guide
TWAIN_ErrorBox..........................114 TWAIN_HasFeeder.......................123
TWAIN_ExtendedInfoFloat..............40 TWAIN_IsAutoFeedOn..................123
TWAIN_ExtendedInfoInt.................40 TWAIN_IsAvailable.........................33
TWAIN_ExtendedInfoItemCount......40 TWAIN_IsDcxAvailable...................93
TWAIN_ExtendedInfoItemType........40 TWAIN_IsDuplexEnabled...............124
TWAIN_ExtendedInfoString.............41 TWAIN_IsExtendedInfoEnable.........39
TWAIN_ExtensionFromFormat.........94 TWAIN_IsExtendedInfoSupported....39
TWAIN_FormatFromExtension. .94, 160 TWAIN_IsFeederLoaded................123
TWAIN_FormatOfFile......................90 TWAIN_IsFeederSelected..............123
TWAIN_FormatVersion...................93 TWAIN_IsFileExtensionAvailable.....93,
TWAIN_Get..........................126, 165 160
TWAIN_GetAutoContrast.................35 TWAIN_IsFormatAvailable...............93
TWAIN_GetAutoCrop......................35 TWAIN_IsGifAvailable.....................93
TWAIN_GetAutoDeskew..................35 TWAIN_IsJpegAvailable..................93
TWAIN_GetAutoNegate...................36 TWAIN_IsMultipageFileOpen...........87
TWAIN_GetAutoOCR......................36 TWAIN_IsPdfAvailable....................93
TWAIN_GetBitDepth.....................119 TWAIN_IsPngAvailable...................93
TWAIN_GetBlankPageMode.............35 TWAIN_IsTiffAvailable....................93
TWAIN_GetBlankPageThreshold.......36 TWAIN_IsTransferReady...............145
TWAIN_GetBuildName..................143 TWAIN_IsViewOpen......................110
TWAIN_GetCapBool..............126, 135 TWAIN_LastErrorCode..................113
TWAIN_GetCapCurrent.................144 TWAIN_LastErrorText...................113
TWAIN_GetCapUint16...................127 TWAIN_LastOutputFile....................94
TWAIN_GetConditionCode.............114 TWAIN_LoadFromFilename.............90
TWAIN_GetCurrent...............126, 165 TWAIN_LoadNativeFromFilename.....90
TWAIN_GetCurrentResolution........119 TWAIN_LoadSourceManager..........115
TWAIN_GetCurrentThreshold.........121 TWAIN_LogFile............................114
TWAIN_GetCurrentUnits........118, 129 TWAIN_MessageHook............144, 145
TWAIN_GetCustomDataToFile 136, 160 TWAIN_Mgr.................................152
TWAIN_GetDefault.......................126 TWAIN_MultipageCount.....26, 88, 161
TWAIN_GetDefaultImageLayout.....129 TWAIN_NegotiatePixelTypes..........125
TWAIN_GetDefaultSourceName.......37 TWAIN_NextSourceName................37
TWAIN_GetDuplexSupport............124 TWAIN_OpenDefaultSource......25, 115
TWAIN_GetExtendedInfoFrame........41 TWAIN_OpenSource.....................116
TWAIN_GetExtendedInfoString........40 TWAIN_OpenSourceManager.........115
TWAIN_GetFileAppendFlag..............85 TWAIN_OrganizationLicense. . . .22, 160
TWAIN_GetHideUI.........................33 TWAIN_PagesInFile........................90
TWAIN_GetImageLayout...............129 TWAIN_PixelFlavor.......................143
TWAIN_GetJpegQuality...................85 TWAIN_PlanarChunky...................143
TWAIN_GetLastErrorText..............113 TWAIN_PrintFile............................67
TWAIN_GetMultipageFormat...........34 TWAIN_ReportLastError................113
TWAIN_GetMultiTransfer.................33 TWAIN_Reset..............................126
TWAIN_GetNextSourceName...........37 TWAIN_ResetColorResponse...134, 160
TWAIN_GetPaperDimensions.........133 TWAIN_ResetGrayResponse. . .134, 160
TWAIN_GetPixelType....................118 TWAIN_ResetImageLayout............129
TWAIN_GetResultCode.................113 TWAIN_ResetRegion.............128, 160
TWAIN_GetSaveFormat..................94 TWAIN_ResetTiffTags..............96, 159
TWAIN_GetSourceIdentity.............145 TWAIN_SelectFeeder....................123
TWAIN_GetSourceName.................38 TWAIN_SelectImageSource.............37
TWAIN_GetTiffCompression.............95 TWAIN_SelfTest...........................141
TWAIN_GetTiffStripSize..................95 TWAIN_Set..........................126, 165
TWAIN_GetTiffTagAscii...................97 TWAIN_SetApplicationKey...............21
TWAIN_GetYResolution.................119 TWAIN_SetAppTitle........................21
Page 180
EZTwain Pro User Guide
TWAIN_SetAutoBright..................122 TWAIN_SetTiffTagRationalArray.......96
TWAIN_SetAutoContrast.................35 TWAIN_SetTiffTagShort..................96
TWAIN_SetAutoCrop......................35 TWAIN_SetTiffTagString..........96, 159
TWAIN_SetAutoDeskew..................35 TWAIN_SetTiled...........................143
TWAIN_SetAutoFeed....................123 TWAIN_SetUnits...................118, 129
TWAIN_SetAutoNegate...................36 TWAIN_SetVendorKey....................21
TWAIN_SetAutoOCR.......................36 TWAIN_SetViewOption..................112
TWAIN_SetAutoScan....................123 TWAIN_SetXferCount...................118
TWAIN_SetBitDepth.....................119 TWAIN_SetXResolution.................120
TWAIN_SetBlankPageMode.............35 TWAIN_SetYResolution.................120
TWAIN_SetBlankPageThreshold.......36 TWAIN_SingleMachineLicense.........23
TWAIN_SetCapability.....127, 159, 167 TWAIN_SourceName......................38
TWAIN_SetCapBool...............127, 160 TWAIN_State.......................115, 116
TWAIN_SetCapFix32R...................127 TWAIN_SupportsFileXfer...............125
TWAIN_SetCapOneValue...............127 TWAIN_SuppressErrorMessages.....113
TWAIN_SetColorResponse......134, 160 TWAIN_TiffTagAscii........................97
TWAIN_SetCompression...............143 TWAIN_Tiled...............................143
TWAIN_SetCurrentPixelType..........119 TWAIN_ToFix32R.........................144
TWAIN_SetCustomDataFromFile. . .136, TWAIN_UnloadSourceManager.......116
160 TWAIN_UserClosedSource.............142
TWAIN_SetFileAppendFlag..............85 TWAIN_ViewClose........................111
TWAIN_SetFrame.................130, 131 TWAIN_ViewFile...................110, 160
TWAIN_SetGamma......................122 TWAIN_WaitForNativeXfer.............145
TWAIN_SetGrayResponse......134, 160 TWAIN_WriteToFilename................86
TWAIN_SetHideUI..........................33 TWAIN_WriteToLog...............114, 161
TWAIN_SetHighlight.....................122 TWAIN_XferMech.........................125
TWAIN_SetImageLayout........129, 131 TWEI_ constants............................39
TWAIN_SetImageReadyTimeout.....160 TWFF_BMP....................................84
TWAIN_SetIndicators...................125 TWFF_DCX....................................84
TWAIN_SetJpegQuality...................85 TWFF_GIF.....................................84
TWAIN_SetLightPath....................122 TWFF_JFIF....................................84
TWAIN_SetLogFolder.............114, 160 TWFF_PDF....................................84
TWAIN_SetMultipageFormat............34 TWFF_PNG....................................84
TWAIN_SetMultiTransfer.................33 TWFF_TIFF....................................84
TWAIN_SetOutputPageCount...........88 Twirl TWAIN Probe............3, 163, 166
TWAIN_SetPaperSize....................131 TWPT_CMY....................................42
TWAIN_SetPixelFlavor..................143 TWPT_CMYK..................................42
TWAIN_SetPlanarChunky..............143 TWPT_GRAY..................................42
TWAIN_SetRegion.................128, 160 TWPT_PALETTE........................42, 56
TWAIN_SetResolution...................120 TWPT_RGB....................................42
TWAIN_SetResolutionInt...............120 unit of measure.....118, 119, 120, 129
TWAIN_SetSaveFormat..................94 units..........................................118
TWAIN_SetShadow......................122 Universal Redistribution License...9, 21
TWAIN_SetThreshold....................121 UPLOAD_AddFormField. .105, 107, 158
TWAIN_SetTiffCompression.............85 UPLOAD_AddHeader.....................109
TWAIN_SetTiffDocumentName. 95, 160 UPLOAD_ClearResponse................108
TWAIN_SetTiffImageDescription.....95, UPLOAD_DibsSeparatelyToURL......106
160 UPLOAD_EnableProgressBar..........109
TWAIN_SetTiffStripSize..................95 UPLOAD_FilesToURL.....................106
TWAIN_SetTiffTagBytes..................96 UPLOAD_GetResponse..................108
TWAIN_SetTiffTagDouble.........96, 159 UPLOAD_IsAvailable.....................104
TWAIN_SetTiffTagLong............96, 159 UPLOAD_IsEnabledProgressBar......109
TWAIN_SetTiffTagRational..............96 UPLOAD_MaxFiles........................104
Page 181
EZTwain Pro User Guide
Page 182