PDF-Dateien als Faxe mit Asterisk versenden

11.04.2024 (zuletzt aktualisiert am 16.4.24)

Die Telefonsoftware Asterisk kann auch Faxe verschicken. Allerdings nur, wenn diese als TIFF-Dateien in einem ganz bestimmten Format vorliegen. Das hier vorgestellte Skript wandelt die als Fax zu verschickenden PDF-Dateien in das notwendige TIFF-Format um und versendet sie dann als Fax. Mit dieser Konfiguration gelingt es auch mehrseitige Faxe über das öffentliche Telefonnetz oder über IAX2 zu anderen Asterisk-Servern zu verschicken.

Nicht wenige betreiben einen virtuellen Faxempfänger, den sie sich auf einer FritzBox eingerichtet haben. Mit der hier vorgestellten Lösung ist man auch in der Lage Faxe selbst zu verschicken, wenn diese als PDF vorliegen. Die Software der meisten Scanner erzeugen PDF-Dateien.  Wer zusätzlich einen Linux-Rechner mit Debian (z.B. Ubuntu) oder einen Raspberry Pi mit Raspbian als Betriebssystem betreibt, hat damit schon die notwendigen Software auf einer geeigneten Hardware. Ein Faxmodem ist ebenfalls nicht erforderlich, da Asterisk SIP-Accounts anlegen und verarbeiten kann. Es liegt dann ein SIP-Softphone für Linux vor, das PDF-Dateien als Faxe verschicken kann.

Aus heutiger Sicht ist das sicherlich eine Spielerei, da kaum noch jemand Faxe verschicken muss. Das Programmieren für  Asterisk  war jedoch eine lehrreiche und witzige Erfahrung. Wer mit Asterisk eine Nebenstellenanlage oder einen Telefonserver auf einem Raspberry oder Linux betreibt, bekommt quasi geschenkt noch einen Faxgerät dazu.

Voraussetzungen: Grundkenntnisse über Linux und Asterisk sollten vorliegen. Ein lauffähiger und konfigurierter Asterisk-Server mit mindestens einem SIP-Account für ein angeschlossenes Telefon ist bereits eingerichtet. Getestet habe ich dieses Skript auf Asterisk 16 und einem Raspberry Pi 3 B mit Raspbian Buster  (Linux Debian).

Bedienung: Die Bedienung ist kinderleicht und leicht verständlich. Wir schreiben zum Beispiel unter Windows oder Linux ein Dokument mit dem Schreibprogramm Libre Office oder einem anderen Schreibprogramm, das wir als PDF abspeichern. Dann kopieren wir diese PDF-Datei in den Linux-Ordner

/var/spool/asterisk/fax/outgoing

Diesen Ordner müssen wir von Hand anlegen und für das Lesen und Schreiben entsprechend freigeben:

sudo chmod -R 777 /var/spool/asterisk/fax/outgoing

Dieser Befehl setzt rekursiv (-R) die Zugriffsrechte auf 777 für den angegebenen Ordner und alle darin enthaltenen Dateien und Unterverzeichnisse. Die Zahl 777 bedeutet, dass alle Benutzer volle Lese-, Schreib- und Ausführungsrechte für den Ordner und die darin enthaltenen Dateien haben.

Die zu verschickende PDF müssen wir noch in “a.pdf” umbenennen. Falls wir von Windows aus die PDF erstellen, sollte das FTP-Programm Filezilla eine sftp-Verbindung zu Linux herstellen können. Diese PDF  können wir dann mit Maus in den in Rede stehenden Linux-Ordner ziehen. Die PDF können wir auch auf Filezille in “a.pdf” umbenennen. Es ist ganz wichtig, denn das hier vorgestellte Asterisk-Fax sucht sucht nach einer a.pdf und verschickt nur eine a.pdf

Das Einrichten von Filezilla ist hier beschrieben:

