Friday, November 19, 2004

TryLinux-9: เครื่องพิมพ์ / Xprint

ที่ลองเล่นๆมา ก็แสดงผล และป้อนข้อมูล ภาษาไทย บน TryLinux ได้แล้ว มาลองสั่งพิมพ์กันดูบ้าง

เครื่องพิมพ์

เครื่องพิมพ์ที่ใช้อยู่ เป็น PostScript (Level 3) ของ EPSON ใช้มาหลายปีแล้ว เก่ากว่าตึกออฟฟิสนี่อีกอีก (เพราะขนย้ายมาจากออฟฟิสเก่า) ต่อเข้ากับ LPT1 ของเครื่อง Windows XP ที่ทำเป็น Server ให้สั่งพิมพ์จากเครื่องอื่นๆได้

ก่อนหน้านี้เคยเปิดบริการ TCP/IP Print Server (lpd) บนเครื่อง Windows เอาไว้แล้ว เพื่อให้สั่งพิมพ์จาก Unix ทั้งหลายได้ (เคยใช้จาก Solaris ด้วย)

ความจริงเรื่องเครื่องพิมพ์ ขอให้เป็น PostScript Printer + lpd ก็ไม่ค่อยจะมีปัญหาเรื่อง Driver และการใช้ผ่านเครือข่ายบน OS ทั้งหลายเท่าไร มักจะรู้จักและใช้กันได้หมด

ลอง Cups

บน TryLinux จะตั้งให้พิมพ์ผ่าน lpd อีกก็ได้ แต่อยากลองทำโดยใช้ GUI และเลือกพิมพ์ผ่าน Samba ดูมากกว่า จะได้เป็นประสบการณ์ เพราะก่อนหน้านี้เคยแก้แต่ /etc/printcap (เก่ามาก) ยังไม่เคยเล่น CUPS หรืออะไรที่ใหม่กว่านั้นเลย

เริ่มจากเปิดไปที่ KDE Control Center เลือก Peripherals → Printers แล้วกดปุ่ม Add ก็จะมี "Add Printer Wizard" โผล่ขึ้นมา

ตรงนี้ก็ตอบคำถามไปเรื่อยๆ เลือกว่าเป็น "SMB shared printer (Windows)" กรอก User/Password ที่ใช้บน Windows กรอกชื่อ Workgroup, Server, ชื่อแชร์ของเครื่องพิมพ์ สุดท้ายก็เลือกว่าเป็น "PostScript Printer" ไม่ต้องเลือก Driver อะไร

จากนั้นก็ไปดูว่า Control Center ไปทำอะไรไว้ที่ไหนบ้าง เริ่มจาก /etc/printcap เขียนไว้ว่า

# This file was automatically generated by cupsd(8) from the
# /etc/cups/printers.conf file.  All changes to this file
# will be lost.
epson|EPSON LP8400 PS3:rm=TryLinux:rp=epson:
แปลว่าอย่ามายุ่งกับฉัน epson ที่ถูกเพิ่มเข้ามาก็ดูแปลกๆ ไม่เหมือน printcap ที่เคยเห็น ลอง man lpr ดู เจอตอนท้ายๆว่า
SEE ALSO
  cancel(1), lp(1), lpstat(1), CUPS Software Users Manual
อันนี้เลยแน่ใจว่ามีอะไรที่ไม่เหมือนเดิม เพราะปกติแล้ว คำสั่ง lpr จะอยู่ในกลุ่มเดียวกับ lpq, lprm ใน SunOS (BSD) ซึ่งเป็นชุดคำสั่งคนละระบบกับ lp, lpstat, cancel ใน Solaris

นี่สั่ง man lpr ดันบอกให้ไปดู lp แสดงว่า CUPS มันทำคำสั่งเหล่านี้ขึ้นมาทดแทน สำหรับผู้ใช้จากทั้งสองระบบ ลองสั่ง lsof -i ดู ก็ไม่เห็นมีใครรออยู่ที่ Port ปกติของ printer คือ 515 และไม่มี Process ชื่อ lpd

มีแต่ cupsd รันให้บริการอยู่ที่ Port ipp (Internet Printing Protocol) คือ 631 แทน แสดงว่าเขาเลิกใช้ lpd กันหมดแล้ว ถ้าต่อเครื่องพิมพ์เข้ากับ Linux ยุคนี้ แล้วอยากพิมพ์จาก Solaris เก่าๆจะทำไงดีเนี่ย ? เอาไว้ค่อยหาทางออกเมื่อถึงเวลา :)

