13. ปัจฉิมลิขิต

ยังเรียบเรียงไม่หมด ยังขาดอีก 4 เรื่อง ที่ยังไง ๆ ก็ไม่แปลเด็ดขาด เพราะท่านที่อ่านจนมาถึงตรงนี้ได้ก็คงเก่งภาษาอังกฤษกว่าผมแล้ว :D
คือ

หวังว่าคงจะมีท่านผู้ใจบุญมาปรับปรุงให้บทความนี้สมบูรณ์ขึ้น และได้อำนวยประโยชน์สุขแก่ผู้อ่านทุกท่าน เทอญ.

ตัวอย่างการใช้ไพธอนทำห้องแสดงภาพผ่านเว็บ

ทำห้องแสดงภาพผ่านเว็บด้วยไพธอนอย่างง่าย
ความต้องการคือ

  • โยนภาพใส่ไดเรกทอรี่ (ด้วยมือ คือใช้เชลล์คัดลอกเอาเอง) แล้วให้โปรแกรมจัดการลดขนาดและสร้างภาพเล็กสำหรับแสดง
  • เก็บไฟล์ภาพเหมือนระบบไฟล์ปกติ เพื่อไม่ให้ระบบไฟล์ซับซ้อนเกินไป
  • ไม่แตะต้องไฟล์ภาพต้นฉบับ และต้องสามารถเข้าถึงได้
  • หมุนภาพอัตโนมัติ และให้มีหน้า admin สำหรับหมุนภาพในภายหลัง ในกรณีที่เป็นภาพที่ไม่มีข้อมูล Exif

ใช้มอดูล wsgi, Image และเรียกใช้โปรแกรมภายนอกคือ imagemagick

เริ่มด้วยติดตั้งแพกเกจ และเปิดใช้มอดูล wsgi

# aptitude install apache2 libapache2-mod-wsgi python-imaging imagemagick
# a2enmod wsgi

สมมุติว่ารากของ apache2 อยู่ที่ /var/www
เราจะให้ url ของห้องแสดงภาพเป็น http://www.example.com/pythongal
และเนื่องจากเราทำแบบง่าย จึงตัดเรื่องบัญชีผู้ใช้ออก ลักไก่ให้หน้าของ admin เป็น http://www.example.com/.admin-pythongal ซึ่งกำหนดในโปรแกรม

ติดตั้งโปรแกรมโดยแปลงตัวเป็น www-data ก่อน

# su www-data

ไปที่ไดเรคทอรี่ของ apache2 ดาวน์โหลดโปรแกรม ติดตั้งและปรับข้ออนุญาตให้เรียบร้อย

$ cd
$ wget http://www.thaitux.info/files/py/pythongal-511002.tar.gz
$ tar xfz pythongal-511002.tar.gz
$ chmod -R 755 pythongal

เสร็จแล้ว
ถ้าเราเอาอะไรใส่เข้าในไดเรกทอรี่ /var/www/pythongal เขาจะจัดการลดขนาดภาพและสร้างภาพเล็กให้เอง โดยเก็บไฟล์เหมือนระบบไฟล์ปกติ

ปรับแต่งหน้าตาของ html จากไฟล์ template.html
และปรับ css ที่ไฟล์ style.css
ปรับคุณสมบัติของโปรแกรมจากตัวแปรที่หัวไฟล์

ลองทดสอบหน้าตัวอย่างได้ที่ www.thaitux.info/pythongal
และหน้า admin สำหรับหมุนภาพที่ www.thaitux.info/.admin-pythongal

python: crop ไฟล์ pdf

มีงานที่จะต้องทำไฟล์เป็น pdf เพื่อส่งโรงพิมพ์ งานนี้ทำจาก Word ในวินโดวส์ พิมพ์ลงไฟล์โดยใช้ไดรเวอร์เครื่องพิมพ์ Image Setter แล้วจึงแปลงเป็น pdf ด้วยลินุกซ์ ด้วยคำสั่ง ps2pdf12 ซึ่งเลือกรุ่น 1.2 เพราะต้องการความเข้ากันได้

แต่เนื่องจากขนาดกระดาษของงานเป็นขนาด A5 จึงต้องเลือกพิมพ์เป็น A4 แทน

ปัญหาคือตัวโปรแกรม ps2pdf ซึ่งไปเรียกใช้ ghostscript (gs) อีกทีนึง ไม่สามารถ crop ขนาดจาก A4 เป็น A5 ได้ (จริง ๆ แล้วอาจทำได้ แต่ค้นคำสั่งไม่พบ และโรงพิมพ์ต้องการงานขนาด A5 แบบมีขอบขาวเว้นไว้ด้านละ 3 มม. ซึ่งคงจะใช้คำสั่ง gs ยาก)

ค้นไปค้นมา พบมอดูลไพธอนที่จะทำงานนี้ได้ คือมอดูล pyPdf

เริ่มเลยแล้วกัน

ติดตั้งมอดูล pyPdf

$ sudo aptitude install python-pypdf

เขียนสคริปต์ ตั้งชื่อว่า croppdf.py

$ vi croppdf.py
#!/usr/bin/env python
#prerequisites: aptitude install python-pypdf

import sys
import pyPdf

def usage(progname):
    print """
usage: %s "lowerLeft-x lowerLeft-y upperRight-x upperRight-y" infile.pdf outfile.pdf
""" % progname
    sys.exit(1)

try:
    argl = [ int(i) for i in sys.argv[1].split(" ") if i ]
    infile = sys.argv[2]
    outfile = sys.argv[3]
    inpdf = pyPdf.PdfFileReader(file(infile,"rb"))
    outpdf = pyPdf.PdfFileWriter()
    for i in range(inpdf.numPages):
        page = inpdf.getPage(i)
        page.mediaBox.upperRight = tuple(argl[2:])
        page.mediaBox.lowerLeft = tuple(argl[:2])
        outpdf.addPage(page)

    outstream = file(outfile, "wb")
    outpdf.write(outstream)
    outstream.close()

except:
    usage(sys.argv[0])
$ chmod 755 croppdf.py

(พอดีเป็นงานด่วน เลยเขียนแบบด่วนจริง ๆ)

ขั้นตอนการแปลงคือ

1. แปลงจาก ps เป็น pdf ด้วยคำสั่ง ps2pdf12

$ ps2pdf12 INFILE.ps TEMPFILE.pdf

2. crop เป็นขนาด A5 แบบมีขอบขาวข้างละ 3 มม. (ประมาณ 9 px)

$ ./croppdf.py "75 238 523 850" TEMPFILE.pdf OUTFILE.pdf

ตัวเลข 4 ตัวคือค่าเป็นปอยต์ (pt) ของ x-มุมล่างซ้าย y-มุมล่างซ้าย และ x-มุมบนขวา y-มุมบนขวา ตามลำดับ หาได้โดยการ
แปลงจาก มม. โดยคูณด้วย 2.8378
หรือแปลงจากนิ้ว โดยคูณด้วย 72

สามารถดูขนาดเอกสารเป็นปอยต์ได้ด้วยคำสั่ง pdfinfo FILENAME.pdf

แถมอีกตัวอย่างนึง
ทำขอบขาวรอบ pdf ขนาด A4 (595x842 ปอยต์) โดยเว้นระยะ 5 มม. (ประมาณ 14 ปอยต์) โดยรอบ

$ ./croppdf.py "-14 -14 609 856" TEMPFILE.pdf OUTFILE.pdf

เสร็จแล้วครับ