tags:

views:

729

answers:

3

I am playing with the code from http://www.codeproject.com/KB/dotnet/twaindotnet.aspx

I am having a problem because twain returns control only after all documents in feeder are scanned. This leads to high memory usage if I scan 20 or more documents.

I thought of scanning just one document at a time from the feeder and saving the image and calling the api again in a loop.

I am setting cap_xfercount to 1 but this does not seem to help:

    TwCapability cap = new TwCapability(TwCap.XferCount, 1);
    rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap);

What do I need to do to scan just one document from the feeder? Any suggestions appreciated.

A: 
Filmund
Yes, I did and it tries to scan from flatbed
Deepak
How about the CAP_AUTOFEED?
Filmund
I can't seem to turn caP-autofeed off, maybe this capability is not supported by the scanner?I tried cap = new TwCapability(TwCap.CAP_AUTOFEED, 0); rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap);rc contains 'failure'
Deepak
Hmm. There are a lot of capabilities to try. CAP_AUTOSCAN = false could do it. If that doesn't work I'm afraid I'm fresh out of ideas.
Filmund
A: 

The order of the cababilities is important, see this doc www.twain.org/docs/CapOrderForWeb.

EDIT:

These are some code fragments from a solution

Setup the auto feed

capFeederEnabled = _twEntities.GetCapability(TwCap.FeederEnabled, (short)1); TwRC rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, capFeederEnabled);

TwCapability cap = _twEntities.GetCapability(TwCap.XferCount, 1); rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap);

and then when the when the Twain Window Message is sent

rc = DSixfer(_applicationId, _sourceId, TwDG.Image, TwDAT.ImageNativeXfer, TwMSG.Get, ref hbitmap);

rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.EndXfer, pxfr);

finally reset the scanner for the next document

rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.Reset, pxfr);

BeerHugger
+1  A: 

I'm sorry that I'm not familiar with the twaindotnet project, but I do have a lot of experience with document scanning through TWAIN.

First a note: Not all document feeders can feed in single-page mode; some important scanner families always scan everything in the feeder once started. And, quite a few TWAIN drivers won't honor XFERCOUNT=1, no matter what the standard says.

If you try to solve the problem by forcing the scanner to scan "one page jobs", you will be limited to the (indeterminate) set of scanners that happen to support that. The TWAIN standard just doesn't require this feature. (But yes - CAP_AUTOSCAN=FALSE and XFERCOUNT=1 would be the combo to try.)

There is a better solution (time & patience permitting) - It sounds like what you want to do is process and dispose of each image as it arrives, instead of collecting them all in memory. Figure out how to get your TWAIN library to hand you each image (or write it to a file) as it arrives instead of stacking them up in memory, and you'll have a solution that works with all document-feeding scanners. And it will scan quite a bit faster with most scanners, too...

Spike0xff