cupsd

เมื่อกี้เขาบอกให้ไปดู /etc/cups/printers.conf ปรากฏว่าไปเจอ

<DefaultPrinter epson>
Info EPSON LP8400 PS3
Location Hui Desk
DeviceURI smb://username:password@WORKGROUP/servername/EPSON
State Idle
Accepting Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
</Printer>
ดูแล้วเข้าใจง่ายดี DeviceURI ก็ตรงไปตรงมา ตอนแรกคิดว่าเป็น XML แต่ไหงเริ่มด้วย <DefaultPrinter epson> แล้วลงท้ายด้วย </Printer> ? เอาเหอะ ใช้ได้ก็พอแล้ว

ในเมื่อ lpr ทั้งหลายถูกแทนด้วยตัวปลอมจาก CUPS แล้ว ไอ้ไฟล์ /etc/printcap จะมีไว้ทำไม ? เวลาเรียก lpr มันก็น่าจะต่อไปที่ CUPS เลยนี่ หรือไม่ก็ดูแค่ /etc/cups/printers.conf ไม่มายุ่งกับ /etc/printcap อีกต่อไปแล้ว

ทดลอง strace lpr a.ps >& foo แล้วดูใน foo ดูเหมือนไม่มีการเปิดไฟล์ /etc/printcap และ /etc/cups/printers.conf แต่ต่อไปที่พอร์ต IPP แล้วก็ส่งภาษา HTTP ไปว่า

send(4, "POST / HTTP/1.1\r\n", 17, 0)   = 17
send(4, "Content-Length: 137\r\n", 21, 0) = 21
send(4, "Content-Type: application/ipp\r\n", 31, 0) = 31
send(4, "Host: localhost\r\n", 17, 0)   = 17
มั่วเอาเองว่าคงเก็บไฟล์ /etc/printcap เอาไว้ให้โปรแกรมโบราณดูว่ามีเครื่องพิมพ์ชื่ออะไรให้ใช้ได้บ้าง จากนั้นโปรแกรมโบราณเหล่านั้นก็สั่งพิมพ์ด้วย lpr ตัวปลอมอยู่ดี

ทดลองพิมพ์

เริ่มจากไฟล์ PostScript ง่ายๆ ใช้ a2ps สร้างออกมา

$ a2ps -o a.ps .cshrc
$ lpr a2ps
ได้ .cshrc พิมพ์ออกมาเรียบร้อย สวยงาม ลองค้นดูคำสั่งเกี่ยวกับพิมพ์ที่ใช้บ่อยๆก็มีอยู่ครบ เช่น psnup (ทำหลายหน้าในแผ่นเดียว), psselect (เลือกออกมาบางหน้า) สมัยก่อนใช้คำสั่งพวกนี้บ่อย เพราะได้ไฟล์มาเป็น PS เดี๋ยวนี้กลายเป็น PDF กันหมดแล้ว สั่งบน Acrobat แทน

OpenOffice TLE

