چاپ در لینوکس (Printing)
پس از آنکه مباحث بسیاری در رابطه با دستکاری متن در لینوکس عنوان شد، اکنون زمان آن رسیده تا کمی به چاپ این مطالب بر روی کاغذ بپردازیم.
در این درس و دروس پیش رو ابتدا به ذکر تاریخچهای در لینوکس پرداخته و سپس چندیم فرمان اصلی چاپ در خط فرمان را بررسی خواهیم نمود.
تاریخچهای بر چاپ در لینوکس
بهمنظور درک کامل ویژگیهای چاپ در سیستمعاملهای یونیکس بایستی کمی تاریخچه چاپ در یونیکس را مرور کنیم. چاپ در سیستمهای یونیکس به زمان اختراع سیستمعامل یونیکس بازمیگردد. در آن زمان، چاپگرها و نحوه استفاده از آنها با شکلی که امروزه وجود دارد، کاملا متفاوت بود.
چاپ در دوره تاریک (Dim Times)
درگذشته همانند کامپیوترها، چاپگرها نیز بسیار زرگ . گرانقیمت و بهصورت مرکزی بودند. کاربران معمولی کامپیوتر در دهه 1980 بر روی ترمینالی که در فاصله دوری از کامپیوتر قرار داشت، کار میکردند. چاپگر نیز در کنار کامپیوتر و تحت نظر اپراتورها قرار داشت.
زمانیکه چاپگرها گرانقیمت و مرکزی بودند، بسیار رایج بود که کاربران چاپگر را بهاشتراک بگذارند. بهمنظور تشخیص اینکه Jobهای چاپگر به شخص خاصی اختصاص دارد، یک صفحه بنر، نام کاربری که Job به وی تعلق داشت را نشان میداد.
سپس کارمندان پشتیبانی کامپیوتر، پرینتهای گرفته شده طول روز را به تکتک کارمندان تحویل میدادند.
چاپگرهای مبتنی بر کاراکتر
تکنولوژی چاپگرها در دهه 80، از دو منظر تفاوت زیادی با امروزه داشت.
اول اینکه اکثر چاپگرهای آن دوره، چکشی بودند. این نوع چاپگرها از مکانیزمی استفاده میکردند که با استفاده از آن، یک روبان بر روی کاغذ ضربه میژد تا کاراکترهای صفحه را ایجاد کند. چاپ Daisy-Wheel و چاپ Dot-Matrix دو تکنولوژی بودند که در آن زمان استفاده میشدند.
تفاوت دوم (که تفاوت مهمتری است) این بود که چاپگرها در آن دوره از مجموعه کاراکترهایی استفاده میکردند که درون خود دیوایس وجود داشتند. بهعنوان مثال چاپگر Daisy-Wheel فقط قادر به چاپ کاراکترهایی بود که درون Petalهای آن حک و قالببندی شده بود. درواقع با اینکار چاپگر به یک ماشین تایپ سریع، تبدیل میشد. چاپگرها نیز، مانند ماشینهای تایپ، از فونتهای Mono-Spaced (بهمعنای فونتهای با طول ثابت) استفاده میکردند؛ بدین معنی که هر کاراکتر همان اندازه را داشت، چاپ در موقعیتهای ثابت بر روی صفحه انجام میشد و نواحی قابل چاپ صفحه، تعدادی کاراکتر ثابت بودند.
اکثر چاپگرها 10 کاراکتر بر اینچ (Character Per Inch) را بهصورت افقی و 6 خط بر اینچ (Line Per Inch) را بهصورت عمودی چاپ میکردند. با استفاده از این طرح، یک کاغذ (با فرمت US-Letter) 85 کاراکتر پهنا و 66 خط ارتفاع داشت. با در نظر گرفتن کمی حاشیه بر روی هر طرف، 80 کاراکتر نهایت اندازه طول خطوط بود.
این امر بیان میکند که چرا ترمینالها (حتی ترمینالهای امروزی) بهصورت پیشفرض 80 کاراکتر طول دارند. این ویژگی باعث میشود دقیقا همان چیزی را که بر روی تصویر میبینید، چاپ نیز دریافت کنید که به آن اصطلاحا WYSIWYG میگویند. WYSIWYGسرنام عبارتWhat You See Is What You Get است.
داده به یک چاپگر بهصورت یک جریان ساده از بایتهایی که حاوی کاراکترهای چاپ هستند، ارسال میشد. بهعنوان مثال برای چاپ یک کاراکتر ASCII کد 97 ارسال میشد. بهعلاوه کدهای کنترل ASCII باعث حرکت کاتریج و کاغذ و در نتیجه ایجاد سرخط، لاینفیدها و فرمفیلدها میشد. با استفاده از کدهای کنترل، میتوان برخی افکتهای محدود را (مانند Bold یا Italic کردن فونت) بهدست آورد.
چاپگرهای گرافیکی
توسعه رابط گرافیکی یا GUI که سرنام عبارت Graphical User Interface باعث ایجاد تغییراتی عمده در تکنولوژیهای چاپ شد. همانطور که کامپیوترها بیشتر بهسمت نمایشگرهای تصویری پیش رفتند، چاپ نیز از حالت مبتنی بر کاراکتر به سمت تکنولوژیهای گرافیکی پیش رفت. این کار با اختراع چاپگرهای ارزانقیمت لیزری انجام شد که بهجای چاپ کاراکترهای با طول ثابت، قادر به چاپ نقطه کوچک در هر کجا از ناحیه صفحهچاپ بودند. به تبع آن چاپ فونتهای نسبی، تصاویر و دیاگرامهای باکیفیت بالا ممکن شد.
هر چند جابهجایی از یک طرح مبتنی بر کاراکتر به یک طرح گرافیکی چالشهای فنی وحشتناکی را در پی داشت. دلیلش این است که تعداد بایتها برای پر کردن یک صفحه با استفاده از چاپگرهای مبتنی بر کاراکتر را میتوان به این شیوه محاسبه کرد (فرض کنید 60 خط در صفحه و 80 کاراکتر در سطر) 60 ضربدر 80 برابر با 4800 بایت خواهد بود.
در مقایسه با یک پرینتر لیزری با مقیاس DPI (سرنام عبارت Dot Per Inch بهمعنای نقطه بر اینچ) مقدار چاپی 8 اینچ بر روی 10 اینچ را فرض کنید. نتیجه میشود (300×10)×(300×8)÷8 که برابر با 900000 بایت خواهد بود.
اشکال اینجا است که بسیاری از کامپیوترهای کند شبکه در آن دوران خیلی ساده قادر نبودند یک مگابایت داده مورد نیاز برای چاپ یک صفحه کامل چاپگر را (بهدلیل اینکه از نظر سختافزاری و تکنولوژی ضعیف بودند) اداره کنند. پس نیاز بود که اختراعی هوشمندانهای صورت بگیرد.
این اختراع موجب ایجاد Page Description Language (زبان توصیف صفحه) شد. یک زبان توصیف صفحه (PDL) زبان برنامهنویسی است که محتویات صفحهای را توصیف میکند.
اولین PDL بزرگ PostScript بود که توسط شرکت Adobe توسعه یافت و امروزه هنوز هم بهصورت گسترده استفاده میشود. زبان PostScript یک زبان کامل برنامهنویسی است که بهمنظور صفحهآرایی و چاپ و دیگر انواع گرافیک ایجاد شد. PostScript بهصورت پیشفرض 35 استاندارد درونساخت، فونتهای باکیفیت بالا، بهعلاوه توانایی پذیرفتن تعاریف اضافی فونت در زمان اجرا را شامل میشود. اولین پشتیبانی از PostScript درون خود چاپگرها قرار گرفت. این مسئله مشکل انتقال داده را برطرف نمود. درحالیکه PostScript در مقایسه با پرینترهای مبتنی بر کاراکتر جریان بیتی بیشتری را ایجاد میکرد ولی از آن جریان ایجاد شده که برای چاپ در هر نقطه از صفحه برای چاپگرهای لیزری محاسبه کردیم (مقدار 900000 بایت) بسیار کمتر است. چاپگر PostScript یک برنامه PostScript را بهعنوان ورودی دریافت میکند. چاپگر دارای پردازشگر و حافظه Memory خودش هست و یک برنامه ویژه با نام مفسر PostScript را اجرا کرده که این برنامه، ورودیهای PostScript را خوانده، آنها را پرداخته و درنهایت، نتیجه حاصله را به حافظه داخلی چاپگر میدهد. در نتیجه الگوی بیتی (نقطهها برای چاپ) شکل گرفته تا برای چاپ بر روی کاغذ منتقل شوند.
چاپ با لینوکس
سیستمهای مدرن لینوکس بهمنظور اجرا و مدیریت پرینت، دو مجموعه نرمافزار را بهکار میگیرند.
اولی CUPS (سرنام عبارت Common Unix Printing System بهمعنای سیستم رایج چاپ در یونیکس) که درایورهای پرینتر را فراهم آورده و پرینت Jobها را مدیریت میکند.
دومی GhostScript بوده که یک مفسر پست اسکریپت میباشد.
CUPS چاپگرها را بهوسیله ایجاد و نگهداری صفهای پرینت، مدیریت میکند. همانطور که در بحث خلاصه تاریخچه عنوان شد، چاپ یونیکس در اصل بهصورتی طراحی شده تا یک چاپگر اشتراکی مرکزی که بین چندین کاربر بهاشتراک گذاشته شده را مدیریت کند. از آنجاییکه چاپگرها در مقایسه با کامپیوترها بسیار کند هستند، در نتیجه سیستمهای پرینت، نیاز به راهی برای برنامهریزی چندین پرینت Job مختلف و سازماندهی کارها را دارند. همچنین CUPS توانایی تشخیص انواع مختلف داده را دارد و همچنین میتواند فایلها به فرمت چاپی تبدیل نماید.
مهیا کردن فایلها برای چاپ
ما بهعنوان کاربران خط فرمان، بیشتر تمایل به چاپ متن داریم؛ در صورتیکه مسلما امکان چاپ دیگر فرمتهای داده نیز وجود دارد.
فرمان pr (تبدیل فایلهای متنی برای چاپ)
در درس قبلی، اندکی به فرمان pr پرداختیم. اکنون برخی از دیگر گزینههای فرمان pr که مربوط به چاپ میشوند را بررسی میکنیم. در تاریخچه چاپ دیدم که چاپگرهای مبتنی بر کاراکتر از فونتهای monospaced استفاده میکنند که نتیجه آن بهوجود آمدن کاراکترهای با اندازه ثابت بود. فرمان pr بهمنظور تغییر متن استفاده میشد تا در یک اندازه صفحه بهخصوص جا بگیرد.
جدول زیر لیست خلاصهای از رایجترین گزینههای موجود را نمایش میدهد:
| گزینه | توضیحات |
|---|---|
| +first[:last] | خروجی یک محدوده از صفحات که با first آغاز میشوند و بصورت اختیاری با last پایان مییابند. |
| -columns | سازماندهی محتوای صفحه به تعدادی ستون که با مقدار columns تعیین میشوند. |
| -a | بصورت پیشفرض، خروجی بصورت عمودی لیست میشود. با اضافه کردن گزینه -a به محتوا |
| -d | Double-space output خروجی با دو فاصله |
| -D format | فرمتدهی تاریخی که در هدر نمایش داده میشود با استفاده از format |
| -f | استفاده از فرم فیدها به جای carriage returns برای جدا کردن صفحات از یکدیگر |
| -h header | در بخش مرکزی هدر صفحه، استفاده از header به جای نام فایل. |
| -l length | تعیین طول صفحه با مقدار length. طول پیشفرض 66 خط است. |
| -n | شماره خطوط |
| -o offset | ایجاد یک فاصله در چپ |
| -w width | تعیین عرض صفحه با مقدار width. مقدار پیشفرض 72 کاراکتر است. |
فرمان pr اغلب بهعنوان فیلتری در پایپ قرار میگرفت. در این مثال لیستی از دایرکتوری /usr/bin را ایجاد میکنیم و سپس آن را با فرمت سهستونه در خروجی نمایش میدهیم:
[me@linuxbox ~]$ ls /usr/bin | pr -3 -w 65 | head 2012-02-18 14:00 Page 1 [ apturl bsd-write 411toppm ar bsh a2p arecord btcflash a2ps arecordmidi bug-buddy a2ps-lpr-wrapper ark buildhash
ارسال یک Job به چاپگر
مجموعه چاپ CUPS از دو متد که بهصورت تاریخی در سیستمهای یونیکس استفاده میشدند، پشتیبانی میکند. اولین متد،Berkeley یا LDP نام دارد (که در توزیع نرمافزاریBerkeley یونیکس استفاده میشد) که از برنامه lpr استفاده میکند. متد دیگر Sys V نام دارد (که از نسخه یونیکس System V گرفته شده) از برنامه lp استفاده میکند. هر دو این برنامهها تقریبا کاری مشابه را انجام میدهند و انتخاب یکی بر دیگری به سلیقه شما بازمیگردد.
فرمان lpr (چاپ فایلها با استایل Berkeley)
برنامه lpr را میتوان بهمنظور ارسال فایلها به چاپگرها استفاده کرد. همچنین میتوان آن را در داخل Pipelineها بهکار گرفت؛ چرا که ورودی استاندارد را قبول میکند. بهعنوان مثال بهمنظور چاپ نتایج دایرکتوری چندستونهای که در درس قبل بدان اشاره کردیم، میتوان بهصورت زیر عمل کرد:
[me@linuxbox ~]$ ls /usr/bin | pr -3 | lpr
گزارش حاصله از این فرمان به پرینتر پیشفرض سیستم ارسال خواهد شد (هرچند در ماشین مجازی ما هیچ چاپگر پیشفرضی وجود ندارد) برای ارسال فایل به یک چاپگر دیگر از گزینه –p استفاده خواهیم کرد که بهصورت زیر است:
lpr -P printer_name
در فرمان بالا printer_name نام چاپگر مورد نظر ماست. برای مشاهده چاپگرهای شناس در سیستم از فرمان زیر استفاده میشود:
[me@linuxbox ~]$ lpstat -a
اگر این فرمان را اجرا کنید، احتمالا مشاهده خواهید کرد که هیچ پرینتری برای سیستم تعریف نشده است. از آنجاییکه در ماشین مجازی هستیم، قرار نیست چاپگر حقیقی را به سیستم اضافه کنیم (مگر دوستانی که تمرین خود را بر روی یک سیستم حقیقی انجام میدهند که به یک چاپگر فیزیکی متصل شده است).
بسیاری از توزیعهای لینوکس به شما اجازه میدهند تا چاپگری مجازی تعریف کنید که بهجای چاپ حقیقی، فایل خروجی را در یک فایل PDF قرار دهد. برنامه cups-pdf نمونهای از این برنامهها است.
جدول زیر لیست گزینههای رایج lpr را نشان میدهد:
| گزینه | توضیحات |
|---|---|
| -# number | تعیین تعداد کپیها با مقدار number |
| -p | چاپ هر صفحه با یک هدر، تاریخ، نام وظیفه و شماره صفحه. که این حالت را چاپ زیبا مینامند که هنگام چاپ فایلهای متنی میتوان آ« را استفاده کرد. |
| -P printer | تعیین نام چاپگر که برای خروجی استفاده شده است. |
| -r | حذف فایلها پس از چاپ. این گزینه برای برنامههایی که پس از چاپ فایلهای موقتی ایجاد میکنند مفید است. |
فرمان lp (چاپ فایلها با استایل System V)
فرمان lp همانند فرمان lpr نیز هم فایلها و هم ورودی استاندارد را برای چاپ قبول میکند. این فرمان با lpr متفاوت است. از این منظر که برخی گزینههای دیگر (معمولا گزینههای پیچیدهتر) را پشتیبانی میکند.
جدول زیر لیست گزینههای رایج فرمان lp را نشان میدهد:
| گزینه | توضیحات |
|---|---|
| -d printer | تعیین فاصله تا چاپگر. اگر گزینه d تعیین نشود پیشفرض سیستم استفاده خواهد شود. |
| -n number | تعیین تعداد کپیها به مقدار number |
| -o landscape | تعیین جهت افقی برای خروجی |
| -o fitplot | تغییر اندازه فایل برای جایگیری در صفحه. این گزینه زمانی مفید است که تصاویری مثل JPEG را چاپ کنید. |
| -o scaling=number | تغییر اندازه فایل با مقدار number. مقدار 100 صفحه را پر میکند. مقادیر بیشتر از 100 باعث میشود فایل در چندین صفحه چاپ شود. |
| -o cpi=number | تعیین کاراکترهای خروجی بر اینچ به مقدار number. پیشفرض مقدار 10 است. |
| -o lpi=number | تعیین خطوط خروجی بر اینچ. پیشفرض 6 است. |
| -o page-bottom=points -o page-left=points -o page-right=points -o page-top=points | تعیین مارجین صفحه. مقادیر براساس واحد point تعیین میشود که یک واحد اندازهگیری صفحهآرایی است. |
| -P pages | تعیین لیست صفحات. صفحات ممکن استبه عنوان لیستی نمایش داده شود که با کاما از هم جدا شده است. |
مجددا لیست دایرکتوری خود را اما این بار 12 CPI و 8 LPI را با یک حاشیه نیماینچی از چپ ایجاد میکنیم. به یاد داشته باشید که بایستی بهمنظور محاسبه اندازه صفحه جدید، گزینههای pr را مطابقت دهیم:
[me@linuxbox ~]$ ls /usr/bin | pr -4 -w 90 -l 88 | lp -o page-left=36 -o cpi= 12 -o lpi=8
مانیتورینگ و کنترل Print Jobها
نظر به اینکه سیستمهای چاپ یونیکس، بهگونهای طراحی شدهاند تا چندین Print Job را از چندین کاربر بهصورت همزمان نگهداری و مدیریت کنند، CUPS نیز به همین صورت طراحی شده است. هر چاپگر یک صف چاپ میگیرد؛ بهصورتیکه Jobها در داخل این صف پارک میشوند تا نوبتشان برسد و برای چاپ ارسال شوند.
CUPS چندین فرمان خط فرمان را ارایه میکند که بهمنظور مدیریت وضعیت چاپ و صفهای چاپگر در نظر گرفته شدهاند.
فرمان lpstat (نمایش وضعیت چاپ سیستم)
فرمان lpstsat برنامهای مفید برای شناسایی اسامی در دسترس چاپگرها بر روی سیستم میباشد.
به یاد دارید که از فرمان lpstsat –a قبلا استفاده کردیم و نتیجه حاصله، وجود یک چاپگر مجازی بر روی سیستم بود:
[me@linuxbox ~]$ lpstat -a PDF accepting requests since Mon 05 Dec 2011 03:05:59 PM EST printer accepting requests since Tue 21 Feb 2012 08:43:22 AM EST
علاوه بر این، میتوانیم از گزینه –s استفاده کنیم تا توضیحات بیشتری را درباره پیکربندی سیستم پرینت بهدست آوریم:
[me@linuxbox ~]$ lpstat -s system default destination: printer device for PDF: cups-pdf:/ device for printer: ipp://print-server:631/printers/printer
همانگونه که مشاهده میکنید، سیستم دارای یک چاپگر مجازی با نام cups-pdf میباشد.
جدول زیر رایجترین گزینههای فرمان lpstat را نمایش میدهد:
| گزینه | توضیحات |
|---|---|
| -a [printer...] | نمایش وضعیت صف چاپگر. لازم به ذکر است که این وضعیت صف برای قبول جابها را نشان میدهد نه وضعیت فیزیکی چاپگر را. اگر هیچ چاپگری تعیین نشود، وضعیت همه صفهای چاپگرها را نمایش میدهد. |
| -d | نمایش نام چاپگر پیشفرض سیستم. |
| -p [printer...] | نمایش وضعیت چاپگرهای تعیین شده. اگر هیچ چاپگری تعیین نشود همه چاپگرها نمایش داده میشود. |
| -r | نمایش وضعیت سرور چاپگر |
| -s | نمایش خلاصه وضعیت |
| -t | نمایش گزارش کامل وضعیت |
فرمان lpq (نمایش وضعیت صف چاپگر)
برای مشاهده وضعیت صف یک چاپگر، فرمان lpq را بهکار میبریم. این فرمان به ما اجازه میدهد که وضعیت صف و Print Jobهای موجود در آن را نمایش دهیم. اینجا نمونه مثالی از یک صف خالی برای چاپگر پیشفرض مجازی مشاهده میشود:
تصویر lpq
اگر نام هیچ چاپگری را اختصاص ندهدید (با استفاده از گزینه -p) چاپگر پیشفرض سیستم نمایش داده خواهد شد.
فرمانهای lprm و cancel (لغو Print Jobها)
CUPS دو برنامه را بهمنظور تخریب و لغو Print Jobها و حذف آنها از لیست، در نظر گرفته است. فرمان lprm مربوط به استایل Berkeley و فرمان cancel مربوط به استایل System V است.
کار هر دو، حذف Jobها از صف بوده ولی گزینههای آنها با یکدیگر کمی متفاوتند.
منبع: لینوکسسیزن نوشته فرشید نوتاش حقیقتدرباره فرشید نوتاش حقیقت
همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرمافزارهای آزاد/ متنباز و سیستمعامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.
نوشتههای بیشتر از فرشید نوتاش حقیقتاین سایت از اکیسمت برای کاهش جفنگ استفاده میکند. درباره چگونگی پردازش دادههای دیدگاه خود بیشتر بدانید.
دیدگاهتان را بنویسید