【问题标题】: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);

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

【问题讨论】:

标签: c# twain


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 2011-06-21
      • 2018-03-09
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 2020-02-11
      • 2011-05-26
      • 2012-03-05
      相关资源
      最近更新 更多