프로젝트 설정
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();
배포 요구사항