다음을 통해 공유


인쇄 개요

업데이트: 2007년 11월

Microsoft .NET Framework에서는 WPF(Windows Presentation Foundation)를 사용하는 개발자를 위해 다양하고 새로운 인쇄 및 인쇄 시스템 API를 제공합니다. Windows Vista에서는 Windows Forms 응용 프로그램을 만드는 개발자와 비관리 코드를 사용하는 개발자도 이러한 향상된 인쇄 시스템 기능 중 일부를 사용할 수 있습니다. 이 새 기능의 핵심 부분은 새로운 XPS(XML Paper Specification) 파일 형식과 XPS 인쇄 경로입니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • XPS 정보

  • XPS 인쇄 경로

  • GDI 인쇄 경로

  • XPSDrv 드라이버 모델

  • 관련 항목

XPS 정보

XPS는 전자 문서 형식, 스풀 파일 형식 및 페이지 기술 언어입니다. 이 개방형 문서 형식은 XML, OPC(Open Packaging Conventions) 및 기타 업계 표준을 사용하여 플랫폼 간에 호환되는 문서를 만듭니다. XPS를 사용하면 디지털 문서를 쉽게 만들고, 공유하고, 인쇄하고, 보고, 보관할 수 있습니다. XPS에 대한 자세한 내용은 XML Paper Specification: Overview를 참조하십시오.

XPS 기반 콘텐츠를 WPF를 사용하여 인쇄하는 기술에 대해서는 XPS 문서 인쇄 샘플과 방법: 프로그래밍 방식으로 XPS 파일 인쇄를 참조하십시오. 이 항목의 내용을 검토하는 동안 이러한 샘플을 참조하면 유용합니다. 비관리 코드 개발자의 경우 Microsoft XPS 문서 변환기 프린터 이스케이프의 도움말을 참조해야 합니다. Windows Forms 개발자의 경우 전체 XPS 인쇄 경로를 지원하지 않지만 GDI에서 XPS 간 하이브리드 인쇄 경로를 지원하는 System.Drawing.Printing 네임스페이스에서 API를 사용해야 합니다. 아래에서 인쇄 경로 아키텍처를 참조하십시오.

XPS 인쇄 경로

XPS(XML Paper Specification) 인쇄 경로는 Windows 응용 프로그램에서 인쇄를 처리하는 방법을 다시 정의하는 새로운 Windows 기능입니다. XPS에서 문서 표시 언어(예: RTF), 인쇄 스풀러 형식(예: WMF) 및 페이지 기술 언어(예: PCL 또는 Postscript)를 바꿀 수 있으므로 새 인쇄 경로에서는 응용 프로그램 게시로부터 인쇄 드라이버 또는 장치의 마지막 처리까지 XPS 형식을 유지합니다.

XPS 인쇄 경로는 개발자에게 WYSIWYG("what you see is what you get") 인쇄, 향상된 색 지원 및 크게 향상된 인쇄 성능과 같은 여러 이점을 제공하는 XPSDrv(XPS 인쇄 드라이버 모델)를 기반으로 만들어졌습니다. XPSDrv에 대한 자세한 내용은 Device Drivers를 참조하십시오.

XPS 문서에 대한 인쇄 스풀러의 작동은 기본적으로 이전 버전의 Windows에서와 동일합니다. 그러나 기존 GDI 인쇄 경로와 더불어 XPS 인쇄 경로를 지원하도록 향상되었습니다. 새 인쇄 경로에서는 기본적으로 XPS 스풀 파일을 사용합니다. 이전 버전의 Windows용으로 작성된 사용자 모드 프린터 드라이버는 계속 작동하지만 XPS 인쇄 경로를 사용하려면 XPSDrv(XPS 프린터 드라이버)가 필요합니다.

XPS 인쇄 경로는 다음을 비롯한 많은 이점을 제공합니다.

  • WYSIWYG 인쇄 지원

  • 32bpc(채널당 비트 수), CMYK, 명명된 색, n개 잉크를 포함하는 고급 색 프로필에 대한 기본 지원과 투명도 및 그라데이션에 대한 기본 지원

  • .NET Framework 및 Win32 기반 응용 프로그램에 대한 향상된 인쇄 성능

  • 업계 표준 XPS 형식

