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:
- Dùng Regular Expression để quét tài liệu fax tìm số_fax_nhận
- 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'`