ในเมื่อ lpr ใช้ได้แล้ว โปรแกรมโบราณทั้งหลายคงไม่มีปัญหาในการพิมพ์ ลองโปรแกรมยุคใหม่แบบ OpenOffice หรือโปรแกรมที่ใช้ KDE หรือที่ใช้ฟอนต์ TrueType ผ่าน FreeType ฯลฯ ดูบ้าง ดูซิว่าจะพิมพ์ยังไง ?

  • OpenOffice TLE พิมพ์ได้ไม่มีปัญหา เลือกฟอนต์ TrueType ที่มากับ KNOPPIX-TH เช่น JS-Charnchai หรือฟอนต์ที่ใส่ไว้ใน .fonts ส่วนตัว เช่น Angsana New ก็พิมพ์ได้ มีปัญหาตรงที่ว่า ถ้าเป็นฟอนต์จาก NECTEC เช่น Norasi วรรณยุกต์จะลอยละลิ่ว ทั้งบนจอและบนกระดาษ (JS-Charnchai กับ Angsana New ไม่ลอย)

    ที่ใช้อยู่เป็น OpenOffice TLE 1.1.0 เห็น Otto บอกว่าเขาแก้ปัญหานี้แล้วในรุ่นใหม่ล่าสุด (ไม่รู้เลขเท่าไร) อีกปัญหาหนึ่งคือตัวอักษรในเมนู และ Dialog ทั้งหลายโตมาก เช่น เปิด Print Dialog นี่ ทะลุจอ 1024x768 ที่ใช้อยู่ตกจอไปเลย

  • Konqueror ก็พิมพ์ได้ ทั้งไทยและอังกฤษ แต่ไม่ได้ลองหลายๆฟอนต์เพื่อดูว่าแตกต่างกันหรือไม่อย่างไร เท่าที่ทดสอบ Tahoma ก็พิมพ์ออกมาดี มีปัญหาหน่อยตอนเปิดดูหน้า นสพ.ผู้จัดการ มันดูบนจอได้ แต่พิมพ์ไม่ออก ตรงที่เป็นตัวอักษรไทยว่างเปล่า

    คิดว่าเป็นปัญหาของ Konqueror ในการวาดอักษรไทยไปที่เครื่องพิมพ์มากกว่า และเกิดกับหน้าที่ซับซ้อน เช่น ผู้จัดการ เท่านั้น ลองหน้าง่ายๆ เช่น Linux.Thai.Net พบว่าภาษาไทยพิมพ์ได้ดี ไม่มีปัญหาอะไร

  • FireFox 1.0 ภาษาอังกฤษพิมพ์ได้ดี แต่ภาษาไทยพิมพ์ไม่ได้ คือ กลายเป็น PostScript Error ลองให้พิมพ์ใส่ไฟล์ PS แล้วเปิดดูด้วย GhostScript ปรากฏว่ามันไม่ได้ฝังฟอนต์ไทยมาให้ ก็เลยเจอแต่ฟอนต์ไม่รู้จัก พิมพ์ไม่ออก

    เดี๋ยวไปลอง XPrint (ยังไม่แน่ใจว่าคืออะไร เล่นยังไง) แล้วค่อยมาเขียนต่อ

อะไรคือ X-Print ?

ไปดูเรื่อง แนะนำการใช้ Xprint ปรินต์หน้าภาษาไทยจาก mozilla ของ โต้ง รู้สึกว่าเครื่องพิมพ์ชื่อประหลาดๆแบบนี้เคยเห็นแล้วนี่ ลอง ps aux เจอว่ามี Process ชื่อ /usr/bin/Xprt รันอยู่แล้ว สอบถามได้ความว่ามาจากแพคเกจชื่อ

# dpkg -S /usr/bin/Xprt
xprt-xprintorg: /usr/bin/Xprt
ดูๆแล้ว X-Print ก็เป็นอะไรที่ช่วยให้โปรแกรมที่วาดหน้าจอบน X11 ได้อยู่แล้ว สามารถวาดออกไปที่เครื่องพิมพ์ได้ด้วย ก่อนหน้านี้โปรแกรมบน Unix ส่วนมากจะแสดงผลโดยใช้ X11 แต่พอจะพิมพ์ ต้องมานั่งเขียนออกมาเป็นคำสั่ง PostScript อีกที เลยเกิดปัญหา แสดงผลได้ แต่พิมพ์ไม่ได้ ฯลฯ

โดย X-Print จะทำตัวเป็น X-Server อีกตัว ให้โปรแกรมวาดหน้าจอไปที่นี่ แล้วก็แปลงภาพที่ได้เป็น PostScript (เท่าที่เห็นมี PDF/PCL ด้วย อาจจะอ้อมมาทาง GhostScript อีกที ?) ก่อนส่งต่อไปที่เครื่องพิมพ์อีกที

ประโยชน์ก็ชัดเจน คนทำโปรแกรมประยุกต์บน Unix ไม่ต้องมานั่งทำส่วนสำหรับเครื่องพิมพ์เองอีกต่อไป แค่วาดหน้าจอได้ ก็พิมพ์ได้ (อย่างพวก Qt ก็ทำได้อยู่แล้วนี่หว่า ? คงเป็นอีกทางเลือก) ถ้าจะวาดแผนผังของทั้งหมดก็คงเป็นแบบนี้ (วาดด้วย GraphViz เจ้าเก่า)