기본적인 인쇄 시나리오의 경우 사용자 인터페이스, 구성 및 작업 전송의 단일 진입점에서 단순하고 사용이 쉬운 API를 사용할 수 있습니다. 고급 시나리오의 경우 UI(사용자 인터페이스) 사용자 지정(또는 UI 전혀 사용 안 함), 동기 또는 비동기 인쇄 및 일괄 인쇄 기능을 위한 지원이 추가됩니다. 두 옵션 모두 완전 또는 부분 신뢰 모드에서 인쇄 지원을 제공합니다.

XPS는 확장성을 염두에 두고 설계되었습니다. 확장성 프레임워크를 사용하면 XPS에 기능을 모듈식으로 추가할 수 있습니다. 확장성 기능은 다음과 같습니다.

  • Print Schema. 이 공용 스키마는 정기적으로 업데이트되며 이를 통해 장치 기능을 빠르게 확장할 수 있습니다. 아래에서 PrintTicket 및 PrintCapabilities를 참조하십시오.

  • 확장 가능한 필터 파이프라인. XPSDrv(XPS 프린터 드라이버) 필터 파이프라인은 XPS 문서의 직접 인쇄 및 확장 가능한 인쇄를 모두 사용할 수 있도록 설계되었습니다. Windows Driver Development Kit에서 "XPSDrv"를 검색해 보십시오.

인쇄 경로 아키텍처

Win32 및 .NET Framework 응용 프로그램에서는 모두 XPS를 지원하지만 Win32 및 Windows Forms 응용 프로그램에서는 XPSDrv(XPS 프린터 드라이버)용 XPS 형식의 콘텐츠를 만들기 위해 GDI에서 XPS로의 변환을 사용합니다. 이러한 응용 프로그램에서는 XPS 인쇄 경로를 사용할 필요가 없으며 계속해서 EMF(확장 메타파일) 기반 인쇄를 사용할 수 있습니다. 그러나 대부분의 XPS 기능 및 향상된 기능은 XPS 인쇄 경로를 대상으로 하는 응용 프로그램에서만 사용할 수 있습니다.

Win32 및 Windows Forms 응용 프로그램에서 XPSDrv 기반 프린터를 사용할 수 있도록 XPS 프린터 드라이버(XPSDrv)에서는 GDI에서 XPS 형식으로의 변환을 지원합니다. 또한 XPSDrv 모델에서는 Win32 응용 프로그램에서 XPS 문서를 인쇄할 수 있도록 XPS에서 GDI 형식으로의 변환기도 제공합니다. WPF 응용 프로그램의 경우 쓰기 작업의 대상 인쇄 큐에 XPSDrv 드라이버가 없으면 항상 XpsDocumentWriter 클래스의 WriteWriteAsync 메서드를 통해 XPS에서 GDI 형식으로의 변환이 자동으로 수행됩니다. Windows Forms 응용 프로그램에서는 XPS 문서를 인쇄할 수 없습니다.

다음 그림에서는 인쇄 하위 시스템을 보여 주며 Microsoft에서 지정하는 부분과 소프트웨어 및 하드웨어 공급업체에서 정의하는 부분을 설명합니다.

XPS 인쇄 시스템

기본 XPS 인쇄

WPF에서는 기본 및 고급 API를 모두 정의합니다. 광범위한 인쇄 사용자 지정이나 전체 XPS 기능 집합에 대한 액세스가 필요 없는 응용 프로그램의 경우 기본 인쇄 지원을 사용할 수 있습니다. 기본 인쇄 지원은 최소의 구성만 필요하고 익숙한 UI를 제공하는 인쇄 대화 상자 컨트롤을 통해 노출됩니다. 이 간단한 인쇄 모델을 통해 대부분의 XPS 기능을 사용할 수 있습니다.

PrintDialog

System.Windows.Controls.PrintDialog 컨트롤에서는 UI, 구성 및 XPS 작업 전송에 대한 단일 진입점을 제공합니다. 이 컨트롤을 인스턴스화하고 사용하는 방법에 대한 자세한 내용은 방법: 인쇄 대화 상자 호출을 참조하십시오.

고급 XPS 인쇄

전체 XPS 기능 집합에 액세스하려면 고급 인쇄 API를 사용해야 합니다. 아래에서는 여러 관련 API에 대해 자세히 설명합니다. XPS 인쇄 경로 API의 전체 목록을 보려면 System.Windows.XpsSystem.Printing 네임스페이스 참조를 참조하십시오.

PrintTicket 및 PrintCapabilities

PrintTicketPrintCapabilities 클래스는 고급 XPS 기능의 기초입니다. 두 개체 형식은 정렬, 양면 인쇄, 스테이플 등과 같은 인쇄 지향 기술에 대한 XML 형식의 구조체입니다. 이 구조체는 Print Schema에서 정의됩니다. PrintTicket은 인쇄 작업을 처리하는 방법을 프린터에 알려 줍니다. PrintCapabilities 클래스는 프린터 기능을 정의합니다. PrintTicket에서는 프린터의 기능을 쿼리하여 프린터에서 지원하는 기능을 충분히 활용하도록 만들 수 있습니다. 마찬가지로 지원되지 않는 기능은 사용하지 않게 할 수 있습니다.

다음 예제에서는 프린터의 PrintCapabilities를 쿼리하고 코드를 사용하여 PrintTicket을 만드는 방법을 보여 줍니다.

// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
///   Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
///   A PrintTicket for the current local default printer.</returns>
private PrintTicket GetPrintTicketFromPrinter()
{
    PrintQueue printQueue = null;

    LocalPrintServer localPrintServer = new LocalPrintServer();

    // Retrieving collection of local printer on user machine
    PrintQueueCollection localPrinterCollection =
        localPrintServer.GetPrintQueues();

    System.Collections.IEnumerator localPrinterEnumerator =
        localPrinterCollection.GetEnumerator();

    if (localPrinterEnumerator.MoveNext())
    {
        // Get PrintQueue from first available printer
        printQueue = (PrintQueue)localPrinterEnumerator.Current;
    }
    else
    {
        // No printer exist, return null PrintTicket
        return null;
    }

    // Get default PrintTicket from printer
    PrintTicket printTicket = printQueue.DefaultPrintTicket;

    PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();

    // Modify PrintTicket
    if (printCapabilites.CollationCapability.Contains(Collation.Collated))
    {
        printTicket.Collation = Collation.Collated;
    }

    if ( printCapabilites.DuplexingCapability.Contains(
            Duplexing.TwoSidedLongEdge) )
    {
        printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
    }

    if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
    {
        printTicket.Stapling = Stapling.StapleDualLeft;
    }

    return printTicket;
}// end:GetPrintTicketFromPrinter()

전체 예제를 보려면 XPS 문서 만들기 샘플을 참조하십시오.

PrintServer 및 PrintQueue

PrintServer 클래스는 네트워크 인쇄 서버를 나타내고 PrintQueue 클래스는 이 서버에 연결된 프린터 및 출력 작업 큐를 나타냅니다. 이 두 클래스를 함께 사용하여 이 API에서 서버의 인쇄 작업에 대한 고급 관리를 수행할 수 있습니다. PrintServer 클래스나 해당하는 파생 클래스 중 하나를 사용하여 PrintQueue를 관리할 수 있습니다. AddJob 메서드를 사용하면 큐에 새 인쇄 작업을 삽입할 수 있습니다.

다음 예제에서는 LocalPrintServer를 만들고 코드를 사용하여 해당하는 기본 PrintQueue에 액세스하는 방법을 보여 줍니다.

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()

전체 예제를 보려면 XPS 문서 인쇄를 참조하십시오.

XpsDocumentWriter

XpsDocumentWriter는 해당하는 WriteWriteAsync 메서드와 함께 XPS 문서를 PrintQueue에 쓰는 데 사용됩니다. 예를 들어 Write(FixedPage, PrintTicket) 메서드를 사용하면 XPS 문서 및 PrintTicket을 동기적으로 출력할 수 있습니다. WriteAsync(FixedDocument, PrintTicket) 메서드를 사용하면 XPS 문서 및 PrintTicket을 비동기적으로 출력할 수 있습니다.

다음 예제에서는 코드를 사용하여 XpsDocumentWriter를 만드는 방법을 보여 줍니다.

// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
///   Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
///   An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
    // Create a local print server
    LocalPrintServer ps = new LocalPrintServer();

    // Get the default print queue
    PrintQueue pq = ps.DefaultPrintQueue;

    // Get an XpsDocumentWriter for the default print queue
    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
    return xpsdw;
}// end:GetPrintXpsDocumentWriter()

전체 예제를 보려면 XPS 문서 인쇄를 참조하십시오.