Mit dem FTP-Client FileZilla gelingt von Windows aus der Zugriff auf Raspberry-Dateien. Der Raspberry kann das von Haus aus.
Von Windows auf den Raspberry Pi zugreifen – 5.12.2021: Auf meinem Raspberry Pi betreibe ich einen kleinen SIP-Server mit Asterisk. Von Windows 10 aus möchte ich direkten Zugriff auf die Asterisk-Konsole und auf die Kommandozeilenebene (CLI) des Raspbian haben. Außerdem möchte ich zur Datensicherung und zu Konfigurationszwecken die Konfigurationsdateien von Windows aus sichern und verändern können. Dies erspart einen zweiten Bildschirm. – weiter
Filezilla A Pdf Raspberry
Die a.pdf müssen wir von Windows aus nur mit Hilfe von Filezilla in den entsprechenden Ordner verschieben.

Anwählen des Faxes: Nun müssen wir noch das Fax verschicken. Angenommen das Fax des Empfängers besitzt die Nummer 1099 (den SIP-Account 1099). Dann müssen wir von einem beliebigen Telefon (oder SIP-Account) die Nummer 1094 1099 als Durchwahl wählen. 1094 ist nämlich die Vorwahl für das Versenden von Faxen. Wir könnten für das  Wählen sogar ein altes Wählscheibentelefon nehmen, um die Sache noch uriger zu gestalten.

Wenn wir in unserem Beispiel die Nummer 10941099 wählen, werden wir im Hörer nichts hören oder einen Signalton, der unpassend erscheint. Vielleicht hören wir eine Begrüßung und einen Hinweis auf Englisch. Legt die Gegenstelle, also das Fax am anderen Ende der Leitung auf, und hört man dann das Freizeichen, wurde das Fax versendet. Dies können wir zur Sicherheit in der Konsole von Asterisk kontrollieren.

Img 0675 1024x768
Die Anwahl kann sogar mit einem alten Wählscheibentelefon erfolgen. Hauptsache das Telefon besitzt einen SIP-Account des Asterisk-Servers, auf dem sich der Asterisk-Fax-Sender befindet.

Das Skript: Alles, was dazu nötig ist, spielt sich in der extensions.conf von Asterisk  ab. Eine Wahlregel ruft ein Macro für den eigentlichen Faxversand auf. In der Wahlregel ist auch der System-Befehl “convert” für die Umwandlung der PDF nach TIFF enthalten. Erst nach dieser manchmal etwas zeitintensiven Konvertierung wird der Faxanruf gestartet und in diesem Zusammenhang das Makro aufgerufen. Schließlich wird in der Wahlregel noch der Audio-Codec G.711 bevorzugt, weil er dank eines höheren Frequenzumfangs schnellere Faxübertragungsraten ermöglicht.

Es gibt verschiedene Wahlregeln abhängig davon welche Arten von “Telefonnummern” (Extensions) angewählt werden:

A. SIP-Accounts innerhalb des eigenen Servers
B. Extensions auf anderen Servern, die über IAX2 erreichbar sind
C. Öffentliche Telefonnummern, z.B. über Sipgate
D. Extensions innerhalb des eigenen Servers

Hier sind die 4 Wahlregeln, die im entsprechenden Context der extensions.conf unterzubringen und anzupassen sind.

;  Faxversand. 1094 als Vorwahl und dann direkt danach
;  als Durchwahl die Faxnummer des Empfängers wählen
;  Das Programm ImageMagick für die Konvertierung von PDF nach TIFF muss
;  installiert und konfiguriert sein. Erklärung im Text dieses Artikels

; Fall A

; Faxversand 1094 für zu internen SIP-Accounts
exten => _1094X.,1,Noop(Faxversand von Asterisk von "${CALLERID(name)}" <${CALLERID(num)}>)
 same => n,Noop(Als Durchwahl Vorwahl 1094 + SIP-Nummer des Ziels wählen)
 same => n,Noop(nur an interne SIP-Accounts möglich)
 same => n,Playback(hello)
 same => n,Wait(1)
 same => n,Playback(vm-dialout)
 same => n,System(convert -density 204x196 -depth 2 -monochrome -resize 1728x -units PixelsPerInch /var/spool/asterisk/fax/outgoing/a.pdf -compress Fax /var/spool/asterisk/fax/outgoing/a.tif)
 same => n,Set(SIP_CODEC=g722)
 same => n,Playback(vm-dialout)
 same => n,Dial(SIP/${EXTEN:4},,M(faxversand))
 same => n,Hangup()

