piFAX và Samba + lpr = sambaFAX

Windows có thể dùng máy in trên RPi chia sẻ qua samba. Máy in này có thể là thật hay là ảo, tuy nhiên dù thể nào cũng phải cần đến trình quán lý in. Ta có thể chọn lựa giữa CUPS và lpr.

Cài đặt lpr qua dòng lệnh:

apt-get install lpr

Chúng ta có thể cài đặt một máy in ảo. In ra máy in này thì dữ liệu sẽ được chuyển sang máy fax.

Thiết kế này có một vấn đề khó là truyền số_fax_nhận.  Một giải pháp hay dùng là ghi số_fax_nhận trên tài liệu cần fax.

Để việc nhận dạng số fax dễ dàng, người ta qui ước định dạng tương tự như:

Fax-Nr: [[+xxx.]xxx.]xxxxxxxx

Tuy nhiên, với tài liệu dạng text hay dạng soạn thảo được thì ghi thêm một nhóm từ Fax-Nr không có vấn đề gì, nhưng với hình ảnh hay trang web lại là chuyện khác. Giải pháp là chuyển thành dạng pdf.

Thêm nữa, vì trên Windows có nhiều ứng dụng và định dạng file phong phú mà trên RPi không chắc có thể hiểu được, giải pháp hay là chuyển đổi tài liệu thành dạng PS trước khi fax. Nhưng khi đó hylafax muốn có số fax thì phải giải mã ngược PS thành text. Nếu tài liệu dùng text ascii thì không có vấn đề gì, nhưng nếu là unicode thì rắc rối to.

Ghi số fax vào tài liệu là giải pháp khá gượng ép.

Tiếp theo, giải pháp kỹ thuật căn bản là chặn dữ liệu truyền đến máy in, xử lý dữ liệu và chuyển dữ liệu sang hylafax.

Cài đặt máy in ảo

Mở file /etc/printcap, khai báo máy in ảo

faxlp:\
  :if=/var/spool/hylafax/bin/sambafax:\
  :sh:sf:mx#0:\
  :lp=/dev/null:\
  :sd=/var/spool/lpd:\
  :ff_separator:\
  :bkf:

input filter là script sambafax. Dữ liệu gởi đến máy in sẽ đi qua sambafax trước.

Script sambafax có thể đặt ở nơi khác, thí dụ /mnt/fax, rồi tạo một link đến /var/spool/hylafax/bin/

ln -s /mnt/fax/sambafax /var/spool/hylafax/bin/

Script sambafax làm 2 việc chính:

  1. Dùng Regular Expression để quét tài liệu fax tìm số_fax_nhận
  2. Gọi câu lệnh sendfax

Test:

Tạo script sambafax có nhiệm vụ lưu dữ liệu gởi cho máy in faxlp vào file tạm trên /tmp

#!/bin/bash
faxTmp=/tmp/$$.fx
cat > $faxTmp

Chạy lệnh sau, nếu thấy trêm /tmp có file chứa nội dung của /etc/passwd thì input filter làm việc đúng.

lpr -P faxlp /etc/passwd

Chia sẻ máy in qua samba

Dữ liệu fax nên được chuyển đổi sang PS ở client trước khi gởi đến máy in. Client có đủ phương tiện và khả năng để làm việc này. Ưu và khuyết của giải pháp này đã đề cập bên trên.

Sửa 2 khối sau đây, rồi khởi động lại samba

[global]
   printing = bsd
   printcap name = /etc/printcap
   load printers = yes
   log file = /var/log/samba-log.%m
   lock directory = /var/lock/samba

[printers]
   comment = All Printers
   security = server
   path = /var/spool/samba
   browseable = no
   printable = yes
   public = yes
   writable = no
   create mode = 0700
[SambaFax]
   security = server
   path = /var/spool/samba
   printer name = faxlp
   writable = yes
   public = yes
   printable = yes
   print command = lpr -r -h -P %p %s

Dùng sambafax từ Windows

Sau khi máy in faxlp được chia sẻ qua samba, máy tính Windows cùng lớp mạng sẽ nhìn thấy được máy in này, tuy nhiên chưa thể in được vì thiếu driver. Chúng ta cho faxlp một driver bất kỳ miễn là kết xuất ra PS, thí dụ như Dell 3100cn PS. Chú ý rằng mỗi driver cho một kết xuất khác nhau!

In ra máy in, kết xuất sẽ là dữ liệu PS được truyền cho input filter, là script sambafax

Với các trình soạn thảo căn bản trên Windows, như Notepad++, tài liệu in ra PS vẫn còn đọc được các đoạn ascii thuần túy. Với MS Office, định dạng ngày càng phức tạp, tài liệu in ra PS không còn đọc được các đoạn ascii, ngay cả khi chuyển đổi bằng ps2ascii. Vì vậy giải mã Fax-Nr là một thách thức.

Một cách truyền số fax khác

Truyền số_fax_nhận cho sambafax qua tên file.

Cho dù cấu trúc tài liệu phức tạp thế nào thì khi chuyển đổi sang PS vẫn có các header đọc được (ascii), tương tự như:

%!PS-Adobe-3.0
%%Title: (Microsoft Word - Baotri thang may.docx)
%%Creator: PScript5.dll Version 5.2.2
%%CreationDate: 4/3/2018 12:50:51

Chúng ta truyền số fax nhận vào tên file theo qui ước nhận dạng

Fax-To số_fax_nhận

Header sẽ trở thành

%!PS-Adobe-3.0
%%Title: (Microsoft Word - Baotri thang may (Fax-To 34567890).docx)
%%Creator: PScript5.dll Version 5.2.2
%%CreationDate: 4/3/2018 12:50:51

Ta chọn Fax-To thay vì Fax-Nr: vì tên file không thể có dấu “:”, và ứng dụng tương thích cả 2 cách truyền tên file.

Mấu chốt là regular expression tách số fax từ dữ liệu fax

faxNum=`cat | grep -Poi 'Fax-(?:Nr\s*:|To)\s*(?:(?:\+\d{1,3}[-\.(])?\d{1,3}[-\.)])?\d{6,10}' | sed 's/Fax-Nr\s*:\s*\|Fax-To\s*//i'`

Download

Comments Off on piFAX và Samba + lpr = sambaFAX

Filed under Software

Comments are closed.