Come posso inviare un fax per un pdf da un servizio Windows utilizzando FAXCOMEXLib?

 C Programming >> Programmazione C >  >> Tags >> PDF
Come posso inviare un fax per un pdf da un servizio Windows utilizzando FAXCOMEXLib?

È documentato abbastanza bene nell'articolo MSDN. La cosa non banale che deve accadere è che alcuni il software deve convertire il contenuto del file in testo stampabile che può essere inviato via fax. Citando:

Quindi un semplice test che puoi fare è fare clic con il pulsante destro del mouse sul file in Explorer e cercare il comando "Stampa". Quindi trascina il file su una stampante per esercitare il verbo PrintTo. Se questi test falliscono, non funzionerà e devi installare un'app che sappia come stampare il file.

Questa operazione da un servizio richiede requisiti aggiuntivi all'app che esegue la stampa. Ci sono molti di loro che non si comportano particolarmente bene in un servizio. Soprattutto quando si tenta di stampare, Microsoft consiglia vivamente di non farlo mai in un servizio. Le app di Office, ad esempio, non lo fanno negli ultimi tempi, rendendo i consigli MSDN già deboli.

Sulla mia macchina, l'estensione .tif è associata a un'app UWP, che non funzionerà nemmeno in un servizio. Dare buoni consigli è difficile dato il gran numero di app che gestiscono queste estensioni popolari, meglio andare su superuser.com e nominare l'estensione specifica, la versione di Windows e l'app che preferisci utilizzare. Farlo da una sessione utente è sicuramente il meno fastidioso.


Voglio dare una risposta completa a questo. Le risposte pubblicate in precedenza avevano alcune delle soluzioni, ma non fornivano un quadro completo di tutto ciò che dovevamo fare per inviare correttamente un file pdf tramite una linea fax, utilizzando FAXCOMEXLib nel nostro servizio Windows personalizzato.

Voglio iniziare dicendo che FAXCOMEXLib è realizzato per un'app per console Windows, non per un servizio Windows. Puoi anche leggerlo nella documentazione. E penso che sia per questo che abbiamo avuto così tanti problemi a farlo funzionare.

Tuttavia, siamo riusciti a farlo funzionare (finalmente) dopo molti tentativi ed errori. La maggior parte dei problemi che abbiamo dovuto affrontare riguardavano l'impostazione e le autorizzazioni in Adobe Reader. Quello che abbiamo scoperto è che Adobe Reader stava cercando di fare molte cose dietro le quinte durante l'elaborazione di un file PDf. E quelle "cose" che stava cercando di fare richiedevano l'interazione dell'utente (facendo clic sulle caselle di avviso, ecc.). Quando si esegue questo sotto un servizio Windows, non vi è alcuna interazione dell'utente da quel servizio, il che ha causato il blocco del nostro processo a tempo indeterminato e alla fine si è verificato un errore. Ma abbiamo scoperto che c'è un modo per aggirare tutto questo. Ecco come abbiamo fatto:

Ecco lo snippet di codice che stiamo usando che funziona:

fileName = @"D:\temp\FaxTest.pdf";
faxDoc.Sender.Name = faxRec.From;
faxDoc.Sender.Company = faxRec.From;
faxDoc.Body = fileName;
faxDoc.Subject = faxRec.ReferenceId;
faxDoc.DocumentName = faxRec.ReferenceId;
var to = "xxxxxxxxxx";
faxDoc.Recipients.Add(to, "Some Name");
var serverName = Environment.MachineName;
var myProcesses = Process.GetProcessesByName("AcroRd32");
foreach (var myProcess in myProcesses)
{
    if (DateTime.Now.Ticks - myProcess.StartTime.Ticks > TimeSpan.FromSeconds(30).Ticks) {
        myProcess.Kill();
    }
}
string[] returnVal = faxDoc.Submit(serverName);

C'è più codice di questo nel nostro servizio, ovviamente. L'altro codice fa cose come gestire i gestori di eventi di callback per tenere traccia dello stato di invio/completato/non riuscito fax, ecc. Ma questo è il "cuore" del codice che avvia effettivamente l'"invio".