ถ้าใช้ Xprint คนทำโปรแกรมประยุกต์ก็ไม่ต้องทำเส้นจาก Application Program ไปที่ PostScript เอง เหมือนกับของ Windows ที่โปรแกรมประยุกต์วาดโดยใช้ GDI แล้วอาศัย Driver แปลงจาก GDI ไปเป็นหน้าจอหรือเครื่องพิมพ์อีกที

ทดลองใช้ X-Print

เปิด Firefox สั่งพิมพ์ไปที่เครื่องพิมพ์ที่ชื่อ xp_ps_spooldir_HOME_Xprintjobs สักพักก็จะได้ไฟล์ที่โฮมของตัวเองใต้ ~/Xprintjobs/ สงสัยว่าโผล่มานี่ได้ยังไง พบว่าคำสั่งสำหรับจัดเก็บไฟล์ไว้ที่นี่จะอยู่ที่ /usr/share/Xprint/xserver/C/print/models/PSspooldir/spooltodir.sh

ลองเอาไฟล์ PS ที่ได้ส่งไปให้เครื่องพิมพ์ lpr xxx.ps ปรากฏว่าพิมพ์ออกมาเหลือแค่ขนาด 1/4 ของกระดาษ !!!

สงสัยว่า DPI จะไม่ถูก หาที่แก้จนไปเจอที่ /etc/Xprint/C/print/attributes/document แก้ความละเอียดของ PSspooldir จาก 300 เป็น 600 DPI ก็จะพิมพ์ได้ออกมาขนาดพอดี A4 ที่ตั้งค่าไว้

# PSspooldir.default-printer-resolution: 300
PSspooldir.default-printer-resolution: 600

เพิ่มเครื่องพิมพ์ของ Xprint

การพิมพ์ออกมาเป็นไฟล์ PS ก่อน แล้วสั่ง lpr อีกที ไม่ค่อยจะสะดวกนัก ดูเหมือนว่าเครื่องพิมพ์ของ Xprint ที่ปรากฏในรายการเครื่องพิมพ์ของ FireFox จะมาจากไฟล์ /etc/Xprint/C/print/Xprinters ก็เลยเข้าไปเพิ่มอีกเครื่อง

Printer epson_xprint
ในไฟล์นี้เห็นเขียนกันอยู่แค่นี้ ! ไม่ยักบอกว่าพิมพ์อะไรยังไง หรือเป็นเครื่องพิมพ์แบบไหน หาต่อไปเรื่อยๆ ดูเหมือนรายละเอียดที่จะให้กำหนดว่าเครื่องพิมพ์ใหม่ epson_xprint นี่เป็นยังไงอยู่ในไฟล์อื่นๆใต้ /etc/Xprint/C/print/attributes/ ลองดยู่สักพักสรุปได้ว่าต้องไปแก้หลายๆไฟล์ ดังต่อไปนี้

ใน /etc/Xprint/C/print/attributes/printer เพิ่ม

epson_xprint.xp-model-identifier: HUIEPSON
epson_xprint.xp-ddx-identifier: XP-POSTSCRIPT
epson_xprint.document-formats-ready: { PostScript 2 }
ใน /etc/Xprint/C/print/attributes/document เพิ่ม
HUIEPSON.default-printer-resolution: 600
แล้วก็ไปสร้าง HUIEPSON เพิ่มใต้ /usr/share/Xprint/xserver/C/print/models โดย
$ cd /usr/share/Xprint/xserver/C/print/models
$ cp -av PSspooldir HUIEPSON
ความจริงเห็นมี PSdefault เหมือนกัน แต่เมื่อกี้พิมพ์โดย PSspooldir สำเร็จไปแล้ว เอาอันชัวร์ๆดีกว่า แล้วก็แก้ไฟล์ HUIEPSON/model-config อีกหน่อย โดยเปลี่ยนคำสั่งสำหรับพิมพ์เป็น
*xp-spooler-command: /usr/bin/lpr -P epson
จากนั้นก็ restart ตัว Xprint ด้วย /etc/init.d/xprint restart และเปิด Firefox ขึ้นมาใหม่อีกที

แค่นี้เครื่องพิมพ์ตัวใหม่ epson_xprint ก็ไปโผล่อยู่ในรายการของ Firefox ลองสั่งพิมพ์ ก็ใช้ได้แฮะ :) หากันวุ่นเลยกว่าจะออกมาได้ อย่าบอกนะว่ามี GUI สำหรับตั้งค่าอยู่ที่ไหน

No comments: