Wie kann ich mit FAXCOMEXLib ein Fax für ein PDF von einem Windows-Dienst senden?

 C Programming >> C-Programmierung >  >> Tags >> PDF
Wie kann ich mit FAXCOMEXLib ein Fax für ein PDF von einem Windows-Dienst senden?

Es ist ziemlich gut im MSDN-Artikel dokumentiert. Die nicht triviale Sache, die passieren muss, ist einige Software muss den Dateiinhalt in druckbaren Text umwandeln, der gefaxt werden kann. Zitat:

Ein einfacher Test, den Sie durchführen können, besteht darin, mit der rechten Maustaste auf die Datei im Explorer zu klicken und nach dem Befehl „Drucken“ zu suchen. Ziehen Sie als Nächstes die Datei auf einen Drucker, um das PrintTo-Verb zu üben. Wenn dieser Test fehlschlägt, funktioniert er nicht und Sie müssen eine App installieren, die weiß, wie die Datei gedruckt wird.

Wenn Sie dies von einem Dienst aus tun, werden zusätzliche Anforderungen an die App gestellt, die den Druck ausführt. Es gibt viele von ihnen, die sich in einem Dienst nicht besonders gut verhalten. Insbesondere wenn Sie versuchen zu drucken, empfiehlt Microsoft dringend, dies niemals in einem Dienst zu tun. Office-Apps zum Beispiel seit kurzem nicht mehr, was die MSDN-Ratschläge bereits zu einer schwachen Soße macht.

Auf meinem Computer ist die Erweiterung .tif mit einer UWP-App verknüpft, die auch in einem Dienst nicht funktioniert. Angesichts der großen Anzahl von Apps, die diese beliebten Erweiterungen verarbeiten, ist es schwierig, gute Ratschläge zu geben. Gehen Sie am besten zu superuser.com und nennen Sie die spezifische Erweiterung, Windows-Version und die App, die Sie verwenden möchten. Dies von einer Benutzersitzung aus zu tun, ist sicherlich am wenigsten problematisch.


Darauf möchte ich eine umfassende Antwort geben. Die zuvor geposteten Antworten enthielten einen Teil der Lösung, aber sie vermittelten kein vollständiges Bild von allem, was wir tun mussten, um eine PDF-Datei erfolgreich über eine Faxleitung zu senden, indem FAXCOMEXLib in unserem benutzerdefinierten Windows-Dienst verwendet wurde.

Ich möchte damit beginnen, dass FAXCOMEXLib für eine Windows-Konsolenanwendung und nicht für einen Windows-Dienst entwickelt wurde. Sie können dies sogar in der Dokumentation nachlesen. Und ich denke, das ist der Grund, warum wir so viele Probleme hatten, es zum Laufen zu bringen.

Wir konnten es jedoch nach langem Ausprobieren (endlich) zum Laufen bringen. Die meisten Probleme, mit denen wir konfrontiert waren, betrafen die Einstellungen und Berechtigungen in Adobe Reader. Was wir herausfanden, war, dass Adobe Reader bei der Verarbeitung einer PDF-Datei hinter den Kulissen versucht hat, viele Dinge zu tun. Und diese "Dinge", die es zu tun versuchte, erforderten eine Benutzerinteraktion (Wegklicken von Warnfeldern usw.). Wenn Sie dies unter einem Windows-Dienst ausführen, gibt es keine Benutzerinteraktion von diesem Dienst, was dazu führte, dass unser Prozess auf unbestimmte Zeit hängen blieb und schließlich einen Fehler verursachte. Aber wir haben festgestellt, dass es einen Weg gibt, all das zu umgehen. So haben wir es gemacht:

Hier ist das Code-Snippet, das wir verwenden und das funktioniert:

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

In unserem Service gibt es natürlich mehr Code als diesen. Der andere Code erledigt Dinge wie Callback-Event-Handler, um den Status von gesendeten/abgeschlossenen/fehlgeschlagenen Faxen usw. zu verfolgen

