无法读取通过 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 数据表的第一页上工作正常,但在第二页上不行