Ed ecco un elenco di modifiche alla configurazione che abbiamo apportato al server per fare in modo che il nostro servizio Windows personalizzato decodifichi, visualizzi e invii correttamente i file pdf come fax. Alcuni di questi sono elencati in alcune delle risposte, ma altri no, e volevo che questa fosse una risposta completa.

  1. Accedi come amministratore al server e installa il ruolo Server fax sul server.
  2. Assicurarsi che il dispositivo/la scheda modem fax sia installato correttamente sul server e che la linea fax sia attiva. Potresti semplicemente provare a inviare un paio di fax di prova con file di testo direttamente dall'utilità Fax di Windows. (Nel nostro caso abbiamo riscontrato problemi perché abbiamo dovuto comporre "9" e un codice segreto per ottenere una linea esterna a lunga distanza).
  3. Installa Adobe Reader sul server.
  4. Crea un utente sul server per l'esecuzione del servizio Windows "come". Abbiamo chiamato il nostro utente "FaxServiceUser".
  5. Accedere al server come utente FaxService almeno una volta. Dopo aver effettuato l'accesso, imposta il dispositivo "Adobe PDF" come stampante predefinita.
  6. Anche dopo aver effettuato l'accesso come questo utente, apri un file PDF utilizzando Adobe e fai clic sugli EULA.
  7. Mentre hai effettuato l'accesso come questo utente e hai Adobe Reader aperto, modifica queste impostazioni:
    • Se selezionato, deseleziona "Mostrami messaggi all'avvio di Reader" (in "Generale")
    • Deseleziona la casella di controllo "Abilita modalità protetta" all'avvio (questo potrebbe essere applicabile solo ad Acrobat 10. In Acrobat 11, questa opzione è stata spostata su Sicurezza (avanzata) ed è denominata Abilita modalità protetta all'avvio. Assicurati solo di deselezioni questa opzione)
    • Deseleziona "Abilita sicurezza avanzata" (in "Sicurezza(avanzata)" - questo potrebbe applicarsi solo ad Acrobat 11 e versioni successive)
    • Seleziona l'opzione Updater e disattiva Download automatico e installa aggiornamenti.
    • Deseleziona "Crea link da URL" (in "Generale")
    • Deseleziona "Fai leggere gli articoli con lo strumento Mano" (in "Generale")
    • Deseleziona "Mostrami messaggi all'avvio di Reader" (in "Generale")
    • Deseleziona "Calcola automaticamente i valori dei campi" (in "Moduli")
    • Deseleziona "Mostra rettangoli di messa a fuoco" (in "Moduli")
    • Deseleziona "Mostra indicatore di overflow del campo di testo" (in "Moduli")
    • Deseleziona "Abilita JavaScript Acrobat" (in "Javascript")
    • Deseleziona "Mostra finestra di benvenuto" (in "Revisione")
    • Deseleziona "Mostra finestra di avviso di connessione al server all'apertura del file" (in "Revisione")
  8. Se necessario, consulta questo link per assistenza con le impostazioni di Adobe Reader:http://kb.faxback.com/How+To+Configure+Adobe+XI+for+Use+with+NET+SatisFAXtion
  9. Dopo aver creato, distribuito e installato il servizio Windows, modifica le proprietà del servizio in modo che venga eseguito "come" l'utente creato in precedenza ("FaxServiceUser" nel nostro caso).
  10. Aggiungi le autorizzazioni per quel FaxServiceUser a qualsiasi cartella di cui ha bisogno per leggere/scrivere/eliminare da/a.
  11. Dato che Adobe è pensato per essere eseguito come app desktop, aggiungi del codice nel tuo servizio per liberare la memoria utilizzata da Adobe Reader (puoi vedere come abbiamo fatto in myProcess.Kill() funzione nel codice di esempio).

E così dovrebbe andare. È un po' ingombrante, ma spero che questo fornisca un esempio completo di come configurare Adobe Reader insieme al servizio Windows personalizzato per inviare fax da file pdf su un server Windows. Lo stiamo facendo da un paio di mesi senza problemi. Il nostro cliente esegue un basso volume di fax, quindi non posso parlare di come funziona con un volume elevato di fax. Quindi, se stai cercando un modo "gratuito" per inviare fax, senza pagare qualcosa come Interfax, questa potrebbe essere un'opzione praticabile, almeno a basso volume.


No