WPF에서 프린터 연결 및 인쇄 기능 구현

프로젝트 설정

WPF 프로젝트 생성

dotnet new wpf -n WpfPrintSolution
cd WpfPrintSolution

필요 어셈블리 참조 추가

  • System.Printing (프린터 관리)
  • PresentationFramework (UI 컨트롤)

UI 디자인 (MainWindow.xaml)

<Window x:Class="WpfPrintSolution.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="프린터 제어" Height="500" Width="900">
    <Grid>
        <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="15">
            <FlowDocument x:Name="DocumentContent" 
                          PagePadding="25"
                          FontFamily="Segoe UI"
                          FontSize="12">
                <Paragraph>
                    <Run Text="WPF 인쇄 샘플 문서"/>
                    <LineBreak/>
                    <Bold>생성 시각:</Bold>
                    <TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, 
                                 StringFormat='yyyy년 MM월 dd일 HH시 mm분'}/>
                </Paragraph>
            </FlowDocument>
        </ScrollViewer>
        
        <StackPanel Orientation="Horizontal" 
                    VerticalAlignment="Bottom" 
                    HorizontalAlignment="Center" 
                    Margin="15">
            <Button Content="미리보기" Width="110" Margin="8" Click="ShowPreview"/>
            <Button Content="인쇄 실행" Width="110" Margin="8" Click="ExecutePrint"/>
            <Button Content="프린터 선택" Width="110" Margin="8" Click="PickPrinter"/>
        </StackPanel>
    </Grid>
</Window>

핵심 기능 구현 (MainWindow.xaml.cs)

using System;
using System.Printing;
using System.Windows;
using System.Windows.Documents;

namespace WpfPrintSolution
{
    public partial class MainWindow : Window
    {
        private PrintDialog printDialog;
        private PrintQueue activePrinter;

        public MainWindow()
        {
            InitializeComponent();
            SetupPrinter();
        }

        private void SetupPrinter()
        {
            printDialog = new PrintDialog();
            printDialog.PrintTicket.PageOrientation = PageOrientation.Portrait;
            printDialog.PrintTicket.PageMediaSize = PageMediaSize.ISOA4;
        }

        private void ShowPreview(object sender, RoutedEventArgs e)
        {
            if (printDialog.ShowDialog() == true)
            {
                printDialog.PrintDocument(
                    DocumentContent.DocumentPaginator, 
                    "문서 미리보기"
                );
            }
        }

        private void ExecutePrint(object sender, RoutedEventArgs e)
        {
            try
            {
                if (activePrinter == null)
                    throw new InvalidOperationException("프린터를 선택하세요");
                
                var documentWriter = PrintQueue.CreateXpsDocumentWriter(activePrinter);
                documentWriter.Write(DocumentContent);
                MessageBox.Show("인쇄 작업 시작됨");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"오류 발생: {ex.Message}");
            }
        }

        private void PickPrinter(object sender, RoutedEventArgs e)
        {
            PrintServer server = new PrintServer();
            var availablePrinters = server.GetPrintQueues();
            
            printDialog = new PrintDialog();
            printDialog.PrintQueue = availablePrinters
                .FirstOrDefault(p => p.Name.Contains("Samsung")); 
            activePrinter = printDialog.PrintQueue;
        }
    }
}

주요 기능 설명

인쇄 설정 구성

printDialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
printDialog.PrintTicket.PageMediaSize = PageMediaSize.ISOA5;
printDialog.PrintTicket.CopyCount = 3;

동적 콘텐츠 생성

var newSection = new Paragraph();
newSection.Inlines.Add(new Run("실시간 생성된 텍스트"));
DocumentContent.Blocks.Add(newSection);

프린터 필터링

var printers = new PrintServer().GetPrintQueues();
var target = printers.FirstOrDefault(p => p.Name.Contains("Canon"));

고급 기능

이미지 인쇄

var printImage = new Image {
    Source = new BitmapImage(new Uri("image.png", UriKind.Relative)),
    Width = 300,
    Height = 150
};
DocumentContent.Blocks.Add(new Paragraph(printImage));

인쇄 작업 모니터링

var job = activePrinter.AddJob("DocumentJob");
job.Start();
job.End();

배포 요구사항

  • System.Printing 어셈블리 포함
  • 앱 매니페스트 설정:
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />
  • 타겟 프린터 드라이버 사전 설치

태그: WPF System.Printing PrintQueue XPS PrintDialog

6월 11일 16:20에 게시됨