آموزشچگونه

آموزش خط فرمان: قسمت پنجاه و نهم، چاپ در لینوکس (Printing)

Print Friendly, PDF & Email

پس از آن‌که مباحث بسیاری در رابطه با دست‌کاری متن در لینوکس عنوان شد، اکنون زمان آن رسیده تا کمی به چاپ این مطالب بر روی کاغذ بپردازیم.

در این درس و دروس پیش رو ابتدا به ذکر تاریخچه‌ای در لینوکس پرداخته و سپس چندیم فرمان اصلی چاپ در خط فرمان را بررسی خواهیم نمود.

تاریخچه‌ای بر چاپ در لینوکس

به‌منظور درک کامل ویژگی‌های چاپ در سیستم‌عامل‌های یونیکس بایستی کمی تاریخچه چاپ در یونیکس را مرور کنیم. چاپ در سیستم‌های یونیکس به زمان اختراع سیستم‌عامل یونیکس بازمی‌گردد. در آن زمان، چاپگرها و نحوه استفاده از آن‌ها با شکلی که امروزه وجود دارد، کاملا متفاوت بود.

چاپ در دوره تاریک (Dim Times)

درگذشته همانند کامپیوترها، چاپگرها نیز بسیار زرگ . گران‌قیمت و به‌صورت مرکزی بودند. کاربران معمولی کامپیوتر در دهه ۱۹۸۰ بر روی ترمینالی که در فاصله دوری از کامپیوتر قرار داشت، کار می‌کردند. چاپگر نیز در کنار کامپیوتر و تحت نظر اپراتورها قرار داشت.

زمانی‌که چاپگرها گران‌قیمت و مرکزی بودند، بسیار رایج بود که کاربران چاپگر را به‌اشتراک بگذارند. به‌منظور تشخیص این‌که Jobهای چاپگر به شخص خاصی اختصاص دارد، یک صفحه بنر، نام کاربری که Job به وی تعلق داشت را نشان می‌داد.

سپس کارمندان پشتیبانی کامپیوتر، پرینت‌های گرفته شده طول روز را به تک‌تک کارمندان تحویل می‌دادند.

چاپگرهای مبتنی بر کاراکتر

تکنولوژی چاپگرها در دهه ۸۰، از دو منظر تفاوت زیادی با امروزه داشت.

اول این‌که اکثر چاپگرهای آن دوره، چکشی بودند. این نوع چاپگرها از مکانیزمی استفاده می‌کردند که با استفاده از آن، یک روبان بر روی کاغذ ضربه میژد تا کاراکترهای صفحه را ایجاد کند. چاپ Daisy-Wheel و چاپ Dot-Matrix دو تکنولوژی بودند که در آن زمان استفاده می‌شدند.

تفاوت دوم (که تفاوت مهم‌تری است) این بود که چاپگرها در آن دوره از مجموعه کاراکترهایی استفاده می‌کردند که درون خود دیوایس وجود داشتند. به‌عنوان مثال چاپگر Daisy-Wheel فقط قادر به چاپ کاراکترهایی بود که درون Petalهای آن حک و قالب‌بندی شده بود. درواقع با این‌کار چاپگر به یک ماشین تایپ سریع، تبدیل می‌شد. چاپگرها نیز، مانند ماشین‌های تایپ، از فونت‌های Mono-Spaced (به‌معنای فونت‌های با طول ثابت) استفاده می‌کردند؛ بدین معنی که هر کاراکتر همان اندازه را داشت، چاپ در موقعیت‌های ثابت بر روی صفحه انجام می‌شد و نواحی قابل چاپ صفحه، تعدادی کاراکتر ثابت بودند.

اکثر چاپگرها ۱۰ کاراکتر بر اینچ (Character Per Inch) را به‌صورت افقی و ۶ خط بر اینچ (Line Per Inch) را به‌صورت عمودی چاپ می‌کردند. با استفاده از این طرح، یک کاغذ (با فرمت US-Letter) 85 کاراکتر پهنا و ۶۶ خط ارتفاع داشت. با در نظر گرفتن کمی حاشیه بر روی هر طرف، ۸۰ کاراکتر نهایت اندازه طول خطوط بود.

این امر بیان می‌کند که چرا ترمینال‌ها (حتی ترمینال‌های امروزی) به‌صورت پیش‌فرض ۸۰ کاراکتر طول دارند. این ویژگی باعث می‌شود دقیقا همان چیزی را که بر روی تصویر می‌بینید، چاپ نیز دریافت کنید که به آن اصطلاحا WYSIWYG می‌گویند.  WYSIWYGسرنام عبارتWhat You See Is What You Get  است.

