Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

พิมพ์เอกสารสองหน้าที่บ้านได้ง่ายด้วยสคริปต์ Bash เรียบง่าย

บทนำ

เรามีเครื่องพิมพ์เลเซอร์ที่บ้าน เครื่อง Hewlett Packard LaserJet Pro CP1525nw Color Printer รุ่นเก่า แต่เป็นม้าที่ทำงานหนัก พิมพ์ได้เชื่อถือได้และเป็นสี ผมตั้งมันบนเครือข่ายบ้านเมื่อไม่กี่ปีก่อน โดยใช้ Raspberry Pi เป็น print server

LaserJet เป็นส่วนเสริมที่ยอดเยี่ยมสำหรับห้องทำงานที่บ้าน ตั้งแต่ผมเปิดบริษัทเมื่อปีที่แล้ว ผมพึ่งพาเครื่องพิมพ์เลเซอร์เล็กนี้พิมพ์เอกสารแจกและวัสดุอื่นๆ สำหรับการประชุมลูกค้า เวิร์กช็อป และการฝึกอบรม

ข้อรำควยเดียวของเครื่องนี้คือพิมพ์ได้แค่หน้าเดียว หากต้องการพิมพ์สองหน้า ต้องตั้งค่า custom print job เอง ซึ่งไม่สะดวกและต้องทำขั้นตอนด้วยมือ ใน LibreOffice ผมต้องตั้งค่าพิมพ์หน้าคี่ก่อน แล้วโหลดกระดาษใหม่ก่อนพิมพ์หน้าคู่ด้านหลัง — แต่ในลำดับย้อนกลับ

พิมพ์เอกสารสองหน้าที่บ้านได้ง่ายด้วยสคริปต์ Bash เรียบง่าย

หากต้องพิมพ์ PDF ที่คนส่งมา กระบวนการเหมือนกัน สำหรับเอกสาร 4 หน้า ผมต้องพิมพ์หน้า 1 และ 3 ก่อน แล้วโหลดกระดาษและพิมพ์หน้า 2 และ 4 ในลำดับย้อนกลับ ใน GNOME print dialog ต้องเลือก "Page Setup" เพื่อพิมพ์หน้าคี่หรือหน้าคู่

พิมพ์เอกสารสองหน้าที่บ้านได้ง่ายด้วยสคริปต์ Bash เรียบง่าย

พิมพ์เอกสารสองหน้าที่บ้านได้ง่ายด้วยสคริปต์ Bash เรียบง่าย

ไม่ว่าจะพิมพ์อย่างไร กระบวนการรวมคือพิมพ์หน้าคี่ โหลดกระดาษที่พิมพ์แล้วกลับเข้าไป แล้วพิมพ์หน้าคู่ในลำดับย้อนกลับ หากพิมพ์เอกสาร 4 หน้า การพิมพ์หน้าคู่แบบย้อนกลับหมายถึงหน้า 4 พิมพ์ด้านหลังหน้า 3 และหน้า 2 พิมพ์ด้านหลังหน้า 1 想像ความหงุดหงิดตอนผมลืมเลือกตัวเลือกพิมพ์ย้อนกลับตอนพิมพ์หน้าคู่และทำลายงานพิมพ์ยาวนาน

คล้ายกัน ง่ายที่จะลืมจัดการเอกสารที่มีหน้าเป็นเลขคี่ ในเอกสาร 5 หน้า พิมพ์หน้า 1, 3, 5 ก่อน แต่ตอนโหลดกระดาษกลับเข้าไป ไม่ต้องการหน้า 5 ต้องโหลดแค่หน้า 1 และ 3 มิฉะนั้น หน้า 4 จะพิมพ์ด้านหลังหน้า 5 หน้า 2 ด้านหลังหน้า 3 และหน้า 1 ไม่มีอะไรพิมพ์ด้านหลัง

เพื่อให้ง่ายและน่าเชื่อถือมากขึ้น ผมเขียนสคริปต์ Bash เรียบง่ายที่ทำให้การพิมพ์ duplex เป็นอัตโนมัติ โดยพื้นฐานแล้วเป็น wrapper ที่พิมพ์หน้าคี่ แจ้งเตือนให้โหลดกระดาษ (และนำหน้าสุดท้ายออกหากจำเป็น) แล้วพิมพ์หน้าคู่