; Fall B
 
; Faxversand 1094 + 8874 zu einem anderen Server via Asterisk
exten => _10948874X.,1,Noop(Faxversand von Asterisk von "${CALLERID(name)}" <${CALLERID(num)}>)
 same => n,Noop(Als Durchwahl Vorwahl 1094 + 8874 + Nummer des Ziels auf dem anderen Server)
 same => n,Noop(nur zu Adis Nummern möglich)
 same => n,Playback(hello)
 same => n,Wait(1)
 same => n,Playback(vm-dialout)
 same => n,System(convert -density 204x196 -depth 2 -monochrome -resize 1728x -units PixelsPerInch /var/spool/asterisk/fax/outgoing/a.pdf -compress Fax /var/spool/asterisk/fax/outgoing/a.tif)
 same => n,Set(SIP_CODEC=g722)
 same => n,Playback(vm-dialout)
 same => n,Dial(IAX2/outgoing-dl1hrc/${EXTEN:8},,M(faxversand))
 same => n,Noop(Faxversand beendet)
 same => n,Hangup()

; Fall C

; Faxversand 1094 + 1234 in das öffentliche Netz über das deutsche Sipgate
exten => _10941278X.,1,Noop(Faxversand von Asterisk von "${CALLERID(name)}" <${CALLERID(num)}>)
 same => n,Noop(Als Durchwahl Vorwahl 1094 + 1234 + Nummer des Ziels einer öffentlichen Nummer)
 same => n,Noop(******************************************************************************)
 same => n,Playback(hello)
 same => n,Wait(1)
 same => n,Playback(vm-dialout)
 same => n,System(convert -density 204x196 -depth 2 -monochrome -resize 1728x -units PixelsPerInch /var/spool/asterisk/fax/outgoing/a.pdf -compress Fax /var/spool/asterisk/fax/outgoing/a.tif)
 same => n,Set(SIP_CODEC=g722)
 same => n,Playback(vm-dialout)
 same => n,Dial(SIP/${EXTEN:8}@sipgate1,,M(faxversand))
 same => n,Noop(Faxversand beendet)
 same => n,Hangup()

; Fall D (klappt bei mir leider nicht wegen fehlender Faxsteuersignale)

; Faxversand 1090 zum interen Asterisk-Fax 1094
exten => 1090,1,Noop(Faxversand von Asterisk von "${CALLERID(name)}" <${CALLERID(num)}>)
 same => n,Noop(vom internen Asterisk-Fax auf das interne Asterisk-Fax 1094)
 same => n,Noop(...........................................................)
 same => n,Playback(hello)
 same => n,Wait(1)
 same => n,Playback(vm-dialout)
 same => n,System(convert -density 204x196 -depth 2 -monochrome -resize 1728x -units PixelsPerInch /var/spool/asterisk/fax/outgoing/a.pdf -compress Fax /var/spool/asterisk/fax/outgoing/a.tif)
 same => n,Set(SIP_CODEC=g722)
 same => n,Playback(vm-dialout)
 same => n,Dial(Local/1094@telefone,,M(faxversand)) 
 same => n,Noop(Faxversand beendet) 
 same => n,Hangup()

Wir benötigen natürlich nur jene Wahlregeln, die wir verwenden wollen. Wenn wir nur in das öffentliche Netz Faxe verschicken wollen, reicht Fall C.

Und hier das Macro “faxversand”, das für den eigentlichen Faxversand zuständig ist und das Anwählen des Empfängerfaxes auslöst:

