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

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

Taxonomy upgrade extras: 

Comments

คุณ wd เชี่ยวเรื่อง python เลยใช้ python แก้ปัญหาได้เร็วกว่า ถ้าเป็นผม ผมคงพยายามใช้ mpage น่ะครับ

ขอบคุณครับ ได้รับคำแนะนำดี ๆ เสมอ

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้