เมื่อต้องพิมพ์เอกสารแบบ duplex ผมแปลงเอกสารเป็น PDF ก่อน เรื่องนี้ง่ายมาก ใน LibreOffice มีไอคอน toolbar สำหรับ export เป็น PDF โดยตรง หรือไปที่ File — Export As — Export as PDF ก็ได้ หรือในแอปอื่นมักมีฟีเจอร์ Save to PDF หากไม่แน่ใจ GNOME รองรับการพิมพ์เป็นไฟล์ PDF แทนเครื่องพิมพ์

พิมพ์เอกสารสองหน้าที่บ้านได้ง่ายด้วยสคริปต์ Bash เรียบง่าย

พิมพ์เอกสารสองหน้าที่บ้านได้ง่ายด้วยสคริปต์ Bash เรียบง่าย

วิธีการทำงาน

เมื่อบันทึกเป็น PDF แล้ว ให้สคริปต์ Bash ของผมทำส่วนที่เหลือ มันแค่อัตโนมัติคำสั่ง lpr เพื่อให้การพิมพ์ง่ายขึ้น พิมพ์หน้าคี่ก่อน แจ้งเตือนโหลดกระดาษ แล้วพิมพ์หน้าคู่ หากเอกสารมีจำนวนหน้าเป็นเลขคี่ มันจะแจ้งเตือนให้นำหน้าสุดท้ายออกตอนโหลดกระดาษ มันเรียบง่ายมาก

ส่วน "การเขียนโปรแกรม" เพียงอย่างเดียวคือการหาจำนวนหน้า และตรวจสอบว่าเป็นเลขคี่หรือคู่ ทั้งสองอย่างทำได้ง่าย

เพื่อหาจำนวนหน้า ใช้คำสั่ง pdfinfo ซึ่งสร้างข้อมูลที่มีประโยชน์เกี่ยวกับเอกสาร PDF ตัวอย่างผลลัพธ์:

$ pdfinfo All\ training\ -\ catalog.pdf
Creator: Writer
Producer: LibreOffice 6.3
CreationDate: Fri Oct 18 16:06:07 2019 CDT
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 11
Encrypted: no
Page size: 612 x 792 pts (letter)
Page rot: 0
File size: 65623 bytes
Optimized: no
PDF version: 1.5

เอาต์พุทนี้แยกวิเคราะห์ง่ายมาก เพื่อดึงจำนวนหน้า ใช้ one-liner AWK ค้นหา Pages: และพิมพ์ฟิลด์ที่สอง

pages=$( pdfinfo "$1" | awk '/^Pages:/ {print $2}' )

เพื่อตรวจสอบว่าเป็นเลขคี่หรือคู่ ใช้ modulo operator (%) หารด้วยสองและดูเศษ modulo ของสองจะเป็นศูนย์สำหรับเลขคู่ และหนึ่งสำหรับเลขคี่ ใช้การทดสอบง่ายนี้เพื่อตรวจสอบว่าเอกสารมีหน้าเป็นเลขคี่ จึงต้องนำหน้าสุดท้ายออกก่อนพิมพ์ส่วนที่เหลือ:

if [ $(( $pages % 2 )) -ne 0 ] ; then

ด้วยนั้น การเขียนสคริปต์ print-duplex.sh Bash คือเรื่องเรียบง่ายของการเรียก lpr ด้วยตัวเลือกที่ถูกต้องเพื่อส่งเอาต์พุทไปเครื่องพิมพ์ (lpr -P "HP_LaserJet_CP1525nw") พิมพ์หน้าคี่ (-o page-set=odd) หรือหน้าคู่ (-o page-set=even) และพิมพ์ย้อนกลับ (-o outputorder=reverse)

สคริปต์ Bash

#!/bin/sh
# print-duplex.sh
# simple wrapper to print duplex

cat<<EOF
$1 ($pages pages)
-------------------------------------------------------------------------------
Printing odd pages first
Please wait for job to finish printing...
-------------------------------------------------------------------------------
EOF

lpr -P "HP_LaserJet_CP1525nw" -o page-set=odd "$1"
sleep $pages

cat<<EOF
===============================================================================
Put paper back into the printer in EXACT OUTPUT ORDER (face down in tray)
then press ENTER
===============================================================================
EOF

pages=$( pdfinfo "$1" | awk '/^Pages:/ {print $2}' )

if [ $(( $pages % 2 )) -ne 0 ] ; then
echo '!! Remove the last page - this document has an odd number of pages'
fi

echo -n '>'
read x

cat<<EOF
-------------------------------------------------------------------------------
Printing even pages
Please wait for job to finish printing...
-------------------------------------------------------------------------------
EOF

lpr -P "HP_LaserJet_CP1525nw" -o page-set=even -o outputorder=reverse "$1"