Ho un'applicazione di servizio Windows scritta in C# .NET. Questa applicazione viene utilizzata per generare un report in formato PDF stampando il documento sulla stampante software locale che genera PDF. Funziona bene su Windows XP e Windows 7. Sfortunatamente ho scoperto che su Windows 8 fallisce. Poi ho scoperto che la stampa su qualsiasi stampante (anche fisica) su Windows 8 fallisce quando stampo dal mio servizio. Cosa manca nel mio programma per funzionare? Sto stampa in questo modo:La stampa dal servizio Windows su Windows 8 fallisce
FlowDocument document = MyDocument;
var source = document as IDocumentPaginatorSource;
var documentPaginator = source.DocumentPaginator;
using (var printServer = new LocalPrintServer())
{
PrintQueue queue = printServer.GetPrintQueue(printerName);
XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(queue);
// Print ticket - Approach 1
// PrintTicket printTicket = queue.DefaultPrintTicket.Clone();
// Print ticket - Approach 2
var printTicket = new PrintTicket
{
PageOrientation = PageOrientation.Landscape,
PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4), // set size of media (paper)
};
documentPaginator.PageSize = new Size(document.PageWidth, document.PageHeight);
docWriter.Write(documentPaginator, printTicket);
}
servizio è impostato su 'account di sistema', senza 'interagire con il desktop' (ma ho provato che troppo o per effettuare il login come utente locale).
Ciò si traduce in salvo su Windows 8. Quando si utilizza 'biglietto di stampa - Approccio 1':
System.Printing.PrintQueueException: PrintTicket provider failed to bind to printer. Win32 error: -2147467231
at MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion)
at MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion)
at System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion)
at System.Printing.PrintQueue.get_DefaultPrintTicket()
Usando 'biglietto Stampa - Approccio 2':
Exception encountered: System.Printing.PrintQueueException: Fehler beim Binden des PrintTicket-Anbieters an den Drucker. Win32-Fehler: -2147467231
bei MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion)
bei MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion)
bei System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion)
bei System.Printing.PrintQueue.get_UserPrintTicket()
bei System.Printing.PrintQueue.get_CurrentJobSettings()
bei System.Printing.PrintQueue.CreateSerializationManager(Boolean isBatchMode, Boolean mustSetJobIdentifier)
bei System.Windows.Xps.XpsDocumentWriter.BeginWrite(Boolean batchMode, Boolean asyncMode, Boolean setPrintTicketHandler, PrintTicket printTicket, PrintTicketLevel printTicketLevel, Boolean printJobIdentifierSet)
bei System.Windows.Xps.XpsDocumentWriter.Write(DocumentPaginator documentPaginator, PrintTicket printTicket)
direi che il servizio è in grado di trovare quelle stampanti perché quando ho provato a stampare su una stampante inesistente e ho ottenuto l'eccezione "nome stampante non valida".
Qui Terrò per me alcune domande correlate: Printing from a Windows Service, Printing from a Windows Service, http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/b74bd27d-1cc8-4fca-a6de-2cd1371cf3b7/,
Leggermente correlati: Printing from a .NET Service,
edit:
Nel caso in cui qualcuno è interessato a cercando - ecco la mia applicazione di servizio di esempio che tenta di stampare un documento semplice per la stampante selezionata nel file di configurazione: http://bin.mypage.sk/FILES/PrintTestService.rar
EDIT2:
Interessante. Quando ho provato un codice di stampa diverso non c'è nessun errore:
using (var printDocument = new PrintDocument())
{
printDocument.PrinterSettings.PrinterName = printerName;
printDocument.Print();
}
Purtroppo questo è un vecchio GDI + usando la libreria System.Drawing.Graphics che non è compatibile con il mio codice che produce documento impaginato in forma di sistema. Windows.Media.Visual oggetti. Quindi non posso usarlo per stampare il mio documento a meno che non mi piacerebbe passare due settimane a creare l'impaginazione del mio documento da zero.
Edit3:
c'è discussione su questo problema qui: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/96e7fc10-3f08-4808-b748-692e30377293 C'è un 'soluzione' per poter utilizzare la piattaforma 'AnyCPU'. Questo workaround funziona davvero (l'ho provato) ma non è utilizzabile nel mio caso quando il mio servizio deve essere x86. Ho contattato il supporto MS attraverso la nostra azienda per trovare una soluzione reale.
Si dovrebbe provare a configurare il servizio per interagire con il desktop PLUS abilitare i servizi interattivi sulla macchina. Vedere qui http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502.aspx NOTA in Windows 8 il valore della chiave del Registro di sistema NoInteractiveServices è 1 per impostazione predefinita, è necessario impostarlo su 0. –
@ SimonMourier: ho modificato il flag di registro su 0, quindi riavviato e ho selezionato 'Permetti al servizio di interagire con il desktop' sul servizio. Il risultato è lo stesso. – MiroJanosik