Tkprint 확장 패키지

A. Tkprint 확장 패키지 소개 및 설치

이 확장 패키지는
MS-윈도에서 윗젯의 내용을 프린터로 출력하는 기능을 지원하는 패키지이다.
텍스트 윗젯의 문자열들과 캔버스 윗젯의 그림을 출력할 수 있으며
이미지를 파일로 저장하거나 클립보드로 보낼 수도 있다.
그리고 이 패키지를 활용하면 텍스트파일을 읽어서
출력하는 용도로도 사용할 수 있다.
이미지를 다루는 것은 다른 프로그램를 사용하는 것이 더 편리할 것 같아서
이 강좌에서는 텍스트 출력과 관련되는 내용만 다루도록 한다.

이 확장패키지의 텍스트 출력기능은 쓸 만한데
한가지 치명적인 문제점은 한글이 제대로 출력되지 않는다는 것이다.
한글을 제대로 출력시킬 수 있는 방법을 알게된다면
이 문서를 갱신하여야 할 것이다.

먼저 확장패키지 게시판에 2005년 7월 22일자로 올라와 있는
tkprt117.zip 파일을 내려받는다.
이것을 알집 등의 압축 프로그램을 써서 tcl/tk가 설치된
디렉토리의 아래에 있는 lib 디렉토리 아래에 풀어 넣는다.
그러면 lib 디렉토리 안에 Tkprint1.1 디렉토리가 놓이고
그 안에 pkgIndex.tcl과 tkprt11.dll 등의 파일이 놓이게 된다.
디렉토리나 파일명의 대소문자 여부는 상관없다.

이 패키지를 사용할 때는 이렇게 명령한다.

package require Tkprint

B. 텍스트 윗젯의 문자열들을 프린터로 출력

텍스트 윗젯에 포함된 문자열들을 프린터로 출력하기 위한 명령이
"Print" 명령이다.
필요하면 헤더와 푸터를 달 수도 있다. 사용 형식은 아래와 같다.

Print pathname ?-option value? ?...?

여기서 "pathname"은 윗젯의 패스네임이다.
사용할 수 있는 옵션을 살펴보자.

1. -title

"-title" 옵션은 제목에 사용할 문자열을 지정한다.
글꼴이 지정되지 않으면 "cget -font" 명령을 통해
텍스트 윗젯에서 얻어지는 글꼴을 사용한다.

2. -margins

이 옵션은 페이지의 여백을 설정한다.
기본값은 "1.0,1.0,1.0,0.5"이며 각각 왼쪽, 위, 오른쪽, 아래의 여백을 의미하며
단위는 인치이다.
많은 프린터에서 프린터 드라이버 다이알로그에서 설정한
여백의 설정이 또한 영향을 미칠 수 있다.
여백을 설정하는 형식은 아래와 같다.

... -margins left,top,right,botton ...

3. -paginate

이것은 제목, 날짜, 페이지번호를 포함하는 헤더의 출력여부를 결정하는 것이다.
이 옵션이 "false"나 "no", 또는 "0" 일때는 헤더가 출력되지 않으며
헤더와 푸터와 관련된 옵션에서 설정한 모든 값들이 무시된다.
이 옵션의 기본값은 "true"인데 헤더나 푸터를 지정하지 않으면 기본값이 적용된다.

4. -header와 -footer

이 옵션들은 헤더와 푸터의 형식을 설정하는 것이다.
헤더와 푸터의 값은 문자열로 표현되며 아래와 같은
형식지정자들을 포함할 수 있다.

%d: 날짜와 시간

%t: 제목

%n: 다음 페이지 번호

%p: 현재 페이지 번호

%%: 글자 "%"

%N: "N"은 숫자로 이루어진 문자열이며, 그 숫자만큼의 공백을 뜻한다.

헤더와 푸터에 포함되는 글자는 최대 254자이며 그 이상을 넘어서는
글자들은 잘려나간다. 위의 형식지정자들은 문자열의 처음이나
공백, 탭, 개행문자 뒤에서 효력을 나타낸다.
예를 들어,

Print .text -title "My Example" -header "%t printed %d"

위의 명령은 아래와 같은 헤더를 생성한다.

My Example printed Tue May 09 22:59:00 2006

5. -font와 -pagefont

"-font" 옵션은 헤더와 푸터에 사용될 글꼴을,
"-pagefont" 옵션은 출력될 내용에 사용될 글꼴을 각각 지정하는데 그 형식은 이렇다.

facename size ?bold? ?normal? ?light? ?italic? ?underline? ?strikeout?

"facename"은 컴퓨터에 설치되어 있는 글꼴의 이릉이어야 하며
"size"는 글자의 원하는 크기를 숫자로 나타낸 것이다.
다른 키워드들은 선택적이며 출력될 결과의 외관을 바꾸는데 사용된다.
기본값은 "Terminal 12 normal"이며 이것은 MS-윈도가 설치된
컴퓨터에 없을 수도 있다.

글꼴을 사용할 때 여러 프린터가 각기 다른 해상도를 가지기 때문에
같은 글꼴을 지정해도 다르게 출력될 수 있다.
이 확장패키지에서는 프린터의 해상도가 인치당 72 픽셀인 것으로 가정하고
글꼴의 크기를 맞췄다. 이렇게 하면 1024 x 768 모드의 17인치
모니터에서 보는 결과와 유사하게 보인다.
만약 글꼴의 크기가 원하는 대로 되지 않는다면 시행착오가 필요할 것이다.

6. -tabwidth

"-tabwidth" 옵션은 탭을 몇 개의 공백문자로 바꿀 것인가를 결정한다.
기본값은 "8"이다. 만약 이것을 "0"으로 설정할 경우
탭 문자는 선택된 글꼴에 맞는 그래픽 기호로 출력된다.

C. 텍스트파일을 출력하는 방법

텍스트파일을 읽어서 프린터로 출력하는 명령을 직접적으로 지원하지는 않지만
텍스트파일의 내용을 읽어서 텍스트 윗젯에다 저장한 후
이것을 출력하면 될 것이다.
텍스트 윗젯이 창에 나타났다가 없어지면 이상하게 보일 수도 있으므로
임시로 만들어진 텍스트 윗젯을 pack이나 grid 명령을
하지 않은 상태에서 사용한 후 destroy 명령으로 메모리에서 지우면 되겠다.
이것을 구현하기 위한 프로시져를 만들어 보았다.

package require Tkprint
proc PrintFile {fname {title " "}} {
set f [open $fname r]
text .temptext
.temptext insert end [read $f]
Print .temptext -title $title
destroy .temptext
close $f
}

위의 코드를 한번 실행한다.
그 후 아래의 형식으로 명령한다.

PrintFile filename ?title?

여기에서 "filename"은 출력하기를 원하는 파일의 이름이며 꼭 있어야 한다.
"title"은 제목이며 필수적이지는 않아서 넣어도 되고 없어도 된다.
만약 명령에서 제목을 명시하지 않으면 제목이 공백으로 출력된다.
예를 들어 출력하기를 원하는 파일이름이 test.txt라 하고
제목을 "My Text"라고 한다면 이렇게 명령하면 되겠다.

PrintFile test.txt "My Text"

텍스트 윗젯 외의 다른 윗젯의 내용을 사용자가 원하는 포맷으로 출력할 때도
이 방법을 응용하면 될 것이다.