2014-12-14 20 views
5

Possiedo una stampante/scanner/fax di rete/fax multifunzione Brother (modello MFC-9140CDN). Sto cercando di utilizzare il seguente codice con WIA, per recuperare elementi acquisiti con l'alimentatore di documenti:Impossibile leggere la seconda pagina scansionata tramite ADF

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

Quando il metodo Transfer viene raggiunto per la prima volta, tutte le pagine attraverso l'alimentatore documenti. La prima pagina viene salvata con img.SaveFile nel percorso passato, ma tutte le pagine successive non sono disponibili - device.Items.Count è 1 e il tentativo di device.Items[2] genera un'eccezione.

Nella successiva iterazione, chiamare Transfer genera un'eccezione, comprensibilmente, perché ora non ci sono pagine nell'alimentatore.

Come posso ottenere le immagini successive che sono state scansionate nell'alimentatore?

(NB iterazione attraverso tutte le proprietà del dispositivo, v'è una proprietà senza nome supplementare con l'id di 38922. Non sono stato in grado di trovare alcun riferimento a questa proprietà.)

Aggiornamento

Non sono riuscito a trovare una proprietà sul dispositivo corrispondente a WIA_IPS_SCAN_AHEAD o WIA_DPS_SCAN_AHEAD_PAGES, ma ciò ha senso poiché questa proprietà è facoltativa in base alla documentazione.

Ho provato a utilizzare TWAIN (tramite la libreria NTwain, che consiglio vivamente) con lo stesso problema.

+0

Speculazione pura: il TIFF supporta più pagine, la seconda pagina potrebbe essere contenuta in quel singolo file? Magari dai un'occhiata con Irfanview. Anche se questo è normalmente C# 1 è .Items [0] e 2 è .Items [1]. – WhoIsRich

+0

@WhoIsRich (1) Le pagine aggiuntive non sono contenute nel file TIFF. Anche questa è impossibile, poiché il controllo viene restituito alla riga successiva del codice prima che lo scanner abbia terminato la scansione delle pagine successive. (2) Il primo elemento è 'Items [0]' è una convenzione .NET, non una convenzione C# - in VB.NET Devo anche scrivere 'Dim l As New List (Of Integer): Dim firstInt = l (0) '. WIA per qualche motivo ha la convenzione alternativa del primo elemento che è '.Items [1]'. –

risposta

1

Questo è uno scanner di rete e stavo usando il driver WSD.

Una volta installato il driver del produttore, il comportamento è come previsto: una pagina passa attraverso l'ADF, dopodiché il controllo viene restituito al programma.

(Anche ora, quando utilizzo il metodo CommonDialog.ShowSelectDevice di WIA, lo scanner è disponibile due volte, una volta utilizzando il driver di Windows e una volta utilizzando il driver Brother, quando scelgo il driver WSD, vedo ancora il problema.)

+0

Questo ha risolto anche gli stessi problemi con un Brother DCP-L2540DN. Potrebbe essere un problema comune con i driver WSD. – Tobias81

-1

È necessario creare un'istanza e impostare il dispositivo all'interno del ciclo "while". Vedere:

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

ho ottenuto questo guardare in questo progetto libero, che credo sia in grado di aiutare anche voi: adfwia.codeplex.com

+0

Ho lo stesso problema durante il tentativo di utilizzare adfwia. –

+0

Perché hai pensato che questo avrebbe fatto la differenza? –

1

Ho avuto di recente un errore simile con un HP MFC.

Sembra che una proprietà è stata modificata dal conducente. Il precedente sviluppatore del software su cui sto lavorando ha continuato a reinitalizzare il driver ogni volta nel ciclo for.

Nel mio caso la proprietà era "Media Type" impostato su FLATBED (0x02) anche se stavo facendo una scansione su più pagine e avevo bisogno che fosse NEXT_PAGE (0x80).

Il modo in cui ho trovato questo era memorizzando tutte le proprietà prima dello scanner (sia delle proprietà del dispositivo e dell'oggetto) e di nuovo dopo la scansione della prima pagina. Poi ho fatto stampare la mia applicazione su tutte le proprietà che erano cambiate e ho potuto identificare il mio problema.

+0

A che punto è stato ripristinato 'Tipo di supporto '? Subito dopo la chiamata a "Trasferimento" è troppo tardi, poiché il resto delle pagine ha già iniziato a passare attraverso l'alimentatore. –

+0

@ZevSpitz Nel mio caso e nell'esempio sopra il trasferimento è impostato solo per tirare in 1 pagina alla volta attraverso l'alimentatore. Così ho ripristinato i flag tra le successive chiamate a Transfer nel loop – Fuzz

+0

Apparentemente, il mio problema è diverso - con il codice sopra quando eseguo 'Transfer' ** tutte ** le pagine passano attraverso l'alimentatore di documenti, non solo uno. –