; PDF als Fax versenden
[macro-faxversand] ; Faxversand
; das zu versendende Fax muss im Ordner
; /var/spool/asterisk/fax/outgoing
; entweder al a.tif oder a.pdf vorliegen
exten => s,1,NoOp("Versenden eines Faxes")
same => n,Answer()
same => n,Set(FAXOPT(ecm)=yes)
same => n,Set(FAXOPT(maxrate)=9600)
same => n,Set(FAXOPT(minrate)=2400)
same => n,Set(faxlocation=/var/spool/asterisk/fax/outgoing) 
same => n,Set(faxfile=a.tif) 
same => n,Set(FAXOPT(headerinfo)=Hans Dampf)
same => n,Set(FAXOPT(localstationid)=1094)
; same => n,System(convert -density 204x196 -depth 2 -monochrome -resize 1728x -units PixelsPerInch /var/spool/asterisk/fax/outgoing/a.pdf -compress Fax /var/spool/asterisk/fax/outgoing/a.tif)
same => n,SendFax(${faxlocation}/${faxfile})

; https://docs.asterisk.org/Asterisk_16_Documentation/API_Documentation/Dialplan_Functions/FAXOPT/
same => n,NoOp(STATUS: ${FAXOPT(status)})                   ; Info, ob erfogreich oder gescheiterer Faxversand
same => n,NoOp(RESOLUTION: ${FAXOPT(resolution)})           ; Auflösung des Fax
same => n,NoOp(RATE: ${FAXOPT(rate)})                       ; Geschwindigkeit
same => n,NoOp(PAGES: ${FAXOPT(pages)})                     ; Anzahl übertragener Seiten
same => n,NoOp(REMOTESTATIONID: ${FAXOPT(remotestationid)}) ; 
same => n,NoOp(SESSIONID: ${FAXOPT(sessionid)})             ; 
same => n,NoOp(ERROR: ${FAXOPT(error)})                     ; Fehlermeldung
same => n,HangUp()

Das Programm ImageMagick installieren und konfigurieren: Leider ist das noch nicht alles. Zur Erklärung: Diese sehr lange Zeile

same => n,System(convert -density 204x196 -depth 2 -monochrome -resize 1728x -units PixelsPerInch /var/spool/asterisk/fax/outgoing/a.pdf -compress Fax /var/spool/asterisk/fax/outgoing/a.tif)

in den Wahlregeln wandelt die a.pdf in eine a.tif um, bevor der Einwahlvorgang gestartet wird. Diese a.tif besitzt exakt jene Eigenschaften, die Asterisk für das Verschicken von Faxen benötigt. Für die Konvertierung von a.pdf nach a.tif müssen wir das Linux-Programm ImageMagick installieren und konfigurieren. Wie das geht, ist hier beschrieben:

Fiktives Faxgerät von der KI GenCraft erzeugt (Bildquelle: GenCraft)
Faxempfang auf Asterisk mit und ohne E-Mail-Weiterleitung – 2.4.2024: Der Empfang von Faxen lässt sich in Asterisk mit ein paar Programmzeilen umsetzen. Sie ist aber einfach zu verstehen und beliebig ausbaufähig. Getestet mit Asterisk 16 auf einem Raspberry Pi. Wir müssen nur in der sip.conf und in der extensions.conf  ein paar Zeilen hinzufügen und noch einen Ordner anlegen und freigeben, in welchem die Faxeinrichtung die Faxe als TIFF-Dateien ablegt. Anschließend gibt es noch eine Lösung mit einer E-Mail-Weiterreichung der Faxe. – weiter
Notwendigespezifikationenfuerdenfaxversandmitasterisk
Das sind die Spezifikationen einer TIF-Datei, welche für den Faxversand mit Asterisk geeignet ist.

Anpassen der sip.conf: In der Regel muss die sip.conf nicht verändert werden. Wichtig ist, dass das Faxprotokoll T.38 nicht aktiviert ist. Normalerweise ist es nicht aktiviert. Unter [general] der sip.conf sollte folgendes stehen:

faxdetect=yes ; kann auch auf no stehen.
; t38pt_udptl=yes
; directmedia=no

T.38 habe ich leider nicht zum Laufen gebracht.

Meldung in der Asterisk-Konsole: Fax wurde erfolgreich an einen anderen SIP-Account desselben Servers verschickt:

