Wednesday, August 10, 2005

gs แปลง PDF ภาษาญี่ปุ่นเป็น PNG

ปกติ gs (GhostScript) สามารถแปลงไฟล์ PS/PDF ให้เป็นรูปแบบอื่นๆ เช่น GIF, PNG ฯลฯ ได้อยู่แล้ว โดยกำหนดตัวเลือก -sDEVICE=... ซึ่งรายชื่อ Device ที่สนับสนุนก็ดูได้จาก gs -help ส่วนชื่อไฟล์ปลายทางก็ระบุโดย -sOutputFile=... ถ้าเอกสาร PDF มีหลายหน้าก็จะได้ออกมาหลายไฟล์ โดยใส่ %d ไว้ในชื่อไฟล์ gs จะใส่เลขหน้าแทนให้เอง

เช่น ในการแปลง PDF เป็น PNG คำสั่งเต็มๆจะเป็น

gs -dNOPAUSE -sDEVICE=png16m -sOutputFile=my-%d.png -- my.pdf
โดย -dNOPAUSE บอกว่าไม่ต้องหยุดรอทีละหน้า ทำไปเรื่อยๆได้เลย และ -- ระบุว่าเสร็จงานแล้วให้ Quit ปิดโปรแกรมไปเลย ไม่งั้น gs จะรอคำสั่งถัดไป

ประเด็นของเรื่องคือ กำลังเอาคำสั่งนี้มาทำ CGI (Servlet) สำหรับแปลง PDF ที่อัพโหลดมาเป็น PNG (หลายไฟล์) แล้ว ZIP ส่งกลับไป ซึ่งใช้งานได้ดีแล้วกับ PDF อังกฤษ แต่ gs บนเครื่องที่ใช้ยังไม่สนับสนุนภาษาญี่ปุ่น เพราะไม่ได้ลงจากชุด Linux ญี่ปุ่น ลองใส่ไฟล์ PDF ญี่ปุ่นเข้าไป มันจะบ่นว่าไม่รู้จักฟอนต์บ้าง ไม่รู้จัก CMap บ้าง ฯลฯ

เท่าที่ค้นๆดู ไปเจอวิธีการ สำหรับ Debian คือ ให้ติดตั้งแพคเกจ ที่ชื่อ gs-cjk-resource และ cmap-adobe-japan1 แต่พอดีเห็นว่ามี cmap-adobe-japan2 ด้วย ก็เลยติดตั้งแถมให้อีกตัว

เริ่มเปิดไฟล์ญี่ปุ่นบางไฟล์ได้แล้ว แต่บางไฟล์ยังติดปัญหา CMAP อยู่ เช่น "90msp-RKSJ-H undefined"

ลองใช้คำสั่ง strace ดู พบว่าขณะทำงาน gs หา CMAP จาก /usr/share/ghostscript/CMap ซึ่งเป็น symlink ไปที่ /var/lib/defoma/gs.d/dirs/CMap/ ก็เลยต้องลอง man defoma เจอว่ามีคำสั่ง defoma-font register-all ซึ่งในการเรียกใช้ต้องการ hint file

ลองเปิดดูเนื้อหาของแพคเกจที่เพิ่งติดตั้ง ด้วยคำสั่ง dpkg -L cmap-adobe-japan1 เห็นว่ามีไฟล์ hints อยู่หลายอัน ปกติเวลาติดตั้งมันน่าจะเรียกคำสั่งติดตั้งที่จำเป็นให้อยู่แล้ว ? ไม่เป็นไร ลองใหม่ไม่น่าจะเสียหาย

defoma-font register-all /etc/defoma/hints/cmap-adobe-japan1.ext.hints
ทุกอย่างผ่านไปอย่างเงียบสงบ ลอง gs อีกที คราวนี้เปิดไฟล์ญี่ปุ่นได้แล้ว :) ก็เลยลองทำกับทุกไฟล์ hints
defoma-font register-all /etc/defoma/hints/cmap-adobe-japan1.opt.hints
defoma-font register-all /etc/defoma/hints/cmap-adobe-japan1.std.hints
defoma-font register-all /etc/defoma/hints/cmap-adobe-japan2.hints
ปรากฏว่าสองคำสั่งสุดท้าย มันบอกว่าถูก Register ไว้เรียบร้อยแล้ว อาจจะตอนติดตั้งแพคเกจ apt-get install แต่ดันทำให้ไม่ครบ ?

สุดท้ายยังพบว่ามีปัญหากับบางไฟล์ PDF อยู่ดี ซึ่งบางทีต้องเปิดด้วย gs-gpl (Ghostscript 8.15) ซึ่งบน Debian เป็นคนละเวอร์ชั่นกับ gs (Ghostscript 7.07.1) เฉยๆ นอกจากนี้ยังมี gs-afpl อีกอันด้วย เยอะจนใช้ไม่ถูก ฟอนต์ญี่ปุ่นที่ใส่ไปเมื่อกี้ ดูเหมือนจะไม่มีผลกับ gs-gpl อีกต่างหาก

สงสัยเอา Linux ญี่ปุ่นมาลงแต่แรกน่าจะง่ายกว่า ? เดี๋ยวต้องลองบน Knoppix-JP

No comments: