Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

In tài liệu hai mặt tại nhà với tập lệnh Bash đơn giản này

Chúng tôi có một máy in laser tại nhà. Máy in màu Hewlett Packard LaserJet Pro CP1525nw này là một kiểu máy cũ hơn, nhưng nó là một con ngựa tuyệt vời có thể in màu sắc và đáng tin cậy. Tôi đã đặt nó trên mạng gia đình của chúng tôi cách đây vài năm bằng cách sử dụng Raspberry Pi của chúng tôi làm máy chủ in.

LaserJet là một bổ sung tuyệt vời cho văn phòng tại nhà của tôi. Kể từ khi thành lập công ty của mình vào năm ngoái, tôi đã dựa vào chiếc máy in laser nhỏ này để in tài liệu phát tay và các tài liệu khác cho các cuộc họp khách hàng, hội thảo và các buổi đào tạo.

Điểm hấp dẫn duy nhất của tôi với máy in này là nó chỉ in một mặt. Nếu bạn muốn in hai mặt, bạn cần thiết lập lệnh in tùy chỉnh để tự thực hiện. Điều đó thật bất tiện và yêu cầu các bước thủ công. Trong LibreOffice, tôi cần thiết lập cụ thể lệnh in để in các trang có số lẻ trước, sau đó tải lại giấy trước khi in các trang được đánh số chẵn ở mặt khác — nhưng theo thứ tự ngược lại.

In tài liệu hai mặt tại nhà với tập lệnh Bash đơn giản này

Nếu tôi cần in một bản PDF mà ai đó đã gửi cho tôi, thì quá trình này cũng giống như vậy. Đối với tài liệu bốn trang, trước tiên tôi cần in trang 1 và 3, sau đó tải lại giấy và in trang 2 và 4 theo thứ tự ngược lại. Trong hộp thoại in GNOME, bạn cần chọn "Thiết lập Trang" để in các trang lẻ hoặc trang chẵn.

In tài liệu hai mặt tại nhà với tập lệnh Bash đơn giản này

In tài liệu hai mặt tại nhà với tập lệnh Bash đơn giản này

Bất kể tôi in bằng cách nào, quy trình tổng thể là in các trang được đánh số lẻ, tải lại chồng trang đã in vào khay giấy, sau đó in các trang có số chẵn theo thứ tự ngược lại. Nếu tôi đang in một tài liệu bốn trang, việc in các trang được đánh số chẵn theo thứ tự ngược lại có nghĩa là trang 4 được in ở mặt sau của trang 3 và trang 2 được in ở cuối trang 1. Hãy tưởng tượng sự thất vọng của tôi trong một vài trường hợp khi tôi quên chọn tùy chọn in theo thứ tự ngược lại khi in các trang được đánh số chẵn và làm hỏng một lệnh in dài.

Tương tự, bạn rất dễ quên cách xử lý các tài liệu có số trang lẻ. Trong tài liệu năm trang, trước tiên bạn in các trang 1, 3 và 5. Nhưng khi tải lại các trang đã in vào máy in, bạn không muốn trang 5. Thay vào đó, bạn chỉ muốn tải các trang 1 và 3. Nếu không. , trang 4 sẽ in ở mặt sau của trang 5, trang 2 sẽ in ở mặt sau của trang 3 và không có gì được in ở mặt sau của trang 1.

Để làm cho mọi thứ dễ dàng hơn và đáng tin cậy hơn, tôi đã viết một tập lệnh Bash đơn giản để tự động hóa việc in hai mặt. Về cơ bản, đây là một trình bao bọc để in các trang có số lẻ, nhắc tôi tải lại các trang (và xóa trang cuối cùng nếu cần), sau đó in các trang được đánh số chẵn.

Bất cứ khi nào tôi cần in tài liệu dưới dạng hai mặt, trước tiên, tôi chuyển đổi tài liệu đó sang PDF. Điều này rất dễ thực hiện. Trong LibreOffice, có một biểu tượng thanh công cụ để xuất trực tiếp dưới dạng PDF. Bạn cũng có thể điều hướng trong Tệp— Xuất dưới dạng — Xuất dưới dạng PDF để làm cái tương tự. Hoặc trong bất kỳ ứng dụng nào khác, thường có nút Lưu vào PDF tính năng. Khi nghi ngờ, GNOME hỗ trợ in sang tệp PDF thay vì máy in.

In tài liệu hai mặt tại nhà với tập lệnh Bash đơn giản này

In tài liệu hai mặt tại nhà với tập lệnh Bash đơn giản này

Cách hoạt động

Khi tôi đã lưu sang PDF, tôi để tập lệnh Bash của mình làm phần còn lại. Điều này thực sự chỉ tự động hóa lpr lệnh để làm cho việc in ấn dễ dàng hơn. Nó in các trang lẻ trước tiên, nhắc tôi tải lại giấy, sau đó in các trang chẵn. Nếu tài liệu có số trang lẻ, nó cũng nhắc tôi bỏ trang cuối cùng khi tải lại các trang đã in. Nó khá đơn giản.

Phần "lập trình" duy nhất của tập lệnh là xác định số lượng trang và tìm xem đó là số chẵn hay lẻ. Cả hai đều dễ thực hiện.

Để xác định số lượng trang, tôi sử dụng pdfinfo yêu cầu. Điều này tạo ra thông tin hữu ích về một tài liệu PDF. Đây là một số kết quả mẫu:

$ 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

Đầu ra đó rất dễ phân tích cú pháp. Để tính số trang, tôi sử dụng tập lệnh một dòng AWK để tìm kiếm Trang: và in trường thứ hai.

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

Để tìm hiểu xem đây là số lẻ hay số chẵn, tôi sử dụng modulo (% ) toán tử số học để chia cho hai và cho tôi biết phần dư. Mô-đun của hai sẽ luôn bằng 0 đối với số chẵn và một đối với số lẻ. Tôi sử dụng bài kiểm tra đơn giản này để xác định xem tài liệu có số trang lẻ hay không, vì vậy tôi cần xóa trang cuối cùng trước khi in phần còn lại của tài liệu:

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

Cùng với đó, viết print-duplex.sh Tập lệnh bash là một vấn đề đơn giản khi gọi lpr với các tùy chọn chính xác để gửi đầu ra đến máy in của tôi ( lpr -P "HP_LaserJet_CP1525nw" ), để in các trang được đánh số lẻ ( -o page-set =retail ) hoặc các trang được đánh số chẵn ( -o page-set =Even ) và in theo thứ tự ngược lại ( -o outputorder =reverse ).

Tập lệnh 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"