python: crop ไฟล์ pdf

Topic: 
 

มีงานที่จะต้องทำไฟล์เป็น 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

ขนาดเอกสารเป็นปอยต์

ตัวอย่าง

สมมุติว่า lowerLeft-x เป็น x0, lowerLeft-y เป็น y0, upperRight-x เป็น x1, upperRight-y เป็น y1 ตามลำดับ

  • ทำขอบขาวรอบ pdf ขนาด A4 (595 x 842 ปอยต์) โดยเว้นระยะ 5 มม.(ประมาณ 14 ปอยต์)
    x0=-14, y0=-14, x1=595+14=609, y1=842+14=856
    $ ./croppdf.py "-14 -14 609 856" TEMPFILE.pdf OUTFILE.pdf
  • ทำขอบขาวรอบ pdf ขนาด A5 (420 x 595 ปอยต์) โดยเว้นระยะ 5 มม.(ประมาณ 14 ปอยต์)
    x0=-14, y0=-14, x1=420+14=434, y1=595+14=609
    $ ./croppdf.py "-14 -14 434 609" TEMPFILE.pdf OUTFILE.pdf
  • crop จาก A4 เป็น A5 โดยเอกสารขนาด A5 อยู่ตรงกลางและชิดขอบบน
    x0=(595-421)/2=87, y0=842-595=247, x1=87+421=508, y1=842
    $ ./croppdf.py "87 247 508 842" TEMPFILE.pdf OUTFILE.pdf
  • แปลง Letter (612x792) เป็น A4 (595x842) แบบจัดกึ่งกลาง
    x0=(612-595)/2=8, y0=(792-842)/2=-25, x1=612-8=604, y1=792+25=817
    $ ./croppdf.py "8 -25 604 817" TEMPFILE.pdf OUTFILE.pdf
  • แปลง Letter (612x792) เป็น A4 (595x842) แบบจัดชิดซ้าย
    x0=0, y0=(792-842)/2=-25, x1=595, y1=792+25=817
    $ ./croppdf.py "0 -25 595 817" TEMPFILE.pdf OUTFILE.pdf

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

 

Syndicate

Subscribe to Syndicate

Who's online

There are currently 0 users online.