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