داده به یک چاپگر به‌صورت یک جریان ساده از بایت‌هایی که حاوی کاراکترهای چاپ هستند، ارسال می‌شد. به‌عنوان مثال برای چاپ یک کاراکتر ASCII کد ۹۷ ارسال می‌شد. به‌علاوه کدهای کنترل ASCII باعث حرکت کاتریج و کاغذ و در نتیجه ایجاد سرخط، لاین‌فیدها و فرم‌فیلدها می‌شد. با استفاده از کدهای کنترل، می‌توان برخی افکت‌های محدود را (مانند Bold یا Italic کردن فونت) به‌دست آورد.

چاپگرهای گرافیکی

توسعه رابط گرافیکی یا GUI که سرنام عبارت Graphical User Interface باعث ایجاد تغییراتی عمده در تکنولوژی‌های چاپ شد. همان‌طور که کامپیوترها بیش‌تر به‌سمت نمایش‌گرهای تصویری پیش رفتند، چاپ نیز از حالت مبتنی بر کاراکتر به سمت تکنولوژی‌های گرافیکی پیش رفت. این کار با اختراع چاپگرهای ارزان‌قیمت لیزری انجام شد که به‌جای چاپ کاراکترهای با طول ثابت، قادر به چاپ نقطه کوچک در هر کجا از ناحیه صفحه‌چاپ بودند. به تبع آن چاپ فونت‌های نسبی، تصاویر و دیاگرام‌های باکیفیت بالا ممکن شد.

هر چند جابه‌جایی از یک طرح مبتنی بر کاراکتر به یک طرح گرافیکی چالش‌های فنی وحشتناکی را در پی داشت. دلیلش این است که تعداد بایت‌ها برای پر کردن یک صفحه با استفاده از چاپگرهای مبتنی بر کاراکتر را می‌توان به این شیوه محاسبه کرد (فرض کنید ۶۰ خط در صفحه و ۸۰ کاراکتر در سطر) ۶۰ ضرب‌در ۸۰ برابر با ۴۸۰۰ بایت خواهد بود.

در مقایسه با یک پرینتر لیزری با مقیاس DPI (سرنام عبارت Dot Per Inch به‌معنای نقطه بر اینچ) مقدار چاپی ۸ اینچ بر روی ۱۰ اینچ را فرض کنید. نتیجه می‌شود (۳۰۰×۱۰)×(۳۰۰×۸)÷۸ که برابر با ۹۰۰۰۰۰ بایت خواهد بود.

اشکال این‌جا است که بسیاری از کامپیوترهای کند شبکه در آن دوران خیلی ساده قادر نبودند یک مگابایت داده مورد نیاز برای چاپ یک صفحه کامل چاپگر را (به‌دلیل این‌که از نظر سخت‌افزاری و تکنولوژی ضعیف بودند) اداره کنند. پس نیاز بود که اختراعی هوشمندانه‌ای صورت بگیرد.

این اختراع موجب ایجاد Page Description Language (زبان توصیف صفحه) شد. یک زبان توصیف صفحه (PDL) زبان برنامه‌نویسی است که محتویات صفحه‌ای را توصیف می‌کند.

اولین PDL بزرگ PostScript بود که توسط شرکت Adobe توسعه یافت و امروزه هنوز هم به‌صورت گسترده استفاده می‌شود. زبان PostScript یک زبان کامل برنامه‌نویسی است که به‌منظور صفحه‌آرایی و چاپ و دیگر انواع گرافیک ایجاد شد. PostScript به‌صورت پیش‌فرض ۳۵ استاندارد درون‌ساخت، فونت‌های باکیفیت بالا، به‌علاوه توانایی پذیرفتن تعاریف اضافی فونت در زمان اجرا را شامل می‌شود.

اولین پشتیبانی از PostScript درون خود چاپگرها قرار گرفت. این مسئله مشکل انتقال داده را برطرف نمود. درحالی‌که PostScript در مقایسه با پرینترهای مبتنی بر کاراکتر جریان بیتی بیشتری را ایجاد می‌کرد ولی از آن جریان ایجاد شده که برای چاپ در هر نقطه از صفحه برای چاپگرهای لیزری محاسبه کردیم (مقدار ۹۰۰۰۰۰ بایت) بسیار کم‌تر است. چاپگر PostScript یک برنامه PostScript را به‌عنوان ورودی دریافت می‌کند. چاپگر دارای پردازشگر و حافظه Memory خودش هست و یک برنامه ویژه با نام مفسر PostScript را اجرا کرده که این برنامه، ورودی‌های PostScript را خوانده، آن‌ها را پرداخته و درنهایت، نتیجه حاصله را به حافظه داخلی چاپگر می‌دهد. در نتیجه الگوی بیتی (نقطه‌ها برای چاپ) شکل گرفته تا برای چاپ بر روی کاغذ منتقل شوند.

