프린트 설정과 출력하기
리눅스에서 프린팅하기
리눅스 쓰시다가 프린팅 때문에 고생하셨던분 많을겁니다. 제가 모를때는 그냥 파일을 도스 파티션으로 보내서 도스에서 프린트 하곤 했는데. 리눅스상에서 프린터를 쓰니까 편하군요. :) 문서를 편집했으니 이제 프린트두 해야 컴퓨터를 제대로 쓰는게 되겠죠?
리눅스 상에서 프린팅을 하려면 우선 프린터를 점검 해야 합니다. 터미널 상에서
cat 문서화일 >/dev/lp1 (혹은 lp0)
( 0인지 1인지는 해봐야 압니다. 혹은 부팅할때 화면을 유심히 살펴 보시던가..)
이렇게 해서 문서가 프린트가 되면 우선은 성공한겁니다. 프린터를 쓰려면 커널 컴파일 시에 pararell printer에서 yes를 선택한다음에 커널 컴파일을 해줘야 합니다. 음.. 다 되었다고 치고 위 명령을 치면 텍스트가 프린트 되는걸로 믿고 계속 나가겠습니다. /usr/local디렉토리에 보면 apsfilter라는 디렉토리가 있습니다.
이 디렉토리에서 SETUP 프로그램을 실행 시키면 여러 가지 물어봅니다 postscript프린터인가 deskjet인가 postscript를 지원하지 않는 프린터 인가..
For which printer type do you want to setup apsfilter...
1 - for a Postscript printer
2 - for HP Deskjets
3 - for another printer who doesn't support the Postscript language
3 - for another printer who doesn't support the Postscript languageFor which printer
type do you want to setup apsfilter...
데스크젯인경우는 2번을 택하면 되겠고 postscript카드가 있는 프린터는 1번 나머지는 3번을 택하면 되겠네요.
Do you need a more verbose description of the printer drivers ? y/n ?
y를 누르면 프린터에대한 정보들이 나옵니다. 자신과 맞는프린터를 잘 찾아보세요
q를 누르고 프린터 드라이버 맞는걸 선택합니다.
[ appledmp bj10e bj200 declj250 eps9high epson epsonc escp2 ibmpro jetp3852 la50 la75 laserjet
lbp8 lj250 ljet2p ljet3 ljet4 ljet4l ljetplus ln03 m8510 necp6 nwp533 oki182 paintjet pj pjxl
pjxl300 r4081 sparc t4693d2 t4693d4 t4693d8 tek4696 ] pjxl pjxl300 r4081 sparc t4693d2 t4693d4
t4693d8 tek4696 ]
저같은경우는 hp lazerjet 6p인데 드라이버가 맞는게 없네요. 저같은경우는 ljet4로 선택했습니다. (ljet4l로 선택하면 300dpi밖에 안나오는군요.)
Is your printer a (c)olor printer
or a (m)onoprinter ?
칼라인지 모노인지 선택하세요
What paper form do you use (i.e.: a3, a4, letter,...)See /usr/local/apsfilter/doc/paper for valid
sizes...
Note: enter the paper form in lowercase letters:
Note: enter the paper form in lowercase letters:
용지의 크기를 선택한후에
Do you have a (s)erial or a (p)arallel printer interface ?
parallel프린터라고 설정해준 다음 디바이스를 설정해줍니다. 아까 말한 /dev/lp1 혹은 /dev/lp0을 선택하면 됩니다. 저장을 하면 우선은 OK.
/etc/printcap이란 파일에 지금의 내용이 저장이 됩니다.
보통의 파일은 lpr명령으로 출력할수 있습니다. 출력은 보통 spool에 싸였다가 들어온 순서대로 하나씩 출력을 하게 되는데 만약 이상한 문자가 찍힌다거나 해서 출력을 멈추고 싶을때는 lprm이란 명령을 쓰면 됩니다. 프린터에 무엇이 출력되고 있는지 혹은 출력 될것인지는 lpq라는 명령을 쓰면되는데 lprm이란 명령을 쓰면 lpq했을 때 나오는 출력물들이 모두 취소가 됩니다. (참고로 lprm이란 명령을 쓰지 않으면 리눅스가 돌아가는 상태에서 프린터를 켜놓는다면 이것이 끝날 때 까지 계속 프린터가 작동할 것입니다. 프린터에 있는 취소 버튼을 눌러봤는데 그걸로는 어림도 없더군요..)
글에서 프린팅
글로 들어갑니다. 한글에서 프린트 할 때 적절한 드라이버를 선택해야 합니다. 6p드라이버가 도스용은 있으나 리눅스용은 없는 관계로 이걸로 프린트가 안될겁니다. 따라서 다른 걸로 선택하세요. 저는 lj4 pcl5e.pdr로 선택했습니다. 전송포트에서 표준명령(lpr)을 선택하고 프린터 이름은 raw라고 칩니다. 그러면.. 제대로 프린트가 될것입니다.( 저의 경우만 나열해서.. 다른경우는 잘 모르겠네요. 아마도 비슷할겁니다.)
XV에서 프린팅
print버튼을 치면 xv prompt 창이 뜨는데 lpr이라고 기본적으로 써 있을겁니다. 여기서 color grayscale b/w 등의 버튼이 있는데 흑백 프린터의 경우(제 경우) b/w(black/white)만 선택하지 않으면 좋은 이미지를 얻을수 있습니다. color나 grayscale이나 찍는 그림은 똑같아요. 이를 선택하면 그다음 용지 선택을 합니다.
세로로 찍을것인가 (portrait) 가로로 찍을것인가 (landscape) 그다음 크기를 어느정도로 할것인가 용지 크기 등등..을 맞춰주고 ok를 누르면 알아서 찍어줍니다. 600dpi로 찍으니까 선명하게 나오는군요..
ps 파일
ghostview로 혹은 gv라는 프로그램을 ps화일을 볼수 있습니다. 대표적인 예가 호랑이 그림(이거 아시는분만 아시는건가?) 아무튼.. s화일로 찍으시면.. 정말 환상적인 그림을 볼수 있습니다. 또한 tex같은걸로 만든 화일도 ps화일로 변환해서 프린트 하면.. 선명하게 나오겠죠? 호랑이 한번찍어보세요..흐흐..
만약 프린터기가 제대로 설정 됐는지 알아 볼려면(설정은 64번에서 설명 했지요) 프린팅의 가장 기초적(?)인 명령을실행시켜 봅니다.
eun-young:~# cat print.txt > /dev/lp1 (lp0,lp2 일수도 있습니다)
이래서 찍힌다면 일단 한단계는 설공 한 것입니다.
만약 계단현상등이 바생한다면 해결책은 64번이나 아래부분에 있으니 참고 하셔요. 또한 문서를 찍으려면 ps 화일로 바꾸는데 그 방법은 다음과 같습니다.
eun-young:~# hpscat print.txt > print.ps
그러면 print.txt 하는 텍스트 문서가 print.ps 라는 ps 화일로 변환 됩니다.
만약 hpscat이 없다는 메세지가 나오면 자료실에 가셔서 hpscat 받으셔요 ^^;ps 화일은 고스트뷰(gv)로 보시면 됩니다.
그럼 잡담은 이만 마치고 본격적인 글로 들어가서...
9번 팁란에 있는 이만용님의 "고스트뷰에서 ps 화일" 이라는 글을 올리겠습니다.
____________________________________________________________________________
오늘 사용담으로 쓰고자 하는 것은 전혀 새로운 내용이 아닙니다. 바로 리눅스 프린팅에서 중요한 화일인 /etc/printcap 화일에 대해서 약간 알아보고자 하는 겁니다. 여러분도 아시다시피 리눅스는 멀티유저 시스템이므로 도스에서와 같이 문서 프린팅시에 프린터 포트에 직접 자료를 보내는 방식을 사용하지 않습니다.
서버/클라이언트 체계를 가지는 리눅스 프린팅 시스템은 lpd 라고 하는 프린팅 서버가 작동하는 상황에서 lpr 이라는 클라이언트의 요청을 받아 적절하게 프린 팅을 해냅니다. 멀티유저/멀티태스킹 상황에서 여러 사용자와 여러 프로그램의 프린팅 요청이 서로 꼬이지 않고 원활하게 이루어지도록 하는 것이지요.
리눅스에 대한 감을 잡기가 힘들었던 초보 시절에는 요놈의 프린팅이 너무도 힘 든 일이었습니다. 특히 저와 같은 HP 데스크젯 사용자들은 PCL 모드 하에서 "계단 현상" 같은 것을 만났을 때는 어찌할 줄을 몰라했을 겁니다. 도대체 엄청나게 많은 셋팅 화일에 어떤 것을 건드려야 할 지도 무서울 지경이었죠.
그래서 프린팅을 할 때는 항상 도스로 부팅해야 하는 우스꽝스러운 짓을 매번 반 복할 수 밖에 없었습니다.
리눅스를 쓰다보면 도스 시절에는 만나기 어려웠던 고급 문서 스타일들을 만나게 되는데요, 그 중에 하나가 바로 포스트스크립트 화일(ps)입니다. 이 문서로 되어 있는 프로그래밍 매뉴얼을 많이 찍는 편인데요, 데스크젯 500 정도에서도 아주 깔 끔한 문서를 얻을 수 있습니다. 제본을 해서 책으로 쓰고 있을 정도니까요航.
또 말이 길어졌군요. 오늘은 X 윈도우에서 포스트스크립트 문서를 볼 수 있는 고 스트뷰(Ghostview)에서 File 메뉴의 Print 항목을 통해서 프린트하는 방법에 대하여 말씀드리겠습니다. 원하실 때는 한 장 한 장씩 프린트를 할 수도 있지요. 한참 동안을 엄두도 못내고 관심도 못져가졌던 printcap 화일이지만, 요즘에 들어서야 뭔가 조금 알 수 있게 된 것 같습니다.
------------------------------------------------------------------------------
[ printcap 이란? ]
-----------------------------------------------------------------------------
여러분의 /etc 디렉토리로 한 번 가보십시요. 그러면 수많은 화일들 중에서 print- cap이라는 화일을 찾으실 수 있을 겁니다. 이 화일은 여러분의 프린팅에 관한 모든 사항을 기재하고 있는 녀석입니다. 이 화일의 목적은 "일관성"입니다.
예를 들어 아래한글 화일은 아래 한글에 들어가서 프린팅하고, 워드 문서는 워드 프로그램에 들어가서 프린팅하는 것이 일반적입니다. 그래픽 화일은 또 그 나름의 프로그램을 써서 프린팅을 하지요. 하지만 리눅스에서는 이와 같은 사용법을 별로 좋아하지 않습니다. 아래한글 화일 프린팅에 대한 <논리적 프린터명 : 예를 들어서 hwpprn>을 정의하고, 워드 문서 프린팅에 대한 <논리적 프린터명>을 wordprn 이런 식으로 정의해놓고, 실제 프린팅시에는 lpr -P<논리적 프린터명> <문서화일명> 이런 식으로 사용하는 것을 좋아합니다.
처음에는 신경써주어야 할 것이 좀 많지만, 일단 printcap 화일을 제대로 만들어 만 준다면 항상 lpr 명령을 가지고 손쉽게 프린팅할 수 있어 좋습니다.
하나의 물리적인 프린터를 가지고 여러 가지 작동 방식에 대한 논리적 프린터명 과 알맞는 동작을 설정해줌으로써 여러분의 프린터를 요술지팡이로 만들어 드립니다.
------------------------------------------------------------------------------
[ printcap에서 프린터 정의하기 ]
------------------------------------------------------------------------------
printcap 화일을 한 번 살펴 보십시요. 뭐 이런게 다 있어! 할 정도로 인간이 알 아볼 수 없을 만한 형식으로 프린터를 정의하고 있습니다. 하지만 알고 나면 별 것 아닙니다.
<!-- 형 식 -->
NAME1|NAME2|NAM3:STRING_CAPABILITY=STRING:
:NUMERIC_CAPABILITY#NUMBER:BOOLEAN_CAPABILITY:
자, 처음 NAME1, NAME2, NAME3 는 논리적 OR 기호 "|"로 분리하여 설정합니다.
이는 lpr -P<NAME> 에서 쓰실 바로 그 이름입니다. NAME1 또는 NAME2 또는 NAlME3 는 모두 같은 논리적 프린터를 지칭하는 말입니다. 하나만 지정해주셔도 되고 3개 까지 지정하실 수 있습니다. 만약 첫번째 이름이 lp 라면 -P 옵션을 주지 않으셨 을 때의 기본 프린터입니다. 다음의 예를 보시죠.
lp|Deskjet500|Oh my sexy printer: ... 어쩌구 저쩌구
이 때 lp, Deskjet500, Oh my sexy printer 는 모두 같은 프린터를 지칭하는 이름 이 됩니다. lpr -Plp 또는 lpr -PDeskjet500 또는 lpr -P"Oh my sexy printer" 이 렇게 사용하시면 됩니다. 마지막 이름에는 빈 칸이 있으므로 옵션 지정시에 따옴표 로 묶어주셔야겠죠?
그 다음으로 아셔야 할 사항은 콜론(:)의 사용입니다. 이는 앞으로 모든 셋팅을 서로 구분해주는 구분자(delimeter)의 역할을 합니다. <셋팅1>:<셋팅2>:<셋팅3> 이런 식으로 구분합니다. 꼭 콜론을 하나만 쓰란 법은 없고, 여러번 사용해도 괜찮 습니다. 그리고 프린터 정의를 여러줄에 걸쳐 작성할 때는 문자를 사용합니다. 이런 건 많이 보셨겠죠?
1. STRING_CAPABILITY
여기에 해당하는 것은 lp 옵션과 같이 프린터 포트명 등의 문자열을 지정하는 셋팅 을 말합니다. 문자열로 셋팅하는 경우에는 모두 lp=/dev/lp1 이런 식으로 = 문자를 써주시고 그 뒤에 문자열을 써주십시요.
2. NUMERIC_CAPABILITY
여기에 해당하는 것은 mx 옵션과 같이 프린트 작업의 크기를 블럭 숫자!로 나타내 는 경우입니다. 숫자와 관련된 것은 모두 mx#0 뭐 이런 식으로 # 문자 다음에 숫자 를 써줍니다.
ü 3. BOOLEAN_CAPABILITY
이것은 논리값에 해당하는 것으로서 그냥 써주면 True 안써주면 False 이므로, 그 셋팅을 써기만 하면 됩니다. sh 나 sf의 경우 그냥 :sh: 또는 :sf: 이런 식으로 말입니다. 뭐든지 실전이 중요하겠지요?
------------------------------------------------------------------------------
[ printcap 실전 ]
------------------------------------------------------------------------------
저의 HP 데스크젯 500 프린터를 가지고 설명드리기로 하겠습니다. 이 녀석은 텍스 트를 출력할 때 도스 스타일로 LF(Line Feed)와 CR(Carriage Return)을 둘 다 보내 주어야 다음 줄에서 정상적으로 찍힙니다.
그런데 Un*x 텍스트 문서는 오로지 LF 만을 가지고 있기 때문에 그냥 프린트하면 Carriage Return을 하지않고 Line Feed 만 하므로 어떻게 되겠습니까? 다음과 같이 찍히게 됩니다.
I'm every woman.
It's all in me.
를 출력하면
I'm every woman.
It's all in me.
이걸 바로 "계단현상" (Staircase Effect)이라고 말합니다.
이 문제를 해결하기 위해서는 HP 프린터 더러 짜샤! 앞으로 LF는 몽땅 CR+LF로 생 각해! 라고 제어문자를 보내주면 됩니다. 이것이 첫번째 해결방법이지요. 하지만 이런 것이 들어먹지 않는 놈은 sed 등을 이용해서 각 줄마다 CR 문자를 강제로 넣 어서 출력하게 하는 겁니다. 이런 짓을 매번 프린트할 때마다 해준다는것은 좀 문제가 있죠? 그래서 "필터(filter)"라는 개념이 있습니다. if 라는 셋팅에서 해줄것인데, 필터라는 것는 lpr 프린팅에서 아주 중요한 개념입니다. if 필터를 지정해 주면 프린트 시작 전에 문서에 대한 적절한 사전작업과 가공작업을 해낼 수 있습니 다. 실제로 lpr 은 문서에 대한 적절한 처리를 하는 것이 아니라 적절한 처리를 할 수 있는 필터를 불러내서 쓰는 것에 불과하죠. 그 녀석은 프린팅작업의 전체적인 관리인일 뿐입니다. 다른 노가다는 필터들이 합니다.
lp|Deskjet500:lp=/dev/lp1:
:sd=/var/spool/lp1:
:sh:
:sf:
:mx#0:
:lf=/var/spool/lp1/HPLog:
:if=/var/spool/lp1/LFasCRLF:
저는 여기서 아주 많이 쓰이는 몇 가지 셋팅에 대해서만 논하겠습니다.
자세한 것은 HOWTO 문서(Printing-HOWTO)를 참고하시기 바랍니다.
1. lp=/dev/lp1
lp 는 프린터 포트를 지정하는 것입니다. 여러분의 프린터는 대부분 병렬 포트에 물린 프린터겠죠? 시리얼 프린터는 여기서 설명을 생략합니다. 장치명은 /dev/lp0 /dev/lp1, /dev/lp2 이런 식으로 나갑니다. 어떤 프린터가 작동하는지는 cat README > /dev/lp1 이런 식으로 짧막한 문서를 cat 명령을 통해서 실험해보십 시요. 프린터가 작동하는 장치명이 바로 우리가 사용할 프린터 포트명입니다.
저는 /dev/lp1 이더군요.
아! 커널에서 패러렐 프린터 지원을 yes 로 하셨겠지요? :)
/dev/null로 하시면 어떤 일이 벌어질까요? 생각해보세요.
네트워크 프린터의 경우에는 포트라는 개념이 좀 이상하죠? lp= 이라고만 써주셔야 합니다. 자세한 것은 HOWTO 문서를 참고하세요. 중고등학생들을 위해서 누구 멋지 게 번역해주실 분 안계십니까?
2. sd=/var/spool/lp1
sd 는 Spool Directory, 스풀 디렉토리를 지정해주는 겁니다. lpr 에 의한 프린팅 은 당연히 멀티태스킹하에서 작동하므로 스풀링을 합니다. 보통 /var/spool 디렉토리의 하부 디렉토리에 지정해줍니다. root 권한으로 적절한 디렉토리를 만들 어서 사용하세요. 그 디렉토리는 다음과 같은 사용자 권한을 갖게 만드세요.
사용자 root 그룹 daemon 사용자권한 chmod ug=rwx,o=rx 이런 식으로 말입니다.
3. sh
lpr 은 다중 사용자 환경에서 쓰이는 멋진 프린터 클라이언트입니다. 따라서 여러분 이 단일 사용자라 할지라도 그런 걸 알 리가 있나요? 보통 한 사람의 작업 이 시작했음을 알리기 위해서 맨 첫 장은 그 사람의 계정명이 찍혀 나옵니다. 이런 일은 필요가 없겠지요? 바로 sh 즉 Suppress Header 라는 셋팅을 주시면 sh가 True 가 됩니다.
4. sf
프린팅 작업이 끝난 후 보통 FormFeed 를 함으로써 종이를 내보냅니다. 이런 일이 필요없다면 sf 즉 Suppress ForeFeed 를 설정하세요. 도트 프린터에서 유용하게 쓰이겠군요. 연속용지에서요.
5. mx#0
mx 셋팅은 스풀 데이타의 크기를 제한하는 겁니다. 0으로 지정하면 제한이 없어집 니다. 보통의 경우 그냥 0으로 해주십시요. 왜 스풀 데이타 크기를 제한하는지는 여러분이 생각해보세요. 1K 단위로 지정을 하는데, 만약 지정된 스풀 데이타보다 큰 경우가 발생하면 에러 메세지를 보내고 프린팅을 중지합니다.
6. lf=/var/spool/lp1/HPLog
프린팅에 대한 log 상황을 기록하는 화일입니다. 만약 그 화일을 만드시지 않으면 아무런 기록도 생기지 않습니다. 미리 만들어 주셔야 합니다.
7. 윽! 드디어 필터가!!! if=/var/spool/lp1/LFasCRLF
자, 이제 중요한 필터가 나왔습니다. 이 녀석이 중요한 일을 해주는 스크립트 화일 입니다. /var/spool/lp1/ 디렉토리에 LFasCRLF 라는 스크립트를 다음과 같이 작성 해주십시요.
#!/bin/sh
# Filter for HP printers to treat LF as CRLF
# the ``echo -ne'' assumes that /bin/sh is really bash echo -ne 33&k2G
cat
echo -ne f
if 는 Input Filter라는 의미입니다. if 가 있는 경우에는 lpd 는 자료를 직접 프린터 포트에 전송하는 것이 아니라 요놈의 입력 필터를 실행시켜서 그 녀석에게 자료를 stdin 으로 보내줍니다. 그러면 필터는 stdin 으로부터의 입력에 대하여 적절한 처리를 한 후 그 자료를 stdout으로 보내줍니다. 아주 중요합니다. lpd는 필터에게 stdin으로 리다이렉트시켜주고 필터는 stdout으로 자료를 내보냅니다. stdout으로 나오는 자료를 lpd가 포트에다 써주는 겁니다.
바보 도스에서는 리다이렉트 기능이 보잘 것 없지만, Un*x에서는 정말로 강력한 기능입니다. 비교가 안되지요.
위 필터는 cat 명령으로 자료를 stdout으로 보내기 전에 echo 명령을 통해서 stdout에다 프린터 제어 문자열을 보냅니다. 물론 HP 데스크젯이 알아듣는 제어 문 자열이겠지요?
앗! 스크립트는 물론 chmod를 이용하셔서 실행가능하게 만드셔야겠죠? :) 사용자 root, 그룹 daemon, 퍼미션은 -rwxrwxr-x 입니다.
이 필터를 어떻게 만드는가는 여러분의 상상력에 달려있습니다.
------------------------------------------------------------------------------
[ printcap 이용하여 Ghostview에서 낱장 PS 찍기 ]
------------------------------------------------------------------------------
다음과 같은 새로운 논리적 프린터 정의를 printcap에 추가해줍니다.
Deskjet|Ghostview Print|:lp=/dev/lp1:
:sd=/var/spool/lp1:
:lf=/var/spool/lp1/GhostviewPrintLog:
:if=/var/spool/lp1/IF_for_ghostview:
:mx#0:
:sh:
IF_for_ghostview 스크립트의 내용은 다음과 같습니다.
#!/bin/sh
gs -q -dSAFER -sPAPERSIZE=a4 -dNOPAUSE -r300 -sDEVICE=djet500 -sOutputFile=- -
아주 간단하죠? 그냥 gs를 이용해서 찍는 것에 불과하죠. 모든 일은 사실 gs가 해 주는 거니까요. 다른 프린터 기종을 쓰시는 분들은 적절히 바꾸어주시면 됩니다.
-sDEVICE 부분을 바꾸어 주셔야겠죠? -q 와 -dNOPAUSE를 꼭 넣어주시고요.
중요!!! 필터는 lpd 에 의해 stdin으로부터 자료를 제공받습니다. 그리고는 stdout 으로 자료를 출력해주어야 합니다. 따라서 명령줄의 맨 마지막 줄의 - 는 아주 중요합니다. 그리고 -sOutputFile=- 또한 강제적입니다! :)
이렇게 하시고 나면 X 윈도우용 어플 고스트뷰에서 원하시는 페이지를 찍으실 수 있습니다. 원하는 페이지 한 장 또는 마크(Marked)한 페이지만 찍을 수 있는데, File 메뉴의 Print marked pages... 뭐 이런 메뉴를 클릭하시면 프린터명을 물어 옵니다. 그 때 Deskjet 이라고 적어주세요. 그러면 지잉! 하고 멋진 포스트스크립 트 문서가 찍힐 겁니다.