Thanks for the detailed and useful info provided. When using the efax
approach described, is there any record available anywhere that tells
you whether or not the fax was successfully sent or not? Options to
retry if the number is busy ?
thanks
On 23 Jan 2006, at 12:09, Alan Fry wrote:
I was intrigued by the original question and have done some
experiments on this G4 running Mac OS X 10.4.4.
Firstly I set the machine up so as to be able to send faxes from
applications using the Mac OS Print->PDF->Fax PDF… built in
facility. I have a broadband connection (ethernet modem) so it was
necessary to add a serial modem to dial up the remote fax machine's
number. A USB modem left over from the old internet dial-up days
seemed promising.
There is on http://www.apple.com/support/ a very clear concise
document "Mac OS X 10.4: Adding a Bluetooth fax device". Although a
USB modem is not quite the same animal as a Bluetooth modem, the
recipe for the one works for the other. There is no point
rehearsing the 12 steps set out in that document here: anyone
interested should download the Apple document.
Having done this, Print->PDF->Fax PDF was found to work perfectly
with a number of applications, for instance BBEdit. This
established that the machine was capable of sending faxes. However
it does not settle the question of how to send faxes from within a
Perl script. If the document's application is scriptable a fax
might be sent by an AS to work the 'Print' facility, and that AS
could be dispatched from Perl. But that is by no means a good
general solution to the problem.
However 'efax' does offer a more general solution. There are, I
think, various ways to call Unix from Perl. I have tended to write
a shell script for the Unix function, calling that from the Perl
script by 'tell application "Terminal" -- do script() -- end tell'.
So the first step was to get 'efax' working from the terminal.
By default 'efax' expects to find '/dev/cu.modem', which on this
machine does not exist. However 'ls /dev/' revealed (amongst a heap
of stuff) an entry 'cu.usbmodem08141'. Using this in place of the
default results in a command line:
efax -d /dev/cu.modem08141 -t [remote fax number] file.tif
That worked fine. (I am lucky that my ISP, demon, provides me with
a fax number for incoming faxes which it then e-mails to me, which
I can send faxes to myself for test purposes. Otherwise, I suppose,
you would need a local good friend with a fax machine in order to
do the experiments…)
The question then arose how to obtain a faxable version of the
document in question. This is most complex part of the problem
simply because of the huge number of possible document formats. In
my own small world I restrict the range to Postscript and PDF
documents. Postscript is useful because firstly one can very easily
output '.ps' files from Perl (for instance the perl script 'pod2ps'
does this) and secondly within Mac OS X every application can save
its document as a PDF file. Hence, On the whole, I need only deal
with '.ps' and '.pdf' files.
The question then arises as to how to convert these formats to G3
compressed '.tiff' files required by 'efax'. Now there is a
companion to 'efax' by the name of 'efix' which can do this but I
must confess so far I have been unable to make it work. However it
appears that it is effectively a front end for ghostscript, and
therefore it seems to me more sensible to use 'gs' directly. Even
if one opts to use 'efix' ghostscript must be installed. The mantra
for converting a file to a faxable format is:
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=tiffg3 -dTextAlphabits=4 -
dGraphicsAlphaBits=4 -sOutputFile=outfile infile
Obviously one has complete freedom of choice about the outfile name
and extension, but 'gs' determines the infile format from the
infile extension I believe. By this means '.ps', '.pdf', '.txt' and
a whole heap of graphics formats can be converted to fax format.
Again, from Perl a shell script can be invoked by a AppleScript
call to the Terminal.
As Bill Stephenson says below there is a front end for both 'efax'
and 'efix' going under the name 'fax'. The command 'fax make file'
will produce a fax format file with the same name as file with .
001, .002 etc. appended. It uses 'efix', which in turn uses 'gs'. I
can see no advantage in this. Indeed there are snags with 'fax':
for instance it expects a US letter page size and truncates an A4
postscript page. There appears to be no way of controlling page
size. Similarly the commmand 'fax send file' fails because it uses
'efax' with all default settings, including the default serial
modem. There appears to be no way of overriding the 'efax' defaults
from 'fax'.
I have not tried (yet) the suggestion of piping a file to 'lpr' --
certainly the serial modem appears in 'lpinfo' -- so it might well
work. However I think everything you might want to do from within
Perl can be done quite simply by firstly using 'gs' to convert the
file to faxable format and sending the fax by 'efax'. In both cases
a suitable shell script can be invoked from within a perl script by
an AppleScript 'do script' command.
I hope this may be of interest to some with my apologies to those
>not< interested in faxing from Perl for his long spiel.
Alan Fry
On 18 Jan 2006, at 09:10, Robert Whittle wrote:
I managed to get perl to send faxes using the 'fax' front-end
program, but never satisfactorily. I had to use root user to send
faxes and I never managed to send any faxes that has graphics in
the. In the end I installed PageSender, which has examples of
sending faxes via AppleScript, and I called the AppleScript from
perl. I know that sounds a lot more round-about but it had a lot
of advantages for me. I could send HTML files, correctly formated,
and there is a record kept which you can view in the GUI of all
faxes send, or not.
If you do get something working, I'd be very interested to know
how you got it done
Robert Whittle
On 18 Jan 2006, at 08:29, Dominic Dunlop wrote:
On 2006–01–17, at 20:29, Bill Stephenson wrote:
Is there a way to fax a document using the built-in Mac OSX
(10.3) fax feature with perl?
Well, the command-line program underlying the facility is efax.
There's also a simplified front-end program, fax. You could try
calling either of those with system() or whatever. Alternatively,
CUPS makes the fax modem visible as a printer once it's
configured -- run lpinfo -v and you should see it listed. This
means that you should be able simply to pipe the stuff you want
to fax to lpr. The trick would be to work out what option you
need to put on the command line in order to get the number
dialled, and acceptable formats for the data. (Text is probably
OK. Beyond that, I've no idea.)
Not that I've tried either possibility myself.
I want to write a script that faxes selected members of congress
my humble opinions ;)
A laudable aim.
--
Dominic Dunlop