[C# WPF] 프린트 출력

Jaemoon Lee·2023년 8월 16일
0

[C샾]

목록 보기
12/13

라벨 프린터 SW를 또 개발하게 되었다.

이번엔 Intermec Printer SW인데...
(인터멕은 허니웰 프린터의 옛 이름이라고 한다.)

Zebra Printer의 경우 ZPL이라고 하는 명령어 모음이 있었고, 아아아아주 빈약하지만 한글도 지원하는 문서를 찾아볼 수 있었다. (+ 깃허브에서 외국 친구들이 잘 만들어준 예제 등등)

하지만 인터멕은 IPL이라는 명령어 모음이 있음에도 한글 자료는 도무지 찾아볼 수가 없고, 찾은거마저도 무슨 16진수 (ex) E16::A15::ES5::16:N0 ...)를 연달아 붙여놓은.. 이상한 예제만 잔뜩 있으며, 그마저도 수동으로 txt 파일을 생성해 입력한 뒤 파일 전송을 해도 프린트가 먹지 않는 등.. 여러 문제에 직면하게 되었다.

아무튼 그래서 가장 간단하고 직관적인 방법

  1. 프린터를 USB로 연결한다.
  2. 프린터 모델에 맞는 드라이버를 설치한다.
  3. 프린터를 Windows 기본 프린터로 선택한다.
  4. 라벨 용지, 인쇄 설정 등을 맞추고 그냥 인쇄한다!

라는 방법을 사용하기로 했다.

===========================================

우선 WPF로 프로그램 개발을 진행한다.
C# NuGet 패키지 관리에 들어가 ZXing.net 패키지를 다운로드, 적용한다.

메인 코드로 돌아와
using ZXing;
using System.Drawing;
using System.Drawing.Printing;
을 선언해준다.

(※ MainWindow XAML은 그냥 printButton_Click 이벤트가 발생하는 버튼 하나만 생성했다.)

        <Button Content="인쇄하기" Height="37" HorizontalAlignment="Left" Margin="273,367,0,0"  
                Name="PrintButton" VerticalAlignment="Top" Width="134"  
                Click="printButton_Click" />

우선 사용할 클래스는 다음과 같다.

ZXing.net이 지원하는 클래스
1. BarcodeWriter - 바코드를 생성함.
2. Format BarcodeFormat - 생성하는 바코드의 포멧을 지정함.
3. Options EncodingOptions - 바코드의 속성을 지정함.
Bitmap - 생성한 바코드를 비트맵 이미지로 변환

Drawing, Printing이 지원하는 클래스
1. PrintDocument - 프린터를 설정하는 클래스
2. PrintPage - 위에 생성한 데이터를 인쇄하는 이벤트 핸들러
3. DrawImage - 위에 생성한 비트맵 이미지를 페이지에 그림
4. DrawString - 위에 바코드를 생성하는 Data가 되는 스트링을 페이지에
5. Print() - 문서를 인쇄하는 함수

        //인쇄하기 버튼 이벤트
        private void printButton_Click(object sender, RoutedEventArgs e)
        {
            // 바코드 내용
            string barcodeContent = "TJLC-40-23043055";

            // 바코드 생성
            BarcodeWriter barcodeWriter = new BarcodeWriter();
            barcodeWriter.Format = BarcodeFormat.QR_CODE; // 2D 바코드(QR CODE) 형식 선택
            barcodeWriter.Options = new ZXing.Common.EncodingOptions
            {
                Width = 50, // 바코드의 너비 조정
                Height = 50, // 바코드의 높이 조정
                Margin = 0, // 텍스트와 바코드 간의 여백 설정
                PureBarcode = true // 텍스트를 숨김
            };
            Bitmap barcodeBitmap = new Bitmap(barcodeWriter.Write(barcodeContent));

            // 프린터 설정
            PrintDocument printDocument = new PrintDocument();
            printDocument.DefaultPageSettings.PrinterSettings.PrinterName = "Intermec PD43 (203 dpi)"; // 프린터 이름 설정

            printDocument.PrintPage += (printSender, printEventArgs) =>
            {
                printEventArgs.Graphics.DrawImage(barcodeBitmap, new Point(10, 3)); // 바코드 위치 조정
                printEventArgs.Graphics.DrawString(barcodeContent, new Font("Arial", 8), Brushes.Black, new Point(45, 3)); // 문자열 위치 조정

            };

            // 프린트 실행
            printDocument.Print();

            // 메모리 해제
            barcodeBitmap.Dispose();
        }

프로그래밍한 코드는 위와 같다.

원래 우리가 사용하고자하는 용지는 40mmx10mm의 작은 용지로... 가로가 긴 특성상 1D 바코드를 사용하려 했으나, 감열지가 노후화된 탓인지.. 203dpi의 낮은 화질 탓인지... 아무리 바코드 사이즈를 조절하거나 프린터 설정을 건드려도 인식하지 못하는 현상으로 인해 불가피하게 QR CODE로 변경하게 되었다.

아무튼 기본적인 Data와 그것을 인쇄하는 프로그램의 틀은 만들었으니,
이제 살을 붙여 로그인, TCP/IP(클라이언트로써 작동한다.)통신, 기타 필요한 라벨을 발행하도록 SW를 개발하여야 한다.

profile
초보개발세발자

2개의 댓글

comment-user-thumbnail
2023년 8월 16일

유익한 글이었습니다.

1개의 답글