使用 WIA 2.0 和 C# 扫描多页时跳过的页面

Posted

技术标签:

【中文标题】使用 WIA 2.0 和 C# 扫描多页时跳过的页面【英文标题】:Pages skipped when scanning multiple pages using WIA 2.0 and C# 【发布时间】:2018-08-06 09:36:15 【问题描述】:

我有一个 .NET 应用程序,它从文档进纸器扫描图像,但扫描时页面被跳过。

我目前使用的扫描仪是东芝 e-STUDIO2550C 系列,通过 LAN 连接到我的 PC。我在 Windows 10 64 位上使用 .NET 4.6.1。该问题也出现在另一台运行 Windows Server 2012 R2 的计算机上。我的代码如下:

public const int WIA_DPS_DOCUMENT_HANDLING_SELECT = 3088;
public const int FEEDER = 1;
public const uint WIA_ERROR_PAPER_EMPTY = 0x80210003;

private static void SetProperty(this IProperties properties, int id, object value)

    var property = properties.Cast<Property>().FirstOrDefault(p => p.PropertyID == id);
    property.set_Value(ref value);


private static void Scan(string deviceId)

    var deviceManager = new DeviceManager();
    var deviceInfo = deviceManager.DeviceInfos.Cast<DeviceInfo>().Single(d => d.DeviceID == deviceId);
    var device = deviceInfo.Connect();
    device.Properties.SetProperty(WIA_DPS_DOCUMENT_HANDLING_SELECT, FEEDER);
    var scannerItem = device.Items[1];
    var page = 1;
    do
    
        try
        
            // When calling Transfer the two paper are fed in the ADF but only one image is retuned
            var image = (ImageFile)scannerItem.Transfer(FormatID.wiaFormatJPEG);
            image.SaveFile($"imagepage.jpg");
            page++;
        
        catch (COMException ex)
        
            if ((uint)ex.HResult != WIA_ERROR_PAPER_EMPTY)
                break;
            throw;
        
    
    while (true);

调用scannerItem.Transfer 方法时,扫描仪进纸器将扫描2 个文档,但只返回一个图像项。然后循环继续,有一个暂停,然后当再次调用scannerItem.Transfer 时,进纸器又扫描了2 页,但再次只返回一个图像。因此,如果我放置 10 页要扫描,则只保存第 1、3、5、7 和 9 页。其他第 2、4、6、8 和 10 页被送入自动进纸器,但不保存。

当我尝试在同一台计算机和同一台扫描仪上使用“Windows 传真和扫描”应用程序时,进纸器会非常快速地扫描所有 10 页,然后传输它们需要时间,但它们都被保存了。所以我认为这不是扫描仪本身或驱动程序的问题。

我的代码在 ASP.NET 应用程序中运行,因此我无法使用显示对话框或 UI 的方法。但是,我尝试了使用 CommonDialog.ShowAquireImage 和 CommonDialog.ShowTransfer 的控制台应用程序,但得到了相同的结果。

32 位和 64 位版本的 .NET Runtime 和 WIA 2.0 也会出现此问题。

【问题讨论】:

您找到解决方案了吗?我有同样的问题 不,我没有找到任何解决方案。 【参考方案1】:

看这里。这位作者似乎找到了一个可行的解决方案。我还没有尝试过,但是有一个项目我可能很快就会使用它。 https://archive.codeplex.com/?p=adfwia

private void button2_Click(object sender, EventArgs e)

    ADFScan  scanner = new ADFScan();
    scanner.Scanning += new EventHandler<WiaImageEventArgs>(_scanner_Scanning);
    scanner.ScanComplete += new EventHandler(_scanner_ScanComplete);
    ScanColor selectedColor = ScanColor.BlackWhite;
    int dpi = 300;//some scanners have a problem if you set a lower DPI
    scanner.BeginScan(selectedColor,dpi );
    //ADFScan will now raise a Scanning event for EACH document scanned.
    //then scan complete once there are no more documents to scan.

void _scanner_ScanComplete(object sender, EventArgs e)

    MessageBox.Show("Scan Complete");

void _scanner_Scanning(object sender, WiaImageEventArgs e)
//e.ScannedImage is a System.Drawing.Image
    e.ScannedImage.Save(filename, ImageFormat.Jpeg);//FILES ARE RETURNED AS BITMAPS

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。

以上是关于使用 WIA 2.0 和 C# 扫描多页时跳过的页面的主要内容,如果未能解决你的问题,请参考以下文章

WIA 2.0 复式属性

WIA 2.0 双面扫描

在 WIA 2.0 中扫描时设置页面大小

使用 C# 和 WIA 进行扫描

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

WIA + 带有 adf = 1 页的网络扫描仪