2 messaggi dal 13 dicembre 2012
Buongiorno,
ho la necessità di stampare dei file pdf da un web service WCF direttamente su una stampante di rete installata sul server.
In pratica l'utente passa solo il percorso e nome del file e il nome della stampante e il metodo deve lanciare la stampa.
Ho utilizzato questo codice:
Dim psInfo As New ProcessStartInfo()
psInfo.FileName = "C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"
psInfo.Arguments = [String].Format("/s /o /h /t {0} {1}", pdfFileName, pdfPrinterName)
psInfo.WindowStyle = ProcessWindowStyle.Hidden
psInfo.CreateNoWindow = True
psInfo.UseShellExecute = True
Dim process__1 As Process = Process.Start(psInfo)

che funziona bene e stampa quando sono in ambiente di sviluppo con IIS express. Quando però il WebService viene messo in ambiente di produzione, non solo non stampa nulla, non viene messo niente nello spool e non dà nemmeno alcun errore.
Sullo stesso server di produzione, mettendo il codice precedente su una finestra winform tutto funziona.
Ho provato anche con Impersonate ma ha lo stesso comportamento: su IIS Express funziona, sul server di produzione non funziona, non dà errori ma non stampa nulla.

Ho provato anche con un componente pdfPrinter.dll di terze parti ma il comportamento lo stesso.

Ho provato a modificare la autenticazione dell'ApplicationPool ma nulla da fare.

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Roberta,

robertafranchi ha scritto:

funziona bene e stampa quando sono in ambiente di sviluppo con IIS express

Sì, perché IIS Express usa il tuo utente di Windows per mandare in esecuzione l'applicazione web. Dato che il tuo utente dispone di un desktop attivo, l'applicazione Windows (Adobe Reader) può essere lanciata e la stampa può avvenire.

Quando pubblichi nel server, invece, la tua applicazione web va in esecuzione con un utente virtuale di IIS (a meno che tu non l'abbia modificato), che non dispone di alcun desktop in cui possa essere lanciata l'applicazione.
Inoltre, quell'utente potrebbe non avere i necessari privilegi.

Dovresti provare ad impostare un altro utente all'application pool; uno che abbia i necessari privilegi a lanciare un eseguibile. Qui trovi le istruzioni:
https://technet.microsoft.com/it-it/library/cc771170(v=ws.10).aspx

A questo punto, anziché usare Adobe Reader, prova con GhostScript.NET come vedi in questo esempio:
http://stackoverflow.com/questions/28300385/ghostscript-net-dll-print-pdf-to-specified-printer

ciao,
Moreno

Enjoy learning and just keep making
2 messaggi dal 13 dicembre 2012
Ciao Moreno,
grazie del suggerimento.
In realtà ho combinato varie cose:
ho messo sull'applicationpool un utente con i diritti di amministratore ma per stampare ho utilizzato una dll anzichè un exe. Si chiama Printing.NET di TerminalWorks.

In questo modo funziona. Purtoppo c'è ancora un problema nel caso in cui il pdf abbia delle immagini e diversi layers ma questo è un problema della dll.
Utilizzando qualsiasi exe per stampare non stampa niente.

Utilizzando GhostScript come indicato nell'esempio, di nuovo funziona su IIS Express ma sulla macchina di produzione (IIS 64 bit), dà questo errore:

An error occured when call to 'gsapi_new_instance' is made: -100


Grazie
Modificato da robertafranchi il 25 settembre 2015 11.49 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.