Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

พิมพ์เอกสารสองหน้าที่บ้านด้วย Bash script ง่ายๆ นี้

เรามีเครื่องพิมพ์เลเซอร์ที่บ้าน เครื่องพิมพ์สี Hewlett Packard LaserJet Pro CP1525nw นี้เป็นรุ่นเก่า แต่เป็นเครื่องพิมพ์ที่ยอดเยี่ยมที่สามารถพิมพ์สีได้อย่างน่าเชื่อถือ ฉันใส่ไว้ในเครือข่ายในบ้านของเราเมื่อไม่กี่ปีก่อนโดยใช้ Raspberry Pi เป็นเซิร์ฟเวอร์การพิมพ์

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

สิ่งเดียวที่ฉันตำหนิกับเครื่องพิมพ์นี้คือพิมพ์ด้านเดียวเท่านั้น หากคุณต้องการพิมพ์แบบสองด้าน คุณต้องตั้งค่างานพิมพ์แบบกำหนดเองเพื่อดำเนินการเอง ไม่สะดวกและต้องใช้ขั้นตอนด้วยตนเอง ใน LibreOffice ฉันต้องตั้งค่างานพิมพ์โดยเฉพาะเพื่อพิมพ์หน้าเลขคี่ก่อน แล้วจึงใส่กระดาษใหม่ก่อนที่จะพิมพ์หน้าเลขคู่ในอีกด้านหนึ่ง—แต่ต้องเรียงลำดับกลับกัน

พิมพ์เอกสารสองหน้าที่บ้านด้วย Bash script ง่ายๆ นี้

ถ้าฉันต้องพิมพ์ PDF ที่คนอื่นส่งมาให้ กระบวนการก็เหมือนเดิม สำหรับเอกสารสี่หน้า ฉันต้องพิมพ์หน้าที่ 1 และ 3 ก่อน จากนั้นป้อนกระดาษใหม่และพิมพ์หน้าที่ 2 และ 4 ในลำดับที่กลับกัน ในกล่องโต้ตอบการพิมพ์ GNOME คุณต้องเลือก "ตั้งค่าหน้ากระดาษ" เพื่อพิมพ์หน้าคี่หรือแม้แต่หน้า

พิมพ์เอกสารสองหน้าที่บ้านด้วย Bash script ง่ายๆ นี้

พิมพ์เอกสารสองหน้าที่บ้านด้วย Bash script ง่ายๆ นี้

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

ในทำนองเดียวกัน มันง่ายที่จะลืมวิธีจัดการกับเอกสารที่มีจำนวนหน้าคี่ ในเอกสารห้าหน้า คุณต้องพิมพ์หน้าที่ 1, 3 และ 5 ก่อน แต่เมื่อคุณโหลดหน้าที่พิมพ์ซ้ำในเครื่องพิมพ์ คุณไม่ต้องการหน้า 5 แทน คุณต้องการโหลดเฉพาะหน้าที่ 1 และ 3 เท่านั้น , หน้า 4 จะพิมพ์ที่ด้านหลังของหน้า 5, หน้า 2 จะพิมพ์ที่ด้านหลังของหน้า 3 และไม่มีอะไรถูกพิมพ์ที่ด้านหลังของหน้า 1

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

เมื่อใดก็ตามที่ฉันต้องการพิมพ์เอกสารแบบสองด้าน ฉันจะแปลงเอกสารเป็น PDF ก่อน นี้เป็นเรื่องง่ายมากที่จะทำ ใน LibreOffice มีไอคอนแถบเครื่องมือสำหรับส่งออกเป็น PDF โดยตรง คุณยังสามารถนำทางภายใต้ ไฟล์— ส่งออกเป็น—ส่งออกเป็น PDF ที่จะทำเช่นเดียวกัน หรือในแอปพลิเคชันอื่นๆ มักจะมี บันทึกเป็น PDF ลักษณะเฉพาะ. หากมีข้อสงสัย GNOME รองรับการพิมพ์เป็นไฟล์ PDF แทนเครื่องพิมพ์

พิมพ์เอกสารสองหน้าที่บ้านด้วย Bash script ง่ายๆ นี้

พิมพ์เอกสารสองหน้าที่บ้านด้วย Bash script ง่ายๆ นี้

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

เมื่อฉันบันทึกเป็น 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

ผลลัพธ์นั้นแยกวิเคราะห์ได้ง่ายมาก ในการนับจำนวนหน้า ฉันใช้สคริปต์บรรทัดเดียวของ AWK เพื่อค้นหา หน้า: แล้วพิมพ์ช่องที่ 2

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

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

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

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

สคริปต์ทุบตี

#!/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"