Und hier ist eine Liste der Konfigurationsänderungen, die wir am Server vorgenommen haben, damit unser benutzerdefinierter Windows-Dienst PDF-Dateien richtig decodieren, rendern und als Faxe senden kann. Einige davon sind in einigen Antworten aufgeführt, andere jedoch nicht, und ich wollte, dass dies eine vollständige Antwort ist.

  1. Melden Sie sich als Administrator am Server an und installieren Sie die Faxserverrolle auf dem Server.
  2. Stellen Sie sicher, dass das Faxmodemgerät/die Karte richtig auf dem Server installiert ist und dass die Faxleitung aktiv ist. Sie können einfach versuchen, ein paar Testfaxe mit Textdateien direkt aus dem Windows-Faxdienstprogramm zu senden. (In unserem Fall sind wir auf Probleme gestoßen, weil wir "9" und einen geheimen Zugangscode wählen mussten, um eine externe Fernleitung zu bekommen).
  3. Installieren Sie Adobe Reader auf dem Server.
  4. Erstellen Sie einen Benutzer auf dem Server, damit Ihr Windows-Dienst "als" ausgeführt wird. Wir haben unseren Benutzer "FaxServiceUser" genannt.
  5. Melden Sie sich mindestens einmal als dieser FaxServiceUser am Server an. Legen Sie im eingeloggten Zustand das Gerät „Adobe PDF“ als Standarddrucker fest.
  6. Öffnen Sie außerdem, während Sie als dieser Benutzer angemeldet sind, eine PDF-Datei mit Adobe und klicken Sie sich durch die EULAs.
  7. Während Sie als dieser Benutzer angemeldet sind und Adobe Reader geöffnet haben, ändern Sie diese Einstellungen:
    • Falls aktiviert, deaktivieren Sie „Nachrichten anzeigen, wenn ich Reader starte“ (unter „Allgemein“)
    • Deaktivieren Sie das Kontrollkästchen „Geschützten Modus beim Start aktivieren“ (Dies gilt möglicherweise nur für Acrobat 10. In Acrobat 11 wurde diese Option in „Sicherheit (erweitert)“ verschoben und trägt den Titel „Geschützten Modus beim Start aktivieren“. Stellen Sie einfach sicher Sie diese Option deaktivieren)
    • Deaktivieren Sie „Enable Enhanced Security“ (unter „Security(Enhanced)“ – dies gilt möglicherweise nur für Acrobat 11 und höher)
    • Wählen Sie die Updater-Option und deaktivieren Sie das automatische Herunterladen und Installieren von Updates.
    • Deaktivieren Sie "Links aus URLs erstellen" (unter "Allgemein")
    • Deaktivieren Sie "Artikel von Hand lesen lassen" (unter "Allgemein")
    • Deaktivieren Sie "Nachrichten anzeigen, wenn ich Reader starte" (unter "Allgemein")
    • Deaktivieren Sie "Feldwerte automatisch berechnen" (unter "Formulare")
    • Deaktivieren Sie "Fokusrechtecke anzeigen" (unter "Formulare")
    • Deaktivieren Sie "Überlaufanzeige für Textfeld anzeigen" (unter "Formulare")
    • Deaktivieren Sie "Acrobat JavaScript aktivieren" (unter "Javascript")
    • Deaktivieren Sie "Willkommensdialog anzeigen" (unter "Überprüfen")
    • Deaktivieren Sie "Warndialog zur Serververbindung beim Öffnen der Datei anzeigen" (unter "Überprüfen")
  8. Konsultieren Sie bei Bedarf diesen Link für Unterstützung bei den Adobe Reader-Einstellungen:http://kb.faxback.com/How+To+Configure+Adobe+XI+for+Use+with+NET+SatisFAXtion
  9. Ändern Sie nach dem Erstellen, Bereitstellen und Installieren Ihres Windows-Dienstes die Eigenschaften Ihres Dienstes so, dass er "als" der Benutzer ausgeführt wird, den Sie zuvor erstellt haben ("FaxServiceUser" in unserem Fall).
  10. Fügen Sie Berechtigungen für diesen FaxServiceUser zu allen Ordnern hinzu, die er lesen/schreiben/löschen muss.
  11. Da Adobe als Desktop-App ausgeführt werden soll, fügen Sie Ihrem Dienst Code hinzu, um den von Adobe Reader verwendeten Speicher freizugeben (Sie können sehen, wie wir das im myProcess.Kill() gemacht haben Funktion im Beispielcode).

Und das sollte es tun. Es ist ein bisschen umständlich, aber ich hoffe, dies gibt ein vollständiges Beispiel dafür, wie Sie Adobe Reader in Verbindung mit Ihrem benutzerdefinierten Windows-Dienst einrichten, um Faxe aus PDF-Dateien auf einem Windows-Server zu senden. Wir machen das jetzt seit ein paar Monaten ohne Probleme. Unser Kunde faxt nur wenig, daher kann ich nicht sagen, wie das bei einem hohen Faxvolumen funktioniert. Wenn Sie also nach einer "kostenlosen" Möglichkeit suchen, Faxe zu versenden, ohne für etwas wie Interfax zu bezahlen, könnte dies eine praktikable Option sein, zumindest für geringes Volumen.


No