Friday, September 16, 2005

หมุนภาพเอกสาร PDF ที่มาในแนวนอน

ผู้ใช้รายงานกลับมาว่า โปรแกรมที่ใช้ GS แปลง PDF เป็นรูปภาพที่วันก่อนทำเอาไว้ มันแสดงภาพไฟล์ PDF ที่สร้างมาในแนวนอนไม่ถูกต้อง คือไม่หมุนภาพให้อยู่ในแนวนอนด้วย ก็เลยลองสร้าง PDF แนวนอนขึ้นมาทดสอบ โดยใช้ PowerPoint พิมพ์ใส่ Acrobat แบบ 1 สไลด์/1 หน้า

เปิดดูใน Acrobat ก็อยู่ในแนวนอนสวยดี

แต่ไฟล์ PDF นี้เมื่อเอาไปผ่าน gs แบบที่เคยเขียนไว้แล้ว จะได้ PNG ออกมาแบบนี้

ซึ่งมันก็ควรเป็นแบบนี้ เพราะ gs มันสร้างไฟล์สำหรับไปพิมพ์ด้วยเครื่องพิมพ์ สำหรับเครื่องพิมพ์แล้ว ไม่ว่าเอกสารจะแนวนอนหรือแนวตั้ง เครื่องพิมพ์มันไม่สนใจ ตัวข้อมูลมันก็ต้องเหมือนๆกันตลอด ในแนวใดแนวหนึ่ง (ในกรณีนี้คือแนวตั้ง)

ลองไฟล์ PDF นี้ด้วย gv มันหมุนให้ถูกต้องแฮะ ทำได้ไง ?

ค้นๆเน็ตดู ทีแรกหาโดยคำว่า Rotate PDF ไม่ค่อยเจออะไร ต้องค้นด้วย Orientation ถึงจะเจอเยอะหน่อย สรุปว่าข้อมูลทิศทางของหน้ากระดาษของ PDF มันเก็บอยู่ในส่วนที่เรียกว่า DSC (Document Structuring Conventions) ของ PostScript ถ้าเปิดดูจะเห็นเป็น Comment ของ PS/PDF (บรรทัดที่ขึ้นต้นด้วย %)

ลองใช้ strace ไล่ gv หาบรรทัดที่เรียก system call exec??() หรือ system() อยากรู้ว่า gv เรียก gs ด้วยตัวเลือกอะไรพิเศษหรือเปล่า ก็ไม่พบอะไรผิดสังเกต

ทีแรกไม่เห็น gv เรียก gs เลยด้วยซ้ำไป ต้องสั่ง strace -f จึงจะเห็น เพราะ gv สร้าง Thread ขึ้นมาก่อนด้วย clone() แล้วจึง exec??() ตัวเลือก -f บอกให้ strace ไล่ตามไปถึง Process ลูกหลานด้วย

ดูดีๆ เห็น gv มันไปเรียกโปรแกรม pdf2dsc ด้วย (ซึ่งก็เป็น shell script ที่ไปเรียก gs ด้วยโปรแกรม PS สำหรับแกะ DSC ออกมาจาก PDF อีกที)

ตกลงก็เลยแก้โปรแกรมให้เรียก pdf2dsc ก่อน แล้วก็อ่านไฟล์ DSC ที่ได้ ดูว่าหน้าไหนเป็นแนวนอน (มี comment เขียนไว้ว่า %%PageOrientation: Landscape) ก็ให้หมุนภาพที่ได้มาจาก gs ด้วย ImageMagick อีกที ด้วยคำสั่ง

convert -rotate 90 in.png out.png

No comments: