· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linuxdoc Sgml/Printing-HOWTO

The Linux Printing HOWTO

The Linux Printing HOWTO

저 자 : Grant Taylor, < gtaylor+pht@picante.com>

버 전 : 3.10 번 역 자 : 엄기성, < nowlinux@soback.kornet.nm.kr> 최종수정일 : 1996년 9월 10일

1. 주의 및 경고

다음의 문서는 Grant Taylor의 Linux Printing HOWTO의 한글 번역판이다. Linux Printing HOWTO는 Linux 환경에서 (기타 유닉스 환경에서도 보편적인 부분은 적용 가능) 프린트 출력(print), 미리보기(preview), 팩스(fax) 사용에 대한 자료를 수집한 것이다. 참고로, 역자는 원문에 대한 번역으로 인해 발생할 수 있는 유/무형의 손실에 대해서 어떠한 책임이나 보상의 의무를 가지고 있지 않다는 점을 미리 밝혀둔다. 그리고, 역자의 지식이 부족한 관계로 원문의 내용이 잘못 번역될 가능성도 있다는 점을 주의하라. (원문의 내용을 쉽게 전달하기 위해서 의역한 부분이 많다.)

1.1 번역중 제외된 내용

본 문서를 번역하는 과정에서 "직렬 포트에 연결된 프린터의 환경설정"에 관한 부분은 번역하지 않았다. 필요한 분은 영문판을 참고하라. 자세한 내용은 8장을 참고하라.

2. 소개(Intro)

이 문서를 다시 작성했기 때문에 구버전의 내용에서 많은 자료가 빠졌다. 이는 이전의 HOWTO 문서가 양적으로 60 typeset 쪽에 이를 정도로 커졌으며 지루한 이야기식의 구성방식을 가지고 있었기 때문이다. 본 문서에서 원하는 해결책을 찾을 수 없다면 a) PHT 홈페이지 < www.picante.com/~gtaylor/pht/> 에서 구버전의 PHT를 뒤지거나 b) 나(PHT의 저자인 grant taylor)에게 빠진 것이 무엇인지 가르쳐 주면 된다. Printing HOWTO 홈페이지인 < www.picante.com/~gtaylor/pht/>에서 가장 최신버전의 PHT를 구할 수 있다; 물론 Sunsite(sunsite.unc.edu)나 가까운 LDP 미러 사이트에서도 구할 수 있다.

2.1 변천사(History)

이 문서는 세 번째 수정판이다. 즉, 모든 내용이 새로 작성되는 과정을 세 번째로 거쳤다는 의미이다. PHT의 변천사는 시간적 순서로 나열해서 다음과 같다.

  1. 나는 프린트에 관련되어 comp.so.linux에 올라오는 수맣은 질문을 위해서 printing-howto를 최초로 작성하고 이를 포스팅했다. 몇 달 후 HOWTO 프로젝트가 시작되었으며, 따라서 내 문서는 `HOWTO'라고 불리는 최초는 FAQ모음집이었다. 이 때의 포맷은 일반적인 ascii였다.
  2. HOWTO 프로젝트에 동참한 다음, Printing-HOWTO는 Brian McCauley < B.A.McCauley@bham.ac.uk>의 Lpd FAQ와 합쳐졌다. 우리는 약 2년동안 PHT를 공동으로 작성했다. 몇몇 부분에서는 Karl Auer < Karl.Auer@anu.edu.au>의 자료를 포함시켰다. 이 시점의 PHT는 TeXinfo 포맷이었으며, PS, HTML, Ascii, Info 등의 포맷도 있었다.
  3. 1년 정도 PHT에서 손을 뗀 다음, 다른 maintainer를 구하려는 시도가 실패한 다음 현재와 같은 형식과 내용으로 전체적인 수정을 가했다. 현재의 PHT는 Linuxdoc-SGML포맷이다.

2.2 저작권(Copyright)

이 문서의 저작권은 Grant Taylor 에게 있다.(Copyright (c) 1996 by Grant Taylor) 배포 또는 복사시 저자의 이름을 지우거나, 내용을 수정하지 않도록 하라.

3. 출력하는 방법(How to print)

당신의 프린터에 맞춰서 lpd 설정을 마쳤거나 시스템 관리자가 그러한 설정을 해 두었거나, 판매업자기 미리 환경설정을 해 놓은 경우, lpr 명령어에 대한 것만 배우면 된다. The Printing-Usage HOWTO < sunsite.unc.edu/mdw/HOWTO/Printing-Usage-HOWTO.html> 에서 그런 내용을 다루고 있으며 프린트 큐(queue)를 다루는 몇 가지 필수 명령어에 대해서도 설명하고 있다.

4. Kernel printer devices

4.1 lp device

lp 디바이스를 커널에서 지원하도록 컴파일하거나 모듈로 읽어들였다고 가정할 경우 (cat /proc/devices 라고 실행하면 lp 디바이스에 대한 내용이 출력된다) 리눅스 커널에 서는 /dev/lp0, /dev/lp1, /dev/lp2중 하나 이상의 디바이스를 지원한다. 이 장치들은 동 적으로(dynamically) 할당되는 것은 아니며 각각의 디바이스는 특정한 H/W 입출력 주소에 대응한다. 즉, 당신의 프린터 하드웨어에 따라 첫 번째 프린터는 lp0 이나 lp1이 될 수 있다는 뜻이다.

둘 다 테스트해 보라.. :) plip와 lp 드라이버를 동일한 포트에서 동시에 사용할 수는 없다. 그러나, 수동 또는 커널 2.0.x에서 제공하는 (또는 1.3.x 후반부의) kerneld를 이용해서 별도의 시간동안 모듈 드라이버를 사용할 수 있다. 인터럽트(interrupt) 설정을 신중하게 한 다음 위의 방법을 이용하면, 아마도 한쪽 포트에서는 plip, 다른쪽에서는 lp를 사용할 수 있을 것 으로 추측된다.

어떤 이는 드라이버 소스를 수정하여 이렇게 했다. ; 나는 단순히 명령어 입력만으로 성공했다는 사용담을 고대하고 있다. tunelp라는 프로그램을 이용하면 루트(root)로 로긴해서 lp 디바이스의 인터럽트 사용 정도(interrupt usage), 폴링율(polling rate) 및 기타 옵션을 조절할 수 있다. 커널 2.0, 또는 1.3.x에서 커널속에 lp 드라이버가 포함될 경우, 커널은 인터럽트와 입출력 주소를 설정하기 위한 " lp = " 옵션을 이해한다. lp 드라이버가 커널에 포함되었을 때, LILO/LOADLIN 명령어를 이용해서 드라이버가 사용할 포트 주소와 인터럽트를 지정할 수 있다.

문법: lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]

예제: lp=0x378,0 or lp=0x278,5,0x378,7 **

이 기능을 이용할 때, 사용하길 희망하는 포든 포트를 지정해야 한다. 기본 설정값(default)는 없다. lp=0 으로 설정하면 커널의 드라이버를 사용불가(disable)로 설정할 수 있다. 커널 2.0 및 1.3.x 후반부의 커널에서 모듈로 사용될 때, insmod 명령어 옵션에 LILO/LOADLIN 처럼 입출력 주소와 인터럽트 라인을 지정할 수 있다. (또는 /etc/conf.modules에 넣어서 kerneld에서 사용하도록 지정) 매개변수(parameter)는 io=port0,port1,port2와 irq=irq0,irq1,irq2 이다. 여기에 대한 자세한 내용은 insmod의 맨페이지를 참고하라. **(나처럼) 한 번도 표준 포트 번호를 찾을 수 없었던 사람들은 위의 두 번째 예제 상황인 것이다. 나머지 포트(lp0)의 주소은 0x3bc이다. 이 포트가 일반적으로 사용하는 인터럽트에 대해서 알고 있지 않다.

4.2 직렬 포트 디바이스(Serial devices)

리눅스에서 직렬 포트에 연결된 디바이스는 /dev/ttyS1과 비슷한 형식으로 이름을 가지고 있다. stty라는 프로그램을 이용하여 직렬포트의 상태를 보거나 설정값을 변경할 수 있다; setserial을 이용하면 몇 가지 확장된 특성 제어, 非표준 포트의 IRQ 와 입출력 주소 설정을 할 수 있다. 리눅스에서의 직렬 포트에 관한 이후의 자료는 Serial-HOWTO < sunsite.unc.edu/mdw/HOWTO/Serial-HOWTO.html>.에서 찾을 수 있다.

흐름 제어(flow control)상태로 연결된 저속의 직렬 프린터를 사용할 때, 출력작업 중인 당신의 데이터 끝부분이 잘려 없어지는 현상을 발견할 수도 있다. 이런 현상의 원인은 포트에 연결된 장치가 포트를 폐쇄한 다음, 30초 이내에 버퍼안에 있는 전송을 마치지 못한 문자열(characters)을 깨끗이 지워버리는 직렬 포트의 기본적인 특징에서 찾을 수 있다. 버퍼는 4096자의 문자열을 담을 수 있으며, 연결된 프린터가 흐름제어를 사용하고, 해당 출력 소프트웨어가 직렬포트를 폐쇄한 뒤 30초 이내에 모 든 자료를 출력할 수 없을 정도로 느리다면, 버퍼에 담긴 내용중 꼬리에 해당하는 마지막 부분의 내용을 잃어버릴 것이다. ``cat file1 > /dev/ttyS?''라고 명령했을 때, 작은 파일의 경우 제대로 출력되고 큰 파일은 내용이 잘려서 출력되면, 위에서 설명 한 환경에 처해 있다고 볼 수 있다. ioctl() call를 이용하는 직렬포트의 자료구조요소인 "closing_wait"를 이용하면 30초 간격을 조절할 수 있다. Setserial은 이러한 요소를 직접 취급하지 않지만, 동일한 구조에서 다른 것을 처리할 수 있다. 따라서, closing_wait를 조절하기 위해 서 setserial을 사용하는 것이 간편하다. rc.serial에 직렬 프린터가 연결된 직렬포트에 대한 setserial 명령을 추가/삽입한다. 이렇게 하여 특정 포트의 closing_wait 와 다른 사항을 동시에 설정할 수 있다.

5. 출력용 프로그램은 어떤것이 있는가?(Which spooling software?)

최근까지 리눅서들의 선택은 간단했다. - 모든사람은 BSD Net-2 배포본에서 그대로 베낀 구식의 lpd를 사용했다. 최근에도 대다수 업자들은 이 프로그램을 집어넣는다. 그러나, 변화의 조짐이 보이고 있다. 선(Sun)의 솔라리스(Solaris)등의 SVR4 계열 시스템에서 전혀 다른 출력용 프로그램 (print spooling package)을 선보이고 있다. 일부 리눅스 업체가 LPRng - 자유롭게 배포가 가능하며, 비교적 최신의 출력 프로그램 패키지 - 를 제공하려는 신호도 있다. LPRng는 대규모로 설치할 때, 관리가 훨씬 편하고 lpd에 비해 사용하기 쉽다.

선택의 여지가 넓어질 가능성이 있지만, 현재의 시점에서 lpd는 대부분의 리눅서들에게 현실적으로 최상의 대안이다. 지나치게 까다로운 시스템이 아니라면 한 번의 설정으로 모든 것이 잘 돌아가며, lpd는 서드파티의 유닉스 파일로 된 책을 제대로 읽어들이고 출력할 수도 있다. LPRng에 대해서 관심이 있다면 LPRng - An Enhanced Printer Spooler - 홈페이지 를 살펴보라.

< www.gsfc.nasa.gov/ltpcf/about/unix/Depotdoc/LPRng/>. 이 문서의 이후 버전에서는 LPRng와 보통의 lpd 사용에 관한 자료를 함께 제공할 것이다.

6. 출력작업의 기본과정(How it works, basic)

출력작업이 잘 되려면, 다음의 lpd 시스템을 이해해야 한다. lpd란 Line Printer Daemon을 의미하며, 문맥(context)으로 파악할 때 daemon 또는 출력작업에 관련된 프로그램의 전체 모음으로 이해될 수 있다. 다음은 위에서 언급된 출력에 관련된 프로그램이다.

lpd

스풀 Daemon. lpd중 하나는 기계의 모든 (출력)작업을 통제 하며, 다른 하나는 프린터 작업당 하나씩 실행된다.

lpr

사용자의 출력 명령어. lpr은 lpd와 접촉하여 새로 출력할 작업을 스풀 (디렉토리)에 넣는다.

lpq

프린트 큐(queue)에 들어있는 작업 목록을 보여준다.

lpc

lpd 시스템 제어 명령어. lpc를 이용해서 프린트 큐의 작업을 정지, 시작,순서 변경,기타 등이 가능하다.

lprm

스풀(디렉토리)의 작업을 제거한다. 그러면, 이들이 어떻게 상호작용하는가? 시스템이 부팅되면, lpd가 실행된다.

lpd는 /etc/printcap 파일을 검색하여 스풀작업에 필요한 논리프린터가 정의되어 있는지 알아 본다. 사용자중 누군가가 lpr을 실행할 때, lpr은 /dev/printer 라는 이름을 가진 소켓(socket)으로 lpd와 교신하고 lpd에게 출력할 파일 및 소유자, 출력방법 등에 대한 정보를 제공한다. 그러면 lpd는 순서대로 해당 파일에 맞도록 정의된 프린터로 전송, 출력한다. 원래 lp 시스템은 대부분의 프린터가 line printer인 시절 - 사람들이 ascii text 화일을 주로 출력하던 때 - 에 개발되었다. 환경이 달라진 지금은 lpd가 잘 돌아가기 위해서 약간의 스크립트 작업이 필요하다. 현재의 환경은 PostScript, text, dvi등 다양한 형식이 있다.

7. 기본적인 환경설정 (How to set things up, basic)

7.1 일반적인 lpd 설정(Traditional lpd configuration)

lpd에 최소한의 설정을 통해서 시스템은 화일을 프린트 큐로 보내어 출력할 수 있다. 이 과정은 해당 파일을 프린터가 이해할 수 있는지의 여부, 출력 물이 보기좋게 나올 수 있는가에 대해서는 전혀 고려하지 않았다. 그렇지만, 가장 기본적인 단계이다. 계속 읽어 보도록! 기본적으로, lpd에 프린트 큐를 추가하려면 /etc/printcap의 목록을 편집 해야 하며, /var/spool/lpd에 새로운 스풀 디렉토리를 만들어야 한다.

/etc/printcap의 목록은 다음의 형식을 가진다.
# LOCAL djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
위의 내용은 lp, dj, deskjet이라는 (가상의) 프린터를 정의하며, /var/spool/lpd/dj 디렉토리에 자료를 임시저장하고, 파일(작업)당 최대 크기의 한계가 없으며, 디바이스 /dev/lp0으로 자료를 출력한다. 그리고, 해당 작업의 앞쪽에 추가되는 banner page - 출력 작업을 명령한 사람과 기타 정보를 포시한다. - 가 없다. printcap의 맨페이지를 자세히 읽어 보길 권장한다. 위의 내용은 아주 간단해 보이지만, 함정(catch)이 있다 - DeskJet 500이 이해할 수 없는 내용의 파일을 보낸다면, 프린터는 이상한(?) 결과물을 출력할 것이다. 예를 들어 보통의 unix 문서 파일을 DeskJet 프린터로 보 내면 newline을 그대로 읽어들여 다음과 같이 출력한다.(계단현상의 예)
This is line one.
   This is line two.
      This is line three.
PS(PostScript 이하 PS) 파일을 이렇게 스풀로 보내어 출력하면 이쁘게 나열된 PS명령어만 잔뜩 만나게 될 것이다.8^) 물론 위에서 언급된 계단현상(staircase effect)도 함께... 분명히 별도의 설정이 필요하다. 이를 위해서 필터(filter)가 사용된다. printcap의 맨페이지를 열심히 읽은 사람이라면 spool의 특징으로 ``if''와 ``of''를 주목할 것이다. 여기서 if - input filter - 가 우리에 게 필요한 부분이다.

newline 이전에 CR(Carriage Returen)을 삽입하는 스크립트를 사용한다면 계단현상을 해결할 수 있다. 그러므로, 위의 printcap의 내용에 if로 시작 하는 줄을 추가해야 한다.

lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
간단한 필터 스크립트는 다음의 내용처럼 작성하면 된다. (아래의 스크립트는 perl을 이용했다.) #!perl while(<STDIN>){chop $_; print "$_\n";}; 위의 지시대로 한다면, 일반적인 유닉스 텍스트 파일을 출력할 수 있는 스풀 환경을 가지게 될 것이다. (물론 위의 필터를 작성하는 방법은 수백만 가지가 있지만, 예제로 삼기에 적당한 것은 적은 편이다. 위의 작업이 좀 더 효율적으로 수행될 수 있도록 생각해 보라) 이제는 일반 텍스트 파일의 출력이 널리 애용되는 방법이 아니라는 문제가 남아있다. - 아마도 PS나 다른 종류의 문서양식(dvi등)이나 그래픽 파일들을 출력할 수 있어야 할 것이다. 중요한 문제이며, 실제로 환경설정도 쉽다. 위에서 사용된 line-feed 필터의 확장된 형태를 사용하면 된다.

출력시 입력된 임의의 파일형태를 이해하여 DeskJet이 받아들일 수 있는 형식으로 변환해 주는 필터를 작성한다면, 아주 훌륭한 출력 환경을 갖춘 것이다. 일반적인 경우, 자기만의 필터를 작성하려고 애쓰지 말라. 인터넷에는 유용한 필터가 널려 있기 때문이다.

7.2 파일 권한(File Permissions)

다른 사람들의 부탁때문에 내 리눅스 박스의 파일 권한에 대한 설명을 추가했다. 권한 설정에 대한 방법은 매우 많다. SGID 설정된 바이너리만을 사용하고 관련된 모든 것들을 SUID root로 설정하지 않는 것이 가장 이상적이다. 다음은 내 리눅스 박스의 내용이며, 내 경우 잘 돌아간다.

-r-sr-sr-x 1 root    lp      /usr/bin/lpr*
-r-sr-sr-x 1 root    lp      /usr/bin/lprm*
-rwxr--r-- 1 root    root    /usr/sbin/lpd*
-r-xr-sr-x 1 root    lp      /usr/sbin/lpc*
drwxrwxr-x 4 root    lp      /var/spool/lpd/
drwxr-xr-x 2 root    lp      /var/spool/lpd/lp/
현재 lpd는 lp 서비스 포트를 바인드(bind)하기 위해서 root로 실행 되어야 한다. bind이후 UID가 lp나 다른 것으로 되어야 하겠지만, 그럴 필요는 없을 것 같다. Bummer....

8. 매직 필터 구하기(How to obtain an appropriate magic filter)

(역자주:매직필터란 사용자가 필터작업에 신경쓰지 않아도 다양한 파일들을 처리할 수 있는 다용도 필터 프로그램 또는 패키지를 의미한다.)

8.1 APS 필터(APS Filter)

쓸만한 매직필터 프로그램중 한가지이며 Andreas Klemm가 원작자이다. lsm(Linux Software Map)의 내용은 다음과 같다.


Begin3
Title: apsfilter
Version: 4.9.1
Entered-date: Montag, 10. Juli 1995, 21:22:35 Uhr MET DST
Description: magicfilter for lpd with auto filetype detection
Keywords: lpd magicfilter aps apsfilter
Author: <url url="mailto:andreas@knobel.GUN.de" name="andreas@knobel.GUN.de"> (Andreas Klemm)
Maintained-by: <url url="mailto:sledge@hammer.oche.de" name="sledge@hammer.oche.de"> (Thomas Bueschgens)
<url url="mailto:andreas@knobel.GUN.de" name="andreas@knobel.GUN.de"> (Andreas Klemm)
Primary-site: sunsite.unc.edu
/pub/Linux/system/Printing/
211KB aps-491.tgz
Original-site: ftp-i2.informatik.rwth-aachen.de
/pub/Linux/pak/APSfilter/aps-491.tgz
Platforms: C-Compiler, gs Postscript emulator, pbmutils
Copying-policy: GPL
End

APS 필터는 프린터 큐에 if 필터로 설치되며, 다양한 파일 종류를 해당프린터에 적합한 명령어로 변환하며, 일반 텍스트 파일, PS, dvi, gif 등을 지원한다.

8.2 매직 필터(Magic-filter)

B.A.McCawley가 작성한 매직 필터는 APS 필터와 동일한 역할을 하지만, bash 쉘 스크립트로 작성되었기 때문에 개별적으로 최적화하기 편하다. 다음은 LSM이다.


Version: 0.4
Description: Bash scripts to simplify the task of configuring lpd to
auto-detect file types using /etc/magic. (As advertised in the
printing-HOWTO). 
This package uses existing filters so it only prints file types for
which one already has filters (or compressed versions
thereof). Alterative magic filter approches are described in the
printing-HOWTO. 
Keywords: lpd, /etc/magic, printing, filter
Author: <url url="mailto:B.A.McCauley@bham.ac.uk" name="B.A.McCauley@bham.ac.uk"> (Brian McCauley)
Maintained-by: <url url="mailto:B.A.McCauley@bham.ac.uk" name="B.A.McCauley@bham.ac.uk">
Primary-site: tsx-11.mit.edu pub/linux/sources/usr.bin
magic-filter-0.4.tar.gz 5709
Copying-policy: GNU GPL

8.3 그 밖의 매직필터..

magic filter라 이름지어진 패키지는 두 종류가 있어서 사람들을 헷갈리게 만든다. (아니면 둘 다 같은 프로그램인가?) 다음은 LSM이다.


Title: magicfilter
Version: 1.1b
Entered-date: 04APR95
Description: A customizable, extensible automatic printer filter.
Lets you automatically detect and print just about any data type you
can find a conversion utility for. This filter is written in C and is
controlled completely from an external printer configuration file.
This version adds automagic creation of configuration files based on
the installed software on your system, courtesy of GNU Autoconf. 
This version is a bug fix from 1.1/1.1a; filters for non-ASCII capable
PostScript printers have been added.   
Author: H. Peter Anvin <<url url="mailto:Peter.Anvin@linux.org" name="Peter.Anvin@linux.org">>
Primary-site: sunsite.unc.edu
53000 /pub/Linux/system/Printing/magicfilter-1.1b.tar.gz
Copying-policy: GPL

9. lpd 환경의 직렬 포트 프린터

9.1 printcap의 설정

9.2 자료를 잃어버리는 구형 직렬 프린터

** 역자주: 직렬 포트용 프린터의 설정에 관한 부분은 빼 버렸습니다.( 제외시킨 이유로

a) 제가 직렬 포트용 프린터 사용에 대해서 무지하고 b) 현실적으로 병렬포트 또는 네트웍용 프린터들이 널리 활용되고 있고 c) 전혀 경험이 없는 부분의 내용을 번역하는 과정에서

** 안하는 것보다 못한 ** 번역이 될 위험이 있었습니다. 직렬 포트용 프린터의 설정에 관해서 공부하실 분들은 영문 Print Setup HOWTO를 참고하시기 바랍니다.)

10. 판매업자측의 프로그램들(Vendor Solutions)

이 장(section)은 현재 완결되지 못했다. (물론 영원히 완결되지 못할 것이다.. ^^) 가장 좋아하는 리눅스 배포본의 환경에 대한 자료를 부담없이 보내면 된다.

10.1 레드햇 2.x and 3.0.3 (Picasso)

(역자주: 레드햇 4.2이 가장 최근 버전임을 주의하라) 레드햇(RedHat) 배포본에는 local과 remote 프린터를 추가/삭제할 수 있는 GUI 환경(X윈도 기반)의 "프린터 관리 도구(printer administration tool)" 가 있다. 이 도구를 이용해서 ghostscript를 지원하는 프린터 종류 및 출력 목표(target)이 될 유닉스 디바이스 파일을 선택할 수 있으며, /etc/printcap에 논리 프린터를 정의할 수 있다. 그리고 나서, ghostscript 와 nenscript를 이용하여 PS와 일반 아스키 문서파일을 처리하는 매직 필터를 작성할 수 있다. 레드햇의 이러한 방법은 잘 작동되며, 대개 별도의 환경설정은 필요없다.

레드햇의 가장 최근판인 (Rembrant II)에서는 LPRng를 사용하는 것 같다. 필자는 아직까지는 Rembrandt를 구경하지 못했다..

10.2 그 밖의 배포본들(Other Distributions)

필자에게 다른 배포본들에 관한 자료를 제공해 주길 바란다.

11. 네트웍으로 연결된 프린터를 이용하여 출력하기

(How to print to a printer over the network) lpd는 네트웍으로 연결된 다른 기계에 연결된 프린터를 통해서 출력하는 것을 지원한다. 필터 및 적절한 유틸리티를 이용한다면 모든 네트웍 환경에서 lpr을 이용해서 쉽게 출력할 수 있다.

11.1 유닉스/lpd 호스트로 출력 (To a Unix/lpd host)

원격지의 기계가 당신의 리눅스 박스에 연결된 프린터로 출력하는 것을 허가하려면 /etc/hosts.equiv나 /etc/hosts.lpd에 해당기계(의 주소나 이름)를 등록해야 한다.

(hosts.equiv에는 다른 역할을 하는 호스트의 이름도 담고 있다. 임의의 기계를 등록한다면 신중하게 하라) /etc/printcap의 "rs" 특성을 이용하여 다른 기계의 특정 사용자만 당신의 프린터에 접근할 수 있도록 지정할 수 있다; 여기에 대한 자세한 것은 lpd의 맨페이지를 참고하라.

11.2 lpd를 이용하자 (With lpd)

다른 기계로 출력하려면 /etc/printcap에 다음과 같이 정의해야 한다.

# REMOTE djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:rm=machine.out.there.com:\
:rp=printername:\
:lp=/dev/null:\
:sh:
remote machine으로 출력하는 경우에도 lpd가 돌아가는 local machine (자신의 리눅스 박스)에 스풀디렉토리가 존재한다는 점에 주목하라. 만약 remote machine이 다른 작업때문에 바쁘거나 전원이 꺼진 상태라면 local machine에서 지시한 프린트 작업은 스풀 영역(예. 스풀디렉토리)에 대기하고 있다가 출력이 가능해지만 다시 전송된다.

11.3 rlpr을 이용하자(With rlpr)

lpd의 환경을 설정하는 골치아픈 과정을 거칠 필요 없이 rlpr을 이용한다면 각각의 프린트 작업을 곧바로(directly) remote machine의 프린트 큐로 전송 한다.아주 가끔씩 여러 종류의 프린터를 사용하는 환경에서 유용하다 . rlpr 발표문에서 인용하면: rlpr은 TCP/IP 를 이용하여 프린트 작업을 네트웍 상의 위치에 제약받지 않고 lpd 서버로 전송할 수 있다. lpr과는 달리 작업을 전송하는 측의 기계에게(local machine) 원격지의 기계(remote machine)가 등록될(예를 들어 /etc/printcap) 필요가 없다. 따라서, rlpr은 좀 더 유연하고 (상대적으로) 관리가 편하다. rlpr은 lpr이 사용되는 모든 환경에서 사용가능하며, 전통적인 BSD lpr과 하위호환성(backwares compatible)을 가진다. rlpr의 훌륭한 점은 특정 시스템에 대해서 고려 할 필요없이 모든 곳에서 전송/출력이 가능하다는 것이다. 또한 전통적인 lpr처럼 필터로 작동하여 원격지의 기계에서 실행되는 netscape, xemacs 등의 클라이언트 프로그램에서 local machine으로 쉽게 출력할 수 있다. rlpr은 선사이트(SunSite)에서 구할 수 있다. < sunsite.unc.edu/pub/Linux/system/Printing/>.

11.4 윈도 95/NT, LanManager, Samba로 연결된 프린터로 출력

lpd 큐에 들어있는 프린트 작업의 내용을 smbclient (samba패키지중 일부) 를 이용해서 TCP/IP기반의 SMB 프린트 서버로 직접 전송이 가능하다.samba 패키지의 smbprint라는 스크립트 파일을 이용하면 된다. 간단히 설명하면, 스풀 디렉토리에 특정 프린터용 설정 파일을 집어 넣고, smbprint 스크립트 를 /etc/printcap의 "if"로 설치하면 된다. /etc/printcap의 내용은 다음과 비슷할 것이다.

lp|remote-smbprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/sbin/smbprint:
smbprint 스크립트에 포함된 문서를 반드시 읽어 볼 것을 권장한다. lpd를 필요로 하지 않고 smbclinet를 이용하여 SMB printing 서버로 파일을 직접 전송하는 방법도 가능하다. 자세한 것은 맨페이지를 참고하라.

11.5 네트웨어 프린터 사용(To a NetWare Printer)

"ncpfs" 패키지에 포함된 nprint는 NetWare 환경에서 smbprint와 동일한 기능을 수행한다. ncpfs는 < linux01.gwdg.de/pub/ncpfs/> 에서 구할 수 있다. 다음은 LSM의 내용이다.

version 0.16:
With ncpfs you can mount volumes of your netware server under
Linux. You can also print to netware print queues and spool netware
print queues to the Linux printing system. You need kernel 1.2.x or
1.3.54 and above. ncpfs does NOT work with any 1.3.x kernel below
1.3.54.   
lpd를 통하여 nprint가 작동하기 위해서는 NetWare(로 연결된)프린터로 (표준)출력을 넘기는 작은 쉘 스크립트를 작성하여 이것을 lpd 프린터 큐 의 "if"로 설치해야 한다. 다음의 내용과 비슷할 것이다.
sub2|remote-NWprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/sub2:\
:if=/var/spool/lpd/nprint-script:
nprint-script의 내용은 다음과 같다.
#! /bin/sh
/usr/local/bin/nprint -S net -U name -P passwd -q printq-q
-

11.6 EtherTalk (애플) 프린터로 출력(To an EtherTalk (Apple) printer)

netatalk 패키지에는 nprint나 smbclient와 비슷한 역할을 하는 프로그램이 있다. Werner Eugster의 문서에서 애플 네트웍에서의 프린터 출력 과정에 대해 자세히 설명하고 있다. 그의 홈페이지를 참고하라. < garnet.berkeley.edu/~weugster/appleprint.html> 확실하지 못한 소문 : Netatalk는 DEC tulip 칩을 장착한 SMC Etherpower PCI카드에서는 작동하지 않는다고 한다.

11.7 HP 및 기타 네트웍 프린터로 출력(To an HP or other ethernet printer)

HP및 일부 프린터에 있는 ethernet 인터페이스를 이용하면 lpd를 이용해서 자료를 직접 전송/출력할 수 있다. 프린터나 이더넷 어댑터에 포함된 매뉴얼 을 자세히 읽고 그 지시대로 따르면 된다. 보통 이들 프린터는 lpd를 실행 하면서 하나 이상의 논리적 프린터 큐를 제공한다. HP 제품은 다음과 같이 /etc/printcap에 설정될 수 있다.

lj-5|remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:rm=printer.name.com:rp=raw:
규모가 큰 곳에서, 특히 몇몇 프린터가 PS를 지원하지 못할 만큼 크다면, 전용의 print server를 구축하고 그 서버로 모든 프린터 작업을 전송하여 그 서버에서 Ghostscript 작업이 수행되어 처리되는 것이 바람직하다.

오래된 HP 제품(To older HPs)

일부 프린터(또는 "블랙박스"로 칭하는 네트웍 제품들)는 순수한 TCP 접속과정의 표준이 아닌 방법만을 지원한다. 이러한 범주에 속하는 제품에는 JetDirect 초기 모델(일부 JetDirectEx 제품 포함)이 있다. 기본적으로, 이들 프린터로 출력하려면 특정 포트로 (주로 9100) tcp 접속을 하여 프린터 작업 자료를 전송하면 된다. 이것을 구현하는 방법 은 여러가지가 있으나, 다음에서는 Perl을 이용햇다.


#!/usr/bin/perl
# Thanks to Dan McLaughlin for writing the original version
of this
# script (And to Jim W. Jones for sitting next to Dan when
writing me
# for help ;)
$fileName = @ARGV[0];
open(IN,"$fileName") || die "Can't open file
$fileName";
$dpi300 = "\x1B*t300R";
$dosCr = "\x1B&amp;k3G";
$ends = "\x0A";
$port = 9100 unless $port;
$them = "bach.sr.hp.com" unless $them;
$AF_INET = 2;
$SOCK_STREAM = 1;
$SIG{'INT'} = 'dokill';
$sockaddr = 'S n a4 x8';
chop($hostname = `hostname`);
($name,$aliases,$proto) = getprotobyname('tcp');
($name,$aliases,$port) = getservbyname($port,'tcp')
unless $port =~ /^\d+$/;;
($name,$aliases,$type,$len,$thisaddr) =
gethostbyname($hostname);
($name,$aliases,$type,$len,$thataddr) = gethostbyname($them);
$this = pack($sockaddr, $AF_INET, 0, $thisaddr);
$that = pack($sockaddr, $AF_INET, $port, $thataddr);
if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
# print "socket ok\n";
}
else {
die $!;
}
# Give the socket an address.
if (bind(S, $this)) {
# print "bind ok\n";
}
else {
die $!;
}
# Call up the server.
if (connect(S,$that)) {
# print "connect ok\n";
}
else {
die $!;
}
# Set socket to be command buffered.
select(S); $| = 1; select(STDOUT);
# print S "@PJL ECHO Hi $hostname! $ends";
# print S "@PJL OPMSG DISPLAY=\"Job $whoami\"
$ends";
# print S $dpi300;
# Avoid deadlock by forking.
if($child = fork) {
print S $dosCr;
print S $TimesNewR;
while (<IN>) {
print S;
}
sleep 3;
do dokill();
} else {
while(<S>) {
print;
}
}
sub dokill {
kill 9,$child if $child;
}

11.8 remote printer용 if 실행 (Running an if for remote printers)

lpd의 특징은 원격지의 프린터(remote printer)용 "if"는 실행되지 않는다는 것이다. "if"를 실행하기 위해서 두개의 프린터를 정의하고 프린터 작업을 한번 더 처리한다. 그러한 예로 다음의 printcap을 참고하라.


lj-5:remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:if=/usr/lib/lpd/filter-lj-5:
lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\
:rp=raw:sd=/var/spool/lpd/lj-5-raw:
filter-lj-5 script의 내용은 다음과 같다.
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5

-U 옵션으로 lpr은 (복사본인)lpr이 대몬(daemon)으로 실행되고 있다면 처음 출력 명령을 지시한 사람의 이름이 다시 처리되는 프린터 작업에 동일 하게 지정된다. username을 받는 방법으로 좀 더 나은(robust)방법을 사용해 야 할 것이다. 왜냐하면 특별한 경우 $5(argument 5)가 아닐수도 있다. printcap의 맨페이지를 참고하라.

12. 팩스로 출력

12.1 팩스 모뎀 사용(Using a faxmodem)

팩스를 이용하여 문서를 송신/수신할 수 있는 프로그램은 많이 있다. 이것들 중 가장 다양한 기능을 가진 것이 Sam Leffler 의 HylaFax 이며 ftp.sgi.com에 서 구할 수 있다. 여러개의 모뎀을 지원하며 broadcasting 도 지원한다. 대부분의 리눅스 박스에서 널리 사용되는 프로그램으로 efax가 있다. efax 는 fax를 보내는 간단한 프로그램이다. getty 프로그램의 일종인 mgetty 는 fax를 받을 수 있다.(일부 특정 모뎀에서는 voicemail도 지원한다.)

12.2 원격 출력 서비스 이용(Using the Remote Printing Service)

e-mail을 보내면 fax로 원하는 곳에 보내주는 시험적인 서비스가 있다. (역자주: 대부분의 ISP에서 지원하는 인터넷 팩스 서비스와 유사) PS와 같은 깔끔한 포맷이 지원된다. 전세계를 대상으로 하는 서비스는 아직 문제가 많지만, 여전히 쓸모가 많은 서비스다. 자세한 정보는 FAQ를 참고하라.< www.town.hall.org/fax/faq.html>.

13. 출력용 문서 만들기(How to generate something worth printing)

여기에서 수많은 프로그램이 소개된다. 기본적으로 리눅스는 4가지 유형의 바이너리 실행 파일을 (안정성의 차이는 있지만) 실행시킬 수 있다: Linux, iBCS, Win16/Win32s (dosemu 또는 wine 이용), Mac/68k (Executor 이용) (역자주 : 현재 일부 배포본은 alpha와 sparc으로 포팅되어 판매되고 있다.)

여기서는 Linux 전용(native) 프로그램과 일반적인 유닉스용 프로그램에 대해서 설명하겠다. SCO용 워드퍼펙 처럼 iBCS 에뮬레이션을 통해서 잘 작동하는 상용 프로그램들은 논외로 하겠다. 리눅스의 경우 Unix 환경에서 보편적으로 많이 사용되는 프로그램으로 선택의 폭이 제한된다.

13.1 마크업 언어 (Markup languages)

대부분의 markup language는 대규모 또는 반복적인 프로젝트나 업무 - 문서의 전체적인 흐름(layout)을 컴퓨터로 정리하여 일관된 흐름을 유지 - 에 적합한 도구이다. markup language를 이용해서 멋진 사인을 만들려고 하는 것은 상당한 노력을 필요로 한다...

nroff

nroff는 유닉스에서 최초의 markup language에 속한다. 맨페이지 는 *roff 매크로로 된 대표적인 본보기이다. 많은 사람들은 이를 권장하지만, norff는 ,적어도 내게는 , 필요이상으로 난해하고 새로운 작업용으로 적당하지 않다. 그럼에도 불구하고, 배울만한 가치가 있다. groff를 이용하여 맨페이지를 PS 형식의 문서로 변환할 수 있다. man -t foo | lpr 형식의 man 명령어를 이용하면 된다.

TeX

텍(TeX), 그리고 매크로 패키지인 라텍(LaTeX)은 유닉스 세계에서 널리 사용되는 markup language다. 기술적인 문서나 저작물은 LaTeX 으로 많이 작성되는데, 이는 (LaTeX이) 문서의 전체적인 조감(layout) 을 간단하게 하며, 수학적 표현을 제대로 지원하는 문서처리시스템 (text processing system)이기 때문이다. TeX의 출력물은 dvi(Device Independent) 포맷이며 PS나 HP (Hewlett Packard)의 PCL(Printer Control Language)로 변환할 수 있다. (dvips나 dvilj사용)

SGML

Unix와 Linux용으로 free sgml parser를 구할 수 있다. 이것이 Linuxdoc-SGML 문서 생성 시스템의 기본을 구성한다. 또한 다른 DTD를 지원한다.

HTML

누군가 제안하길, 간단한 프로젝트용으로 HTML로 작성하여 Netscape 으로 출력해 보는 것이었다. 나는 여기에 동의하지 않지만. YMMV

13.2 위지윅(WYSIWYG)

위지윅의 단점을 안고 있는 문서처리 프로그램들이다. 사용해 보고, 다음에서 빠뜨린 내용에 대해서 알려달라.

LyX

LyX는 LaTeX의 front-end이며 많은 가능성을 가진 프로그램이다. 자세한 정보는 LyX의 홈페이지를 참고하라. < www-pu.informatik.uni-tuebingen.de/users/ettrich/> The Andrew User Interface System(AUIS) AUIS에는 위지윅 스타일이며 기초적인 워드 프로세서의 기능을 가진 ez라는 문서 편집기를 포함하고 있다. HTML과 MIME email 및 newsgroup을 지원한다.

상용 프로그램

Caldear와 Red Hat은 위지윅 스타일의 워드프로세서와 스프레드시트 프로그램과 같은 보편적인 사무용 프로그램을 같이 판매한다. 아마 쓸만한 것들로 생각되지만, 한 번도 사용해 보지 못했다. Caldera에서 선(Sun)의 와비(Wabi)를 판매한다고 들었다. 그러므로 남들의 파일을 가지고 작업해야 할때, MS Office등의 윈도용 프로그램 을 실행할 수 있을 것이다.

(역자주:와비는 선(Sun)에서 판매하는 유닉스용 MS Windows 에뮬레이터이다.) Jeff Phillips < jeff@I_RATUS.org>는 Caldera의 Linux용 WordPerfect(슬랙웨어에 설치)을 사용해 보고 그것이 잘 작동한다고 보고했다. 그 프로그램은 다른이들의 예상과 같이 자체적으로 프린터를 지원했다. Caldera는 < www.caldera.com/>에서 자료를 제공하고 있다. RedHat은 Applixware라는 오피스 패키지를 판매한다. 레드햇의 웹사이트인 < www.redhat.com/>에서 관련 자료를 찾아 보라. 그 외의 업체는 (있다면) 자사의 제품에 대해 자료를 제공해 달라.

14. Ghostscript

Ghostscript는 리눅스에서 출력작업시 매우 중요한 역할을 하는 프로그램이다. 유닉스용 출력 프로그램은 대게 PS 파일을 생성하는데, 레이저 프린터에서 PS 지원을 하기위해서는 $100   $300 정도의 추가 비용이 든다. (역자주: 국내 가격은 조금 다를 것이다.) 그러나, 무료로 구할 수 있는 Ghostscript를 이용하여 값싼 프린터에서도 PS 파일을 출력할 수 있다.

/etc/printcap의 "if" 필터와 적절히 조합해 사용한다면 PostScript를 지원하는 프린터를 가진 것처럼 출력작업이 아주 편해진다. Ghostscript는 2가지 형태로 구할수 있다. 상용버전인 Aladdin Ghostscript는 개인에게(for personal use)는 무료로 제공되지만, 상용 리눅스 배포본에는 포함시켜 팔 수 없다. 프리 버전인 GNU Ghostscript에 비해 약 1년정도의 기술적인 격차을 가지고 있다. 예를 들어 Aladdin 버전은 Adobe Acrobat의 PDF(Portable Document Format)을 지원한다.

Ghostscript의 free 버전은 GNU Ghostscript로 불리며, 1년정도 지난 구버전의 Aladdin Ghostscript를 GNU로 기증받은 것이다. (Aladdin사의 이러한 협조를 높이 평가한다. 더 많은 소프트웨어 업체들이 이런 방식으로 free 소프트웨어를 지원해야 한다.) Ghostscript의 최대 단점은 비트맵에서 추출한 글꼴에 있다. 그러나 Ghostscript가 Adobe type 1 글꼴을 인식할 수 있으며, 상용 글꼴은 여러 곳에서 구할 수 있다. Adobe는 괜찮은 글꼴을 Acrobat PDF reader 프로그램과 함께 배포하고 있으며 ATM(Adobe Type Manager)나 글꼴팩 (fontpack)에서 구할 수도 있다.

Ghostscript로 작업할 때에는 -dSAFER 옵션(file에 대한 접근 불허) 을 꼭 사용하라. PostScript는 너무 많은 기능을 가지고 있기 때문에 잘못된 PS 프로그램은 당신을 피곤하게 만들 수도 있다.

14.1 Ghostscript의 출력물 뜯어 고치기 (Ghostscript output tuning)

Ghostscript의 출력물 수준이 미흡하다면, 그것을 수정하는 방법은 많이 있다.(소스코드가 제공되므로 모든 것이 가능하다.)

출력물의 위치와 크기(Output location and size)

위치, 크기, 이미지의 각도는 Ghostscript에 포함된 해당 프린터 드라이버 에 의해 조절된다. 쪽의 길이가 너무 짧거나 긴 경우, 또는 2쪽으로 나눠 찍을 때 한쪽만 크게 찍히는 등 문제가 있을 때, 드라이버의 소스 모듈을 살펴본 다음 특정한 매개변수(parameter)를 입맛대로 조절하면 된다. 유감스럽게도, 각각의 드라이버는 서로 다른 내용을 담고 있으므로 구체적인 방법은 직접 찾아야 한다. 하지만, 대체로 주석으로 된 해설이 잘 되어 있다.

Gamma, dotsizes, etc.

레이저 프린터가 아닌 (잉크젯, 도트)프린터의 출력물에 나타는 점의 크기는 대체로 레이저의 출력물에 비해 크다. 이때문에 그래픽 출력물은 너무 어두워 진다. 이 문제를 해결하려면 별도의 방법을 이용해야 한다. 아래의 파일을 Ghostscript의 lib디렉토리에 복사한 다음 gs가 실제로 특정 파일을 처리하기에 앞서서 이 파일을 먼저 읽어들이도록 gs에 이름을 추가한다. 구체적인 수치는 각자의 프린터에 맞춰서 변경해도 좋다. 수치를 줄일수록 (상대적으로) 더 밝게 출력된다. 특히, 가지고 있는 프린터가 Floyd-Steinberg 알고리즘을 사용한다면 0.2 - 0.15 정도의 값을 사용하는 것이 좋다.

---8<---- gamma.ps ----8<---

%!

%transfer functions for cyan magenta yellow black

{0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer

---8<------------------8<---

이 값을 변경해서 사용하는 경우 컬러 출력시 프린터에 손상을 입힐 가능성도 있다. 그러므로 colorcir.ps 파일을 이용해서 테스트하도록 충고 한다. (그 파일은 ghostscript가 설치된 곳의 examples/디렉토리에 있다)

15. 출력직전의 미리보기 (On-screen previewing of printable things)

대부분의 출력물은 화면을 통해 미리 살펴볼 수 있다.

15.1 PostScript

Ghostscript는 Ghostview라는 X11드라이버를 통해서 PS 파일을 X 화면상에서 살펴볼 수 있다. (역자주: gv라는 변종 프로그램이 더 쓸만하다) 가장 최신 버전은 PDF 파일도 처리할 수 있다.

15.2 TeX dvi

TeX의 출력물인 DVI(DeVice Independant) 파일을 미리 살펴 보기 위해서 xdvi라는 X11용 프로그램을 이용한다. 최근 버전의 xdvi는 PS 부분 을 표시하기 위해서 ghostscript를 호출할 수도 있다. vt100 드라이버도 있다. dgvg로 불린다. tmview는 Linux 및 svgalib에서 잘 작동한다.

16. 도움 주신 분들(Credits)

smbprint에 관한 내용은 Marcel Roelofs< marcel@paragon.nl> 의 글에서 가져왔다. Netware 프린터와 nprint에 관한 내용은 Michael Smith < mikes@bioch.ox.ac.uk>가 제공한 것이다. lpd환경의 직렬 포트 프린터에 관한 부분은 Andrew Tefft가 제공했다. gamma 설정및 ghostscript에 관한 설명은 Andreas가 보낸 것이다. < quasi@hub-fue.franken.de>. Chris Johnson < cdj@netcom.com>이 직렬포트에서 30초간의 closing_wait를 다룬 두개의 단락에 도움을 주었다.




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2004-01-19 23:27:52
Processing time 0.0033 sec