无法读取通过 ADF 扫描的第二页

Posted

技术标签:

【中文标题】无法读取通过 ADF 扫描的第二页【英文标题】:Cannot read second page scanned via ADF 【发布时间】:2015-02-12 21:43:52 【问题描述】:

我有一台 Brother 多功能网络打印机/扫描仪/传真机(型号 MFC-9140CDN)。我正在尝试将以下代码与 WIA 一起使用,以检索使用文档进纸器扫描的项目:

const int FEEDER = 1;

var manager=new DeviceManager();
var deviceInfo=manager.DeviceInfos.Cast<DeviceInfo>().First();
var device=deviceInfo.Connect();
device.Properties["Pages"].set_Value(1);
device.Properties["Document Handling Select"].set_Value(1);

var morePages=true;
var counter=0;
while (morePages) 
    counter++;
    var item=device.Items[1];
    item.Properties["Bits Per Pixel"].set_Value(1);
    item.Properties["Horizontal Resolution"].set_Value(300);
    item.Properties["Vertical Resolution"].set_Value(300);

    var img=(WIA.ImageFile)item.Transfer();
    var path=String.Format(@"C:\Users\user1\Documents\test_0.tiff",counter);
    img.SaveFile(path);

    var status=(int)device.Properties["Document Handling Status"].get_Value();
    morePages = (status & FEEDER) > 0;

当第一次到达Transfer 方法时,所有页面都通过文档进纸器。第一个页面使用 img.SaveFile 保存到传入的路径,但所有后续页面都不可用 - device.Items.Count 为 1,尝试 device.Items[2] 会引发异常。

在下一次迭代中,调用 Transfer 会引发异常 - 可以理解,因为 feeder 中现在没有页面。

如何获取后续扫描到feeder的图片?

(注意,遍历所有设备属性,还有一个 ID 为 38922 的附加未命名属性。我无法找到对此属性的任何引用。)

更新

我在设备上找不到与WIA_IPS_SCAN_AHEAD 或WIA_DPS_SCAN_AHEAD_PAGES 对应的属性,但这是有道理的,因为根据文档,此属性是可选的。

我尝试使用 TWAIN(通过我强烈推荐的 NTwain 库)遇到同样的问题。

【问题讨论】:

纯猜测:TIFF 支持多页,第二页是否可以包含在单个文件中?也许用 Irfanview 看看。此外,如果这是 C#,通常 1 是 .Items[0] 而 2 是 .Items[1]。 @WhoIsRich (1) 附加页面不包含在 TIFF 文件中。这也是不可能的,因为在扫描仪完成扫描下一页之前,控制权会返回到下一行代码。 (2) 第一项是Items[0] 是.NET 约定,而不是C# 约定——在VB.NET 中我还必须写Dim l As New List(Of Integer): Dim firstInt = l(0)。出于某种原因,WIA 有第一项的替代约定是.Items[1] 【参考方案1】:

我最近在使用 HP MFC 时遇到了类似的错误。

似乎驱动程序正在更改属性。我正在开发的软件的前任开发人员每次都在 for 循环中不断重新初始化驱动程序。

在我的情况下,属性是“媒体类型”设置为 FLATBED (0x02),即使我正在执行多页扫描并且需要将其设置为 NEXT_PAGE (0x80)。

我发现这一点的方法是在我扫描之前存储每个属性(设备和项目属性)并在扫描第一页之后再次存储。然后,我让我的应用程序打印出所有已更改的属性并能够识别我的问题。

【讨论】:

您在什么时候重置了Media Type?在致电Transfer 之后就为时已晚,因为其余页面已经开始通过进纸器。 @ZevSpitz 在我的例子中和上面的例子中,传输只设置为通过进纸器一次拉入 1 页。因此,我在循环中对 Transfer 的后续调用之间重置了标志 显然,我的问题有所不同——当我运行Transfer时,上面的代码所有页面通过文档进纸器,而不仅仅是一个。 在某些扫描仪中还有一个设置,有些则忽略它:-( WIA 本身很好,但它在某些 OEM 驱动程序中的实现不完整【参考方案2】:

这是一个网络扫描仪,我使用的是 WSD 驱动程序。

一旦我安装了制造商的驱动程序,行为就像预期的那样——一页通过 ADF,然后控制权返回给程序。

(即使是现在,当我使用WIA的CommonDialog.ShowSelectDevice方法时,扫描仪也可用两次,一次使用Windows驱动程序,一次使用Brother驱动程序;当我选择WSD驱动程序时,我仍然看到问题。)

【讨论】:

这也解决了 Brother DCP-L2540DN 的相同问题。可能是 WSD 驱动程序的常见问题。 解决了我的问题!我的设备是 HP Color LaserJet Pro MFP M478-M479 系列【参考方案3】:

这个错误确实花了我几个小时...... 非常感谢 Zev。

我还在对话框中显示了两个扫描仪,用于物理上的一台机器。一个司机只扫描第一页,然后清空进纸器,没有任何拦截的机会。另一个按预期工作。

顺便说一句:不需要为每一页初始化扫描仪。我在 Transfer() 循环之前调用我的例程进行初始化。工作得很好。

我遇到的另一个问题是首先初始化页面大小,然后是进纸器。因此,如果您没有让它工作,请尝试切换您更改 WIA 驱动程序属性的顺序。如 MSDN 中所述,某些属性也会影响其他属性,可能会重置您的更改。

非常感谢 ZEV SPITZ 在 2015 年 8 月 9 日的回答。

【讨论】:

【参考方案4】:

您应该在“while”循环中实例化和设置设备。见:

const int FEEDER = 1;

var morePages=true;
var counter=0;
while (morePages) 
    counter++;

    var manager=new DeviceManager();
    var deviceInfo=manager.DeviceInfos.Cast<DeviceInfo>().First();
    var device=deviceInfo.Connect();

    //device.Properties["Pages"].set_Value(1);
    device.Properties["Document Handling Select"].set_Value(1);

    var item=device.Items[1];
    item.Properties["Bits Per Pixel"].set_Value(1);
    item.Properties["Horizontal Resolution"].set_Value(300);
    item.Properties["Vertical Resolution"].set_Value(300);

    var img=(WIA.ImageFile)item.Transfer();
    var path=String.Format(@"C:\Users\user1\Documents\test_0.tiff",counter);
    img.SaveFile(path);

    var status=(int)device.Properties["Document Handling Status"].get_Value();
    morePages = (status & FEEDER) > 0;

我在这个免费项目中得到了这个结果,我相信它也可以帮助你:adfwia.codeplex.com

【讨论】:

我在尝试使用 adfwia 时遇到了同样的问题。 您为什么认为这会有所作为?

以上是关于无法读取通过 ADF 扫描的第二页的主要内容,如果未能解决你的问题,请参考以下文章

通过选择复选框删除记录在 Jquery 数据表的第一页上工作正常,但在第二页上不行

无法通过界面生成器将条形按钮添加到第二页

在 RShiny 的数据表的第二页中禁用 selectizeInput

jquery函数在表的第二页上不起作用[重复]

在访问报告的第二列打印第二页

如何通过单击主页中的按钮将数据从第二页传输到第三页