چاپ با لینوکس

سیستم‌های مدرن لینوکس به‌منظور اجرا و مدیریت پرینت، دو مجموعه نرم‌افزار را به‌کار می‌گیرند.

اولی CUPS (سرنام عبارت (Common Unix Printing System به‌معنای سیستم رایج چاپ در یونیکس) که درایورهای پرینتر را فراهم آورده و پرینت Jobها را مدیریت می‌کند.

دومی GhostScript بوده که یک مفسر پست اسکریپت می‌باشد.

CUPS چاپگرها را به‌وسیله ایجاد و نگهداری صف‌های پرینت، مدیریت می‌کند. همان‌طور که در بحث خلاصه تاریخچه عنوان شد، چاپ یونیکس در اصل به‌صورتی طراحی شده تا یک چاپگر اشتراکی مرکزی که بین چندین کاربر به‌اشتراک گذاشته شده را مدیریت کند. از آن‌جایی‌که چاپگرها در مقایسه با کامپیوترها بسیار کند هستند، در نتیجه سیستم‌های پرینت، نیاز به راهی برای برنامه‌ریزی چندین پرینت Job مختلف و سازمان‌دهی کارها را دارند. همچنین CUPS توانایی تشخیص انواع مختلف داده را دارد و همچنین می‌تواند فایل‌ها به فرمت چاپی تبدیل نماید.

مهیا کردن فایل‌ها برای چاپ

ما به‌عنوان کاربران خط فرمان، بیش‌تر تمایل به چاپ متن داریم؛ در صورتی‌که مسلما امکان چاپ دیگر فرمت‌های داده نیز وجود دارد.

فرمان pr (تبدیل فایل‌های متنی برای چاپ)

در درس قبلی، اندکی به فرمان pr پرداختیم. اکنون برخی از دیگر گزینه‌های فرمان pr که مربوط به چاپ می‌شوند را بررسی می‌کنیم. در تاریخچه چاپ دیدم که چاپگرهای مبتنی بر کاراکتر از فونت‌های monospaced استفاده می‌کنند که نتیجه آن به‌وجود آمدن کاراکترهای با اندازه ثابت بود. فرمان pr به‌منظور تغییر متن استفاده می‌شد تا در یک اندازه صفحه به‌خصوص جا بگیرد.

جدول زیر لیست خلاصه‌ای از رایج‌ترین گزینه‌های موجود را نمایش می‌دهد:

فرمان pr اغلب به‌عنوان فیلتری در پایپ قرار می‌گرفت. در این مثال لیستی از دایرکتوری /usr/bin را ایجاد می‌کنیم و سپس آن را با فرمت سه‌ستونه در خروجی نمایش می‌دهیم:

ارسال یک Job به چاپگر

مجموعه چاپ CUPS از دو متد که به‌صورت تاریخی در سیستم‌های یونیکس استفاده می‌شدند، پشتیبانی می‌کند. اولین متد،Berkeley  یا LDP نام دارد (که در توزیع نرم‌افزاریBerkeley  یونیکس استفاده می‌شد) که از برنامه lpr استفاده می‌کند. متد دیگر Sys V نام دارد (که از نسخه یونیکس System V گرفته شده) از برنامه lp استفاده می‌کند. هر دو این برنامه‌ها تقریبا کاری مشابه را انجام می‌دهند و انتخاب یکی بر دیگری به سلیقه شما بازمی‌گردد.

فرمان lpr (چاپ فایل‌ها با استایل Berkeley)

برنامه lpr را می‌توان به‌منظور ارسال فایل‌ها به چاپگرها استفاده کرد. همچنین می‌توان آن را در داخل Pipelineها به‌کار گرفت؛ چرا که ورودی استاندارد را قبول می‌کند. به‌عنوان مثال به‌منظور چاپ نتایج دایرکتوری چندستونه‌ای که در درس قبل بدان اشاره کردیم، می‌توان به‌صورت زیر عمل کرد:

گزارش حاصله از این فرمان به پرینتر پیش‌فرض سیستم ارسال خواهد شد (هرچند در ماشین مجازی ما هیچ چاپگر پیش‌فرضی وجود ندارد) برای ارسال فایل به یک چاپگر دیگر از گزینه –p استفاده خواهیم کرد که به‌صورت زیر است:

lpr -P printer_name

در فرمان بالا printer_name نام چاپگر مورد نظر ماست. برای مشاهده چاپگرهای شناس در سیستم از فرمان زیر استفاده می‌شود:

اگر این فرمان را اجرا کنید، احتمالا مشاهده خواهید کرد که هیچ پرینتری برای سیستم تعریف نشده است. از آن‌جایی‌که در ماشین مجازی هستیم، قرار نیست چاپگر حقیقی را به سیستم اضافه کنیم (مگر دوستانی که تمرین خود را بر روی یک سیستم حقیقی انجام می‌دهند که به یک چاپگر فیزیکی متصل شده است).

بسیاری از توزیع‌های لینوکس به شما اجازه می‌دهند تا چاپگری مجازی تعریف کنید که به‌جای چاپ حقیقی، فایل خروجی را در یک فایل PDF قرار دهد. برنامه cups-pdf نمونه‌ای از این برنامه‌ها است.

جدول زیر لیست گزینه‌های رایج lpr را نشان می‌دهد:

فرمان lp (چاپ فایل‌ها با استایل System V)

فرمان lp همانند فرمان lpr نیز هم فایل‌ها و هم ورودی استاندارد را برای چاپ قبول می‌کند. این فرمان با lpr متفاوت است. از این منظر که برخی گزینه‌های دیگر (معمولا گزینه‌های پیچیده‌تر) را پشتیبانی می‌کند.

جدول زیر لیست گزینه‌های رایج فرمان lp را نشان می‌دهد:

مجددا لیست دایرکتوری خود را اما این بار ۱۲ CPI و ۸ LPI را با یک حاشیه نیم‌اینچی از چپ ایجاد می‌کنیم. به یاد داشته باشید که بایستی به‌منظور محاسبه اندازه صفحه جدید، گزینه‌های pr را مطابقت دهیم:

مانیتورینگ و کنترل Print Jobها

نظر به این‌که سیستم‌های چاپ یونیکس، به‌گونه‌ای طراحی شده‌اند تا چندین Print Job را از چندین کاربر به‌صورت همزمان نگهداری و مدیریت کنند، CUPS نیز به همین صورت طراحی شده است. هر چاپگر یک صف چاپ می‌گیرد؛ به‌صورتی‌که Jobها در داخل این صف پارک می‌شوند تا نوبتشان برسد و برای چاپ ارسال شوند.

CUPS چندین فرمان خط فرمان را ارایه می‌کند که به‌منظور مدیریت وضعیت چاپ و صف‌های چاپگر در نظر گرفته شده‌اند.

فرمان lpstat (نمایش وضعیت چاپ سیستم)

فرمان lpstsat برنامه‌ای مفید برای شناسایی اسامی در دسترس چاپگرها بر روی سیستم می‌باشد.

به یاد دارید که از فرمان lpstsat –a قبلا استفاده کردیم و نتیجه حاصله، وجود یک چاپگر مجازی بر روی سیستم بود:

علاوه بر این، می‌توانیم از گزینه –s استفاده کنیم تا توضیحات بیشتری را درباره پیکربندی سیستم پرینت به‌دست آوریم:

همان‌گونه که مشاهده می‌کنید، سیستم دارای یک چاپگر مجازی با نام cups-pdf می‌باشد.

جدول زیر رایج‌ترین گزینه‌های فرمان lpstat را نمایش می‌دهد:

فرمان lpq (نمایش وضعیت صف چاپگر)

برای مشاهده وضعیت صف یک چاپگر، فرمان lpq را به‌کار می‌بریم. این فرمان به ما اجازه می‌دهد که وضعیت صف و Print Jobهای موجود در آن را نمایش دهیم. این‌جا نمونه مثالی از یک صف خالی برای چاپگر پیش‌فرض مجازی مشاهده می‌شود:

اگر نام هیچ چاپگری را اختصاص ندهدید (با استفاده از گزینه -p) چاپگر پیش‌فرض سیستم نمایش داده خواهد شد.

فرمان‌های lprm و cancel (لغو Print Jobها)

CUPS دو برنامه را به‌منظور تخریب و لغو Print Jobها و حذف آن‌ها از لیست، در نظر گرفته است. فرمان lprm مربوط به استایل Berkeley و فرمان cancel مربوط به استایل System V است.

کار هر دو، حذف Jobها از صف بوده ولی گزینه‌های آن‌ها با یکدیگر کمی متفاوتند.

منبع: کتاب The Linux Command Line نوشته William E. Shotts

Related Articles

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Close