Twain 问题:是不是可以仅从进纸器扫描一份文档?

Posted

技术标签:

【中文标题】Twain 问题:是不是可以仅从进纸器扫描一份文档?【英文标题】:Twain question: is it possible to scan just one document from feeder?Twain 问题:是否可以仅从进纸器扫描一份文档? 【发布时间】:2010-11-18 14:57:09 【问题描述】:

我在玩http://www.codeproject.com/KB/dotnet/twaindotnet.aspx的代码

我遇到了问题,因为 twain 仅在扫描进纸器中的所有文档后才返回控制权。如果我扫描 20 个或更多文档,这会导致高内存使用。

我想从进纸器一次只扫描一个文档并保存图像并在循环中再次调用 api。

我将 cap_xfercount 设置为 1,但这似乎没有帮助:

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

我需要怎么做才能从进纸器中只扫描一份文档? 任何建议表示赞赏。

【问题讨论】:

您也应该查看code.google.com/p/twaindotnet;它基于 codeproject 代码。 【参考方案1】:

很抱歉,我不熟悉 twaindotnet 项目,但我确实有很多通过 TWAIN 扫描文档的经验。

首先说明:并非所有文档进纸器都可以单页模式进纸;一旦启动,一些重要的扫描仪系列总是会扫描进纸器中的所有内容。而且,无论标准如何规定,很多 TWAIN 驱动程序都不会遵守 XFERCOUNT=1。

如果您试图通过强制扫描仪扫描“单页作业”来解决问题,您将受限于恰好支持该功能的(不确定的)一组扫描仪。 TWAIN 标准只是不需要此功能。 (但是是的 - CAP_AUTOSCAN=FALSE 和 XFERCOUNT=1 将是可以尝试的组合。)

有一个更好的解决方案(时间和耐心允许) - 听起来您想要做的是在每个图像到达时对其进行处理和处置,而不是将它们全部收集在内存中。弄清楚如何让您的 TWAIN 库在每个图像到达时将其交给您(或将其写入文件),而不是将它们堆叠在内存中,您将拥有一个适用于所有文档馈送扫描仪的解决方案。大多数扫描仪的扫描速度也会更快......

【讨论】:

【参考方案2】:

这是一个馈线问题。您是否尝试过将启用馈线的功能设置为 false?

编辑:

看起来 CAP_AUTOFEED 是要走的路。根据TWAIN 2.0 specification:

CAP_AUTOFEED 描述 如果为 TRUE,则在从每页获取协商的捕获帧数后,源将自动从文档进纸器送入下一页。 CAP_FEEDERENABLED 必须为 TRUE 才能使用此功能。 应用 将功能设置为 TRUE 以启用源的自动馈送过程,或 FALSE 以禁用它。 每次传输完成后,检查 TW_PENDINGXFERS。计数以确定是否 源有更多图像要传输。 A -1 表示有更多图像要传输,但确切的 数量未知。 CAP_FEEDERLOADED 指示 Source 的 feeder 是否已加载。 (自动进给 只要此能力为 TRUE,过程就会继续。)

【讨论】:

是的,我做到了,它会尝试从平板扫描 我似乎无法关闭 caP-autofeed,也许扫描仪不支持此功能?我试过 cap = new TwCapability(TwCap.CAP_AUTOFEED, 0); rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap); rc 包含“失败” 嗯。有很多功能可以尝试。 CAP_AUTOSCAN = false 可以做到。如果那行不通,恐怕我还没有新的想法。【参考方案3】:

电缆的顺序很重要,请参阅此文档www.twain.org/docs/CapOrderForWeb。

编辑:

这些是解决方案中的一些代码片段

设置自动进纸

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);

然后当发送吐温窗口消息时

rc = DSixfer(_applicationId, _sourceId, TwDG.Image, TwDAT.ImageNativeXfer, TwMSG.Get, ref hbitmap);
rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.EndXfer, pxfr);

最后为下一个文档重置扫描仪

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

【讨论】:

以上是关于Twain 问题:是不是可以仅从进纸器扫描一份文档?的主要内容,如果未能解决你的问题,请参考以下文章

如何从文档进纸器异步扫描和传输图像

使用 WIA 或 TWAIN 扫描页面

使用文档进纸器的 WIA 双面扫描

带有自动文档进纸器 (ADF) 的 C# WIA 在某些扫描仪上仅重新调整一页

使用 WIA 自动进纸器扫描仪扫描第二页失败

通过进纸器进行 WIA 扫描