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
ขนาดเอกสารเป็นปอยต์
- A4 = 595x842
- A5 = 421x595
- เพิ่มเติม : http://en.wikipedia.org/wiki/Paper_size
ตัวอย่าง
สมมุติว่า 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
เสร็จแล้วครับ
- Printer-friendly version
- Log in or register to post comments
- 6021 reads
Recent comments