- Executing [10941098@janson:10] Dial("SIP/1088-0000010c", "SIP/1098,,M(faxversand)") in new stack
  == Using SIP VIDEO TOS bits 136
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
    -- Called SIP/1098
       > 0x73e1d260 -- Strict RTP learning after remote address set to: 192.168.1.103:7078
    -- SIP/1098-0000010d answered SIP/1088-0000010c
    -- Executing [s@macro-faxversand:1] NoOp("SIP/1098-0000010d", ""Versenden eines Faxes"") in new stack
    -- Executing [s@macro-faxversand:2] Answer("SIP/1098-0000010d", "") in new stack
    -- Executing [s@macro-faxversand:3] Set("SIP/1098-0000010d", "FAXOPT(ecm)=yes") in new stack
    -- Executing [s@macro-faxversand:4] Set("SIP/1098-0000010d", "FAXOPT(maxrate)=9600") in new stack
    -- Executing [s@macro-faxversand:5] Set("SIP/1098-0000010d", "FAXOPT(minrate)=2400") in new stack
    -- Executing [s@macro-faxversand:6] Set("SIP/1098-0000010d", "faxlocation=/var/spool/asterisk/fax/outgoing") in new stack
    -- Executing [s@macro-faxversand:7] Set("SIP/1098-0000010d", "faxfile=a.tif") in new stack
    -- Executing [s@macro-faxversand:8] Set("SIP/1098-0000010d", "FAXOPT(headerinfo)=Volker Lange-Janson") in new stack
    -- Executing [s@macro-faxversand:9] Set("SIP/1098-0000010d", "FAXOPT(localstationid=1094") in new stack
    -- Executing [s@macro-faxversand:10] SendFAX("SIP/1098-0000010d", "/var/spool/asterisk/fax/outgoing/a.tif") in new stack
    -- Channel 'SIP/1098-0000010d' sending FAX:
    --    /var/spool/asterisk/fax/outgoing/a.tif
       > 0x73e1d260 -- Strict RTP switching to RTP target address 192.168.1.103:7078 as source
       > 0x73e1d260 -- Strict RTP learning complete - Locking on source address 192.168.1.103:7078

    -- Executing [s@macro-faxversand:11] NoOp("SIP/1098-0000010d", "STATUS: SUCCESS") in new stack
    -- Executing [s@macro-faxversand:12] NoOp("SIP/1098-0000010d", "RESOLUTION: 8031x7700") in new stack
    -- Executing [s@macro-faxversand:13] NoOp("SIP/1098-0000010d", "RATE: 14400") in new stack
    -- Executing [s@macro-faxversand:14] NoOp("SIP/1098-0000010d", "PAGES: 4") in new stack
    -- Executing [s@macro-faxversand:15] NoOp("SIP/1098-0000010d", "ERROR: ") in new stack
    -- Executing [s@macro-faxversand:16] Hangup("SIP/1098-0000010d", "") in new stack
  == Spawn extension (macro-faxversand, s, 16) exited non-zero on 'SIP/1098-0000010d' in macro 'faxversand'
  == Spawn extension (janson, 10941098, 10) exited non-zero on 'SIP/1088-0000010c'

Faxempfänger: Als Empfänger brauchen wir noch ein Fax. Wenn wir keines haben, können wir für Windows das Softphone VentaFax nehmen, in das wir sogar einen SIP-Account eintragen können. Ein Faxmodem ist also nicht unbedingt notwendig. In meinem Fall ist VentaFax mit der SIP-Nummer 1099 anwählbar.

Hier steht mehr über VentaFax und wie man ein SIP-Konto in VentaFax konfiguriert. Die Demo-Version ist kostenlos:

Venta Fax ist ein Softphone für Windows, welches das SIP-Protokoll und den Telefaxbetrieb beherrscht.
Telefax-Betrieb mit einem SIP-Softphone und einem alten Faxgerät – 3.12.2021: Das Verschicken und Empfangen von Telefaxen kommt immer mehr aus der Mode. Mit E-Mails geht es viel schneller und billiger. Zum Testen alter Telefaxgeräte, die in meinem privaten Telefonnetz zum Einsatz kommen, habe ich für die Gegenstelle nach Lösungen gesucht. – weiter