Je veux donner une réponse complète à cette question. Les réponses précédemment postées contenaient une partie de la solution, mais elles ne donnaient pas une image complète de tout ce que nous devions faire pour envoyer avec succès un fichier pdf via une ligne de fax, en utilisant FAXCOMEXLib dans notre service Windows personnalisé.
Je voudrais commencer par dire que FAXCOMEXLib est conçu pour une application console Windows, pas pour un service Windows. Vous pouvez même le lire dans la documentation. Et je pense que c'est la raison pour laquelle nous avons eu tant de mal à la faire fonctionner.
Cependant, nous avons réussi à le faire fonctionner (enfin) après de nombreux essais et erreurs. La plupart des problèmes que nous avons rencontrés étaient liés aux paramètres et aux autorisations d'Adobe Reader. Ce que nous avons découvert, c'est qu'Adobe Reader essayait de faire beaucoup de choses en coulisse lors du traitement d'un fichier PDf. Et ces "choses" qu'il essayait de faire nécessitaient une interaction avec l'utilisateur (cliquer sur des boîtes d'alerte, etc.). Lorsque ce processus est exécuté sous un service Windows, il n'y a pas d'interaction de l'utilisateur avec ce service, ce qui fait que notre processus se bloque indéfiniment et finit par échouer. Mais nous avons découvert qu'il existe un moyen de contourner tout cela. Voici comment nous avons procédé :
Voici le bout de code que nous utilisons et qui fonctionne :
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);
Il y a plus de code que cela dans notre service, bien sûr. L'autre code fait des choses comme gérer les gestionnaires d'événements de rappel pour suivre le statut des fax envoyés/achevés/échecs, etc. Mais ceci est le "cœur" du code qui initie réellement l'envoi.
Et voici une liste des changements de configuration que nous avons apportés au serveur pour que notre service Windows personnalisé décode, rende et envoie correctement les fichiers PDF sous forme de fax. Certaines de ces modifications sont mentionnées dans certaines réponses, mais d'autres ne le sont pas, et je voulais que cette réponse soit complète.
- Connectez-vous en tant qu'administrateur au serveur et installez le rôle Fax Server sur le serveur.
- Assurez-vous que le périphérique/carte modem fax est correctement installé sur le serveur et que la ligne de fax est active. Vous pouvez essayer d'envoyer quelques télécopies de test avec des fichiers texte directement à partir de l'utilitaire Windows Fax. (Dans notre cas, nous avons rencontré des problèmes car nous devions composer le "9" et un code secret pour obtenir une ligne extérieure longue distance).
- Installez Adobe Reader sur le serveur.
- Créez un utilisateur sur le serveur pour que votre service Windows s'exécute "en tant que". Nous avons appelé notre utilisateur "FaxServiceUser".
- Connectez-vous au serveur en tant que cet utilisateur FaxServiceUser au moins une fois. Une fois connecté, définissez le périphérique "Adobe PDF" comme imprimante par défaut.
- En outre, lorsque vous êtes connecté en tant qu'utilisateur, ouvrez un fichier PDF en utilisant Adobe et cliquez sur les CLUF.
- Lorsque vous êtes connecté en tant qu'utilisateur et qu'Adobe Reader est ouvert, modifiez ces paramètres :
- Si la case est cochée, décochez l'option "Afficher les messages lorsque je lance Reader" (sous "Général").
- Décochez la case "Activer le mode protégé" au démarrage (Cette option ne s'applique peut-être qu'à Acrobat 10. Dans Acrobat 11, cette option a été déplacée dans Sécurité (améliorée) et s'intitule Activer le mode protégé au démarrage. Veillez à décocher cette option)
- Décochez la case "Activer la sécurité renforcée" (sous "Sécurité (renforcée)" - ceci ne s'applique peut-être qu'à Acrobat 11 et aux versions ultérieures).
- Sélectionnez l'option Updater et désactivez le téléchargement et l'installation automatiques des mises à jour.
- Décochez "Créer des liens à partir d'URLs" (sous "Général")
- Décochez "Faire en sorte que l'outil manuel lise les articles" (Sous "Général")
- Décochez "Afficher les messages lorsque je lance Reader" (sous "Général").
- Décochez "Calculer automatiquement les valeurs des champs" (Sous "Formulaires")
- Décochez "Afficher les rectangles de mise au point" (Sous "Formulaires")
- Décochez l'option "Afficher l'indicateur de débordement des champs de texte" (sous "Formulaires").
- Décochez "Activer Acrobat JavaScript" (sous "Javascript")
- Décochez "Afficher le dialogue de bienvenue" (sous "Révision").
- Décochez "Afficher la boîte de dialogue d'avertissement de connexion au serveur lors de l'ouverture du fichier" (Sous "Révision")
- Si nécessaire, consultez ce lien pour obtenir de l'aide sur les paramètres d'Adobe Reader : http://kb.faxback.com/How+Pour+configurer+Adobe+XI+pour+l'utiliser+avec+NET+SatisFAXtion
- Après avoir construit, déployé et installé votre service Windows, modifiez les propriétés de votre service pour qu'il soit exécuté "en tant que" l'utilisateur que vous avez créé précédemment ("FaxServiceUser" dans notre cas).
- Ajoutez des autorisations pour ce FaxServiceUser à n'importe quel dossier dans lequel il doit lire/écrire/supprimer.
- Étant donné qu'Adobe est censé être exécuté en tant qu'application de bureau, ajoutez du code dans votre service pour libérer la mémoire utilisée par Adobe Reader (vous pouvez voir comment nous avons procédé dans le fichier
myProcess.Kill()
dans l'exemple de code).
Et ça devrait le faire. C'est un peu lourd, mais j'espère que cela donne un exemple complet de la façon de configurer Adobe Reader en conjonction avec votre service Windows personnalisé pour envoyer des fax à partir de fichiers PDF sur un serveur Windows. Nous le faisons depuis quelques mois maintenant sans aucun problème. Notre client a un faible volume de télécopies, je ne peux donc pas parler de la façon dont cela fonctionne avec un volume élevé de télécopies. Donc, si vous cherchez un moyen "gratuit" d'envoyer des fax, sans payer pour quelque chose comme Interfax, cela pourrait être une option viable, au moins pour un faible volume.