AddJob 메서드에서는 인쇄하는 방법도 제공합니다. 자세한 내용은 방법: 프로그래밍 방식으로 XPS 파일 인쇄를 참조하십시오.

GDI 인쇄 경로

WPF 응용 프로그램에서는 XPS 인쇄 경로를 기본적으로 지원하지만 Win32 및 Windows Forms 응용 프로그램에서도 일부 XPS 기능을 사용할 수 있습니다. XPSDrv(XPS 프린터 드라이버)에서는 GDI 기반 출력을 XPS 형식으로 변환할 수 있습니다. 고급 시나리오의 경우 Microsoft XPS 문서 변환기 프린터 이스케이프를 사용하여 콘텐츠의 사용자 지정 변환이 지원됩니다. 마찬가지로 WPF 응용 프로그램에서는 XpsDocumentWriter 클래스의 Write 또는 WriteAsync 메서드 중 하나를 호출하고 비 XpsDrv 프린터를 대상 인쇄 큐로 지정하여 GDI 인쇄 경로로 출력할 수도 있습니다.

XPS 기능 또는 지원이 필요하지 않은 응용 프로그램의 경우 현재의 GDI 인쇄 경로가 그대로 유지됩니다.

XPSDrv 드라이버 모델

XPS 인쇄 경로에서는 XPS 사용 프린터나 드라이버로 인쇄할 때 XPS를 기본 인쇄 스풀 형식으로 사용하여 스풀러 효율을 향상시킵니다. 스풀링 프로세스가 간단하여 문서가 스풀링되기 전에 EMF 데이터 파일과 같은 중간 스풀 파일을 생성할 필요가 없습니다. 스풀 파일 크기가 작으므로 XPS 인쇄 경로에서 네트워크 트래픽을 줄이고 인쇄 성능을 향상시킬 수 있습니다.

EMF는 응용 프로그램 출력을 렌더링 서비스에 대한 일련의 GDI 출력으로 표시하는 닫힌 형식입니다. EMF와 달리 XPS 스풀 형식은 XPSDrv(XPS 기반 프린터 드라이버)로 출력할 때 추가 해석 없이도 실제 문서를 표시합니다. 이 형식에서는 드라이버가 데이터에 대해 직접 작동할 수 있습니다. 이 기능을 사용하면 EMF 파일 및 GDI 기반 인쇄 드라이버를 사용할 때 데이터 및 색 공간 변환이 필요하지 않습니다.

일반적으로 XPSDrv(XPS 프린터 드라이버)를 대상으로 하는 XPS 문서를 사용하면 해당하는 EMF를 사용할 경우에 비해 스풀 파일 크기가 줄어들지만 다음과 같은 예외도 있습니다.

  • 아주 복잡하거나 다중 계층이거나 비효율적으로 적성된 벡터 그래픽은 동일한 그래픽의 비트맵 버전보다 더 클 수 있습니다.

  • 화면 표시용의 XPS 파일은 컴퓨터 기반 글꼴뿐 아니라 장치 글꼴을 포함하는 반면 GDI 스풀 파일은 장치 글꼴을 포함하지 않습니다. 그러나 두 종류의 글꼴은 모두 하위 집합으로 지정되어 있으며(아래 참조) 파일을 프린터로 전송하기 전에 프린터 드라이버에서 장치 글꼴을 제거할 수 있습니다.

스풀 크기 줄이기는 다음과 같은 여러 메커니즘을 통해 수행됩니다.

  • 글꼴 하위 설정. 실제 문서에서 사용된 문자만 XPS 파일에 저장됩니다.

  • 고급 그래픽 지원. 투명도 및 그라데이션 기본 형식에 대한 기본 지원을 통해 XPS 문서에서 콘텐츠의 래스터화를 방지합니다.

  • 공용 리소스 식별. 회사 로그를 나타내는 이미지와 같이 여러 번 사용되는 리소스를 공유 리소스로 처리하고 한 번만 로드합니다.

  • ZIP 압축. 모든 XPS 문서에서 ZIP 압축을 사용합니다.

참고 항목

작업

XPS 문서 인쇄

개념

Windows Presentation Foundation의 문서

문서 serialization 및 저장소

참조

PrintDialog

XpsDocumentWriter

XpsDocument

PrintTicket

PrintCapabilities

PrintServer

PrintQueue

MXDC_ESCAPE

기타 리소스

인쇄 방법 항목

Print Schema

XPS

Printing and Print Spooler