방법: 인쇄 스키마 확장 및 새 인쇄 시스템 클래스 만들기
업데이트: 2007년 11월
응용 프로그램에서 기존 PrintSystemObject, PrintQueue, PrintCapabilities 및 PrintTicket 클래스에 반영되지 않는 특성이 있는 특수 인쇄 장치를 처리해야 할 경우 상속을 통해 새 클래스를 파생시키고, 확장된 버전의 PrintCapabilities 및 PrintTicket 클래스를 만들고, Print Schema도 확장해야 할 수 있습니다. 이 문서에서는 이러한 프로젝트의 주요 부분을 다루지만 관리되는 관련 클래스를 확장하는 모든 방법을 설명하지는 않습니다.
이 문서와 더불어 Print Schema의 광범위한 설명서를 읽어 보는 것이 좋습니다. 이 문서에서는 사용자가 최소한 스키마, PrintTicket 문서 및 PrintCapabilities 문서가 무엇인지 기본적으로 이해하고 있다고 가정합니다.
이 문서의 단원은 다음과 같습니다.
상속을 통해 새 클래스 파생
장치의 기능이 인쇄 스키마에 이미 정의되어 있는지 여부 확인
장치 기능을 나타낼 형식 만들기
PrintCapabilities 및 PrintTicket 클래스 확장
PrintTicket 클래스 확장
PrintCapabilities 클래스 확장
PrintCapabilities/PrintTicket XML 스트림 읽기 및 쓰기
속성/메서드 오버로드 및 확장
스키마 정의 기능 확장
System.Printing.IndexedProperties 네임스페이스 확장
예제
이 문서에 제공된 예제 프로젝트에서는 응용 프로그램을 컴파일하고 실행하는 데 필요한 모든 정보를 제공하지 않습니다. 이러한 예제 프로젝트는 해당 네임스페이스에서 명시적으로 지원되지 않는 기능이 있는 인쇄 장치에 대한 System.Printing 및 System.Printing.IndexedProperties 네임스페이스의 기능을 확장하는 데 필요한 주요 단계만 간단하게 보여 줍니다. 코드 예제는 구체적인 정보가 필요할 경우에만 제공됩니다.
코드 예제는 프로그래밍 방식이나 코드 보안이 좋지 않을 수도 있으며, 문서의 주제와 직접적인 관계가 없는 사항은 생략됩니다.
마지막으로 이 문서는 장치 드라이버 개발자보다는 주로 응용 프로그램 개발자를 대상으로 합니다. 이에 따라 이 문서에서는 PrintCapabilities 개체보다는 PrintTicket 개체를 작성하는 데 주안점을 둡니다.
상속을 통해 새 클래스 파생
먼저 PrintQueue 클래스에서 장치를 나타낼 클래스를 파생시킵니다. 아래 코드 예제에서는 BrailleEmbosser 클래스가 파생됩니다. 브라유(Braille)는 손끝으로 느낄 수 있도록 기호가 종이 표면에서 돌출된 “점”으로 구성되어 시각 장애인들이 읽을 수 있는 언어입니다. 브라유 엠보서(Braille Embosser)는 브라유를 인쇄하는 프린터입니다. 브라유 엠보서용 드라이버 중 일부는 많은 단축 및 생략법을 사용하여 공간을 절약하는 브라유 버전인 Braille Grade 3(Braille 3)으로 일반 브라유를 변환할 수 있습니다. 예제에서는 이 기능을 나타내는 속성을 제공합니다.
상속된 속성 및 메서드 중 일부를 오버로드해야 하는 경우도 많습니다. 자세한 내용은 아래의 속성/메서드 오버로드 및 확장을 참조하십시오.
class BrailleEmbosser : PrintQueue
{
public BrailleEmbosser(PrintServer ps, String s, PrintSystemDesiredAccess access) : base(ps, s, access)
{
// Optionally, include here code to set non-inherited fields.
}
// other constructor declarations omitted
private Boolean isBraille3Enabled;
public Boolean IsBraile3Enabled
{
get { return isBraille3Enabled; }
set { isBraille3Enabled = value; }
}
// remainder of class definition omitted
}
장치의 기능이 인쇄 스키마에 이미 정의되어 있는지 여부 확인
PrintTicket 및 PrintCapabilities 클래스에는 가장 일반적인 인쇄 기능을 나타내는 속성이 있지만 Print Schema Public Keywords 사양에 이러한 클래스에 명시적으로 반영되지 않은 더 많은 기능이 정의되어 있습니다. 일반적인 기능 목록을 보려면 PrintCapabilities 클래스의 속성을 참조하십시오. 장치의 특수 기능이 정의되어 있는지 여부를 확인하려면 사양을 읽어 보아야 합니다. 사양에 포함된 기능의 경우 사양의 모델을 사용하는 것이 훨씬 더 좋습니다. 일반적인 모델 및 용어를 사용하면 한 장치에 대해 만들어진 PrintTicket XML 문서를 다른 장치에 사용할 수 있습니다. 두 번째 장치는 다른 제조업체의 제품일 수 있으며 PrintTicket 문서가 원래 만들어진 날짜 이후에 설계되었을 수 있습니다. 문서 자체에 인쇄 티켓을 포함하여 작성자의 인쇄 의도뿐만 아니라 서식 지정 의도도 다른 프린터를 보유하고 있는 사용자에게 문서가 배포될 때 함께 전달되도록 할 수 있습니다.
이 문서의 나머지 부분에서는 PrintTicket 및 PrintCapabilities 클래스에 의해 명시적으로 지원되는 기능을 "일반적인 기능"이라고 지칭합니다. 또한 Print Schema Public Keywords 사양에 정의되어 있지만 이러한 두 클래스에 의해 명시적으로 지원되지 않는 기능을 "정의된 기능"이라고 지칭하며 Public 키워드 사양에 정의되어 있지 않은 기능은 "새로운 기능"이라고 지칭합니다.
정의된 기능과 거의 일치하는 기능이 장치에 있지만 해당 기능에 Print Schema Public Keywords 사양에 없는 하나 이상의 추가 옵션이 있는 경우도 있습니다. 기존 정의를 최대한 활용할 수 있도록 Print Schema를 확장하여 이러한 기능을 처리할 수 있습니다. 이러한 기능을 사용하는 방법에 대한 자세한 내용은 아래의 스키마 정의 기능 확장을 참조하십시오.
장치 기능을 나타낼 형식 만들기
인쇄 기능에 해당하는 PrintTicket 및 PrintCapabilities 속성에는 특수 형식(일반적으로 기능 및 해당 기능에 사용 가능한 값을 나타내는 열거형)이 사용됩니다. 예를 들어 Collation 열거형은 PrintTicket.Collation 속성에 대한 형식입니다. 이 열거형은 PrintCapabilities.CollationCapability 속성 형식인 컬렉션의 멤버에 대한 형식이기도 합니다.
이러한 기존 클래스를 모델로 사용하여 장치의 정의된 기능 및 새로운 기능에 대한 클래스를 만듭니다. 아래 코드 샘플에서는 BrailleGrade3 열거형이 선언됩니다. 이 열거형은 Grade 3 변환이 한 부씩 인쇄와 유사하므로 Collation 열거형의 모델을 기반으로 생성됩니다. 모든 프린터는 서로 소모적인 관계에 있으므로 하나 이상의 출력 종류(한 부씩 인쇄 또는 한 부씩 인쇄 안 함)를 지원해야 합니다. 두 출력 종류를 모두 지원하는 프린터도 있습니다. 한 부씩 인쇄 출력만 지원하는 프린터는 거의 없지만 이러한 프린터가 있을 가능성도 고려해야 합니다. 변환되지 않은 브라유 출력만 지원하거나, 변환된 출력만 지원하거나(가능성이 낮지만 가능함), 둘 다 지원하는 엠보서도 있을 수 있습니다. Collation은 PrintTicket 문서를 생성하는 응용 프로그램이 한 부씩 인쇄 기능을 Print Schema Public Keywords 사양에 없는 값으로 설정할 경우 문제를 해결하기 위해 Unknown 값을 포함하며 BrailleGrade3 열거형도 같은 이유로 해당 값을 포함합니다. 응용 프로그램이 이러한 문서를 사용하여 PrintTicket 개체를 만들 경우 PrintTicket.Collation 속성에는 Unknown 값이 사용됩니다. PrintCapabilities 개체에는 Unknown 값이 사용되지 않습니다.
public enum BrailleGrade3 { Translated, Untranslated, Unknown }
기능을 나타낼 때 열거형보다. 참조 형식 클래스가 더 적합한 경우도 있습니다. 특히 기능에 각자 고유한 값을 포함하는 하위 수준 부분의 중첩 구조체가 있을 경우 그렇습니다. 예를 들어 PageMediaSize 클래스에는 Height 및 Width 속성이 있습니다. PageMediaSize는 PrintTicket.PageMediaSize 속성의 형식입니다. 이 클래스는 PrintCapabilities.PageMediaSizeCapability 속성 형식인 컬렉션의 멤버에 대한 형식이기도 합니다.
PrintCapabilities 및 PrintTicket 클래스 확장
PrintTicket 및 PrintCapabilities 클래스는 상속할 수 없지만 Print Schema를 확장하여 정의된 기능 및 새로운 기능이 인식되도록 만들 수 있습니다.
PrintTicket 클래스 확장
PrintTicket 클래스를 확장된 기능 시스템에서 사용하려면 다음 단계를 수행합니다. 자세한 내용은 다음을 참조하십시오.
PrintTicket 클래스 확장을 위한 고급 절차
장치에 새로운 기능이 있는 경우 해당 기능을 캡슐화하는 새 클래스를 만듭니다. 자세한 내용은 NewFeaturesPrintTicket 클래스 만들기를 참조하십시오.
장치에 정의된 기능이 있는 경우 해당 기능을 캡슐화하는 새 클래스를 만듭니다. 자세한 내용은 DefinedFeaturesPrintTicket 클래스 만들기를 참조하십시오.
전체 인쇄 티켓을 나타낼 클래스를 만듭니다. 이 클래스는 장치에 정의된 기능 또는 새로운 기능이 없을 경우 PrintTicket 클래스가 수행할 역할을 사용자 응용 프로그램에서 수행합니다. 자세한 내용은 WholePrintTicket 클래스 만들기를 참조하십시오.
NewFeaturesPrintTicket 클래스 만들기 절차
장치에 새로운 기능이 있는 경우 해당 기능을 캡슐화하는 클래스를 선언합니다. 이 클래스의 이름을 NewFeaturesPrintTicket으로 지정합니다.
새 클래스에 장치의 새로운 기능을 나타낼 속성을 지정합니다. 일반적으로 각 속성은 사용자가 만드는 형식(일반적으로 열거형)이 됩니다. 위의 장치 기능을 나타낼 형식 만들기를 참조하십시오.
새 클래스에 추가 속성을 지정합니다. 이 속성의 이름을 PrivateNamespace로 지정합니다. 이 속성에는 장치의 새로운 기능을 정의하는 전용 XML 네임스페이스에 대한 참조가 포함됩니다. PrintCapabilities 및 PrintTicket 문서에 XML 태그를 작성할 때 이 문자열이 필요합니다. 아래의 PrintCapabilities/PrintTicket XML 스트림 읽기 및 쓰기를 참조하십시오.
클래스에 두 개의 생성자를 지정합니다. 생성자는 PrintTicket의 두 생성자를 기반으로 해야 합니다. 한 생성자는 매개 변수를 사용하지 않고 다른 생성자는 XML 콘텐츠가 있는 Stream 개체를 사용합니다. XML 스트림은 일반적인 기능이 아니라 새로운 기능을 정의하는 PrintTicket 문서가 됩니다. Print Schema-Related Technologies 및 PrintTicket Schema and Document Construction을 참조하십시오. 매개 변수를 사용하는 생성자는 PrintTicket 클래스의 단일 매개 변수 생성자에 대한 패턴에서 예외를 throw합니다.
클래스에 대해 GetXmlStream 및 SaveTo 메서드를 만듭니다. 두 메서드 모두에 "internal"이라는 키워드를 사용합니다. 이는 해당 이름의 PrintTicket 메서드에 대한 기능을 일치시키기 위한 것입니다(일반적인 기능이 아니라 새로운 기능을 정의하는 PrintTicket 문서를 처리한다는 점만 다름). 이러한 메서드는 생성되는 스트림의 여는 <PrintTicket ¡¦ > 요소에 추가 네임스페이스(PrivateNamespace 속성의 값)를 선언해야 합니다. 아래의 PrintCapabilities/PrintTicket XML 스트림 읽기 및 쓰기를 참조하십시오.
DefinedFeaturesPrintTicket 클래스 만들기 절차
장치에 정의된 기능이 있는 경우 해당 기능을 캡슐화하는 클래스를 선언합니다. 이 클래스의 이름을 DefinedFeaturesPrintTicket으로 지정합니다. 이 클래스는 다음을 제외하고 위의 NewFeaturesPrintTicket과 동일한 방법으로 생성해야 합니다.
클래스 속성의 이름을 Print Schema Public Keywords 사양의 해당하는 기능 이름과 일치하게 지정해야 합니다.
PrivateNamespace 속성을 만들지 않습니다. 정의된 기능의 네임스페이스는 일반적인 기능의 네임스페이스와 동일합니다. 아래의 PrintCapabilities/PrintTicket XML 스트림 읽기 및 쓰기를 참조하십시오.
GetXmlStream 및 SaveTo 메서드가 추가 네임스페이스 선언을 포함하는 스트림을 생성하지 않습니다.
WholePrintTicket 클래스 만들기 절차
전체 인쇄 티켓을 나타내어, 장치에 정의된 기능 또는 새로운 기능이 없을 경우 PrintTicket 클래스가 수행할 역할을 사용자 응용 프로그램에서 수행할 클래스를 선언합니다. 이 클래스의 이름을 WholePrintTicket으로 지정합니다.
WholePrintTicket에 속성을 지정합니다. 이 속성의 이름을 PrintTicket 형식의 CommonFeatures로 지정합니다.
WholePrintTicket에 새로운 기능이 있는지, 정의된 기능이 있는지, 두 기능이 모두 있는지 여부에 따라 하나 이상의 다음 추가 속성을 지정합니다.
NewFeaturesPrintTicket 형식의 NewFeatures
DefinedFeaturesPrintTicket 형식의 DefinedFeatures
WholePrintTicket에 두 생성자를 지정합니다. 한 생성자는 매개 변수를 사용하지 않고 다른 생성자는 XML 콘텐츠가 있는 Stream 개체를 사용합니다. 매개 변수를 사용하는 생성자는 다음을 수행합니다.
CommonFeatures 속성에 의해 참조되는 PrintTicket 개체에 대한 생성자에 Stream을 전달합니다. 해당 생성자는 일반적인 기능과 관련되지 않은 Stream의 모든 태그를 무시합니다.
NewFeatures 속성에 의해 참조되는 NewFeaturesPrintTicket 개체에 대한 생성자에 Stream을 전달합니다. 해당 생성자는 새로운 기능과 관련되지 않은 Stream의 모든 태그를 무시합니다. 새로운 기능 태그가 있을 경우에는 Stream이 <psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1" xmlns:namespace-abbreviation=full-namespace-name>으로 시작됩니다. 여기서 full-namespace-name은 새로운 기능을 정의하는 스키마를 식별하는 데 사용되는 URL이고 namespace-abbreviation은 약식 URL입니다. 자세한 내용은 아래의 PrintCapabilities/PrintTicket XML 스트림 읽기 및 쓰기를 참조하십시오.
DefinedFeatures 속성에 의해 참조되는 DefinedFeaturesPrintTicket 개체에 대한 생성자에 Stream을 전달합니다. 해당 생성자는 정의된 기능과 관련되지 않은 Stream의 모든 태그를 무시합니다.
클래스에 대해 GetXmlStream 및 SaveTo 메서드를 만듭니다. 이는 해당 이름의 PrintTicket 메서드에 대한 기능을 일치시키기 위한 것입니다. 이러한 메서드의 특성은 다음과 같아야 합니다.
이러한 각 메서드는 CommonFeatures 속성, DefinedFeatures 속성(있는 경우) 및 NewFeatures 속성(있는 경우)에 의해 참조되는 개체에서 이름이 동일한 해당 메서드를 호출해야 합니다.
각 메서드는 이전 글머리 기호 내용에 설명된 호출로 인해 생성되는 스트림을 연결해야 합니다. 물론 마지막 </PrintTicket> 끝 태그와 첫 번째 <PrintTicket ¡¦ > 시작 태그를 제외한 모든 항목을 삭제해야 합니다. 새로운 기능이 없는 한 시작 태그에는 추가 네임스페이스 선언이 있어야 합니다. 4b단계를 참조하십시오. 해당 <PrintTicket ¢®¦ > 시작 태그에는 이미 해당 선언이 있을 것이므로 항상 새로운 기능 스트림(있는 경우)을 연결된 스트림의 첫 번째 항목으로 만들어야 합니다.
연결 작업을 수행하려면 WholePrintTicket의 GetXmlStream 및 SaveTo 메서드가 먼저 임시 스트림에서 내부적으로 작업을 수행해야 합니다. 구체적으로 이러한 메서드에는 각각 해당 콘텐츠를 임시 스트림으로 serialization하고 연결 작업 및 정리 작업(다음 글머리 기호 내용 참조)을 수행한 다음 연결 결과를 최종 출력 스트림으로 출력하는 세 가지 클래스가 있습니다.
연결 작업 후에 WholePrintTicket의 GetXmlStream 및 SaveTo 메서드는 최종 스트림을 반환하기 전에 스트림에서 요소의 2중 및 3중 복사본을 제거해야 합니다. 이러한 2중 및 3중 항목은 PrintTicket, NewFeaturesPrintTicket 및 DefinedFeaturesPrintTicket이라는 세 가지 개체 각각이 해당 속성에 문서의 하위 집합만 노출하더라도 해당 개체 생성에 사용된 문서 중 모든 원래 PrintTicket 문서를 유지하기 때문에 스트림에 포함됩니다.
WholePrintTicket(Stream) 생성자(위 참조)가 일반적인 태그 요소, 새로운 태그 요소 및 정의된 태그 요소에 대해 별도의 스트림을 만들어 들어오는 스트림을 세 부분으로 분할하는 경우에는 이전 글머리 기호 내용에 설명된 정리 단계를 수행하지 않을 수 있습니다. 분할될 경우 이러한 각각의 작은 스트림은 WholePrintTicket의 세 속성에 대한 적절한 생성자로 전달됩니다. 이 기술을 사용하려면 세 스트림 각각에 닫는 </PrintTicket> 태그를 추가해야 합니다. CommonFeatures 및 DefinedFeatures 속성의 스트림에는 <psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">과 같은 시작 태그를 추가합니다. NewFeatures 속성의 생성자에 대한 시작 태그는 여기에 <psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1" xmlns:namespace-abbreviation=full-namespace-name>과 같은 전용 네임스페이스를 추가합니다. 여기서 full-namespace-name은 새로운 기능을 정의하는 스키마를 식별하는 데 사용되는 URL이고 namespace-abbreviation은 약식 URL입니다.
다음 코드 샘플에서는 이 절차를 브라유 엠보서 예제에 적용한 결과의 일부분을 보여 줍니다. 공간을 절약하고 간단하게 만들기 위해 많은 부분을 생략했습니다. BrailleGrade3 속성의 형식은 Nullable<T>입니다. 이는 Collation과 같은 PrintTicket의 속성 패턴을 따릅니다. 이 예제에서는 정의된 특정 기능을 지정하지는 않지만 새로운 기능과 정의된 기능이 모두 있다고 가정합니다.
class NewFeaturesPrintTicket
{
public NewFeaturesPrintTicket()
{
// Optionally, initialize fields. For example:
privateNamespace = "http://www.AjaxEmbossers.com/schemas/deluxemodels/v.1.0";
}
public NewFeaturesPrintTicket(Stream printTicketDocument)
{
// Parse the stream and initialize fields representing features here.
// Optionally, initialize other fields. For example:
privateNamespace = "http://www.AjaxEmbossers.com/schemas/deluxemodels/v.1.0";
}
private Nullable<BrailleGrade3> brailleGrade3;
public Nullable<BrailleGrade3> BrailleGrade3
{
get { return brailleGrade3; }
set { brailleGrade3 = value;}
}
private String privateNamespace;
public String PrivateNamespace
{
get { return privateNamespace; }
set { privateNamespace = value; }
}
}
class DefinedFeaturesPrintTicket
{
// Details omitted. Use the NewFeaturesPrintTicket
// as a model, but leave out the privateNamespace field
// and property.
}
class WholePrintTicket
{
public WholePrintTicket()
{
commonFeatures = new PrintTicket();
newFeatures = new NewFeaturesPrintTicket();
definedFeatures = new DefinedFeaturesPrintTicket();
}
public WholePrintTicket(Stream wholePrintTicket)
{
// Method 1: Pass the stream to the three constructors.
// Be sure to reset the read-write position of the stream
// to the beginning of the stream after each call to a
// constructor.
// commonFeatures = new PrintTicket(wholePrintTicket);
// reset read-write head here
// newFeatures = new NewFeaturesPrintTicket(wholePrintTicket);
// reset read-write head here
// definedFeatures = new DefinedFeaturesPrintTicket(wholePrintTicket);
// reset read-write head here
// Method 2: Parse the stream and split it into three streams.
// Then pass them to the constructors of the three properties.
// commonFeatures = new PrintTicket(commonFeaturesPrintTicketDocument);
// newFeatures = new NewFeaturesPrintTicket(newFeaturesPrintTicketDocument);
// definedFeatures = new DefinedFeaturesPrintTicket(definedFeaturesPrintTicketDocument);
}
private PrintTicket commonFeatures;
public PrintTicket CommonFeatures
{
get { return commonFeatures; }
set { commonFeatures = value;}
}
private PrintTicket newFeatures;
public PrintTicket NewFeatures
{ // Details omitted. See CommonFeatures above.}
private PrintTicket definedFeatures;
public PrintTicket DefinedFeatures
{ // Details omitted. See CommonFeatures above.}
}
PrintCapabilities 클래스 확장
장치에 PrintCapabilities 클래스를 사용하려면 PrintTicket 클래스와 동일한 방법으로 해당 클래스를 확장해야 합니다. PrintTicket 확장 모델을 사용할 수 있으므로 여기서는 간략하게만 설명합니다.
새로운 기능을 캡슐화하는 클래스(NewFeaturesPrintCapabilities), 정의된 기능을 캡슐화하는 클래스(DefinedFeaturesPrintCapabilities), 전체 PrintCapabilities 문서를 나타낼 클래스(WholePrintCapabilities)라는 새 클래스 세 개를 만듭니다.
처음 두 가지 새 클래스의 속성 형식은 일반적으로 ReadOnlyCollection<T>이 됩니다. CollationCapability와 같은 PrintCapabilities의 기존 속성을 모델로 사용합니다.
기존 PrintCapabilities 클래스의 패턴도 따릅니다. 속성 이름의 끝에는 BrailleGrade3Capability와 같이 "Capability"가 와야 합니다.
NewFeaturesPrintCapabilities 클래스의 PrivateNamespace 속성은 NewFeaturesPrintTicket에 대해 만든 속성과 동일합니다.
이러한 클래스에는 Object 클래스에서 상속받은 메서드를 제외한 어떠한 메서드도 포함되지 않습니다.
각 클래스에는 Stream 매개 변수를 사용하는 단일 생성자가 포함됩니다. Stream은 PrintCapabilities 문서가 됩니다.
DefinedFeaturesPrintCapabilities 생성자는 Stream을 사용하여 속성을 초기화하기 전에 자체에 전달된 Stream이 Print Schema Framework에 부합하는지 확인해야 합니다. Stream을 먼저 PrintCapabilities 생성자에 전달하면 이를 쉽게 수행할 수 있습니다. 해당 생성자가 예외를 throw하지 않으면 스트림이 올바른 것입니다.
NewFeaturesPrintCapabilities 생성자는 Stream을 사용하여 속성을 초기화하기 전에 자체에 전달된 Stream이 전용 네임스페이스에 부합하는지 확인해야 합니다.
DefinedFeaturesPrintCapabilities 및 NewFeaturesPrintCapabilities 생성자 모두 기존 PrintCapabilities 생성자의 패턴에서 예외를 thorw합니다.
WholePrintCapabilities 클래스에는 CommonFeatures, DefinedFeatures 및 NewFeatures 속성이 포함됩니다. 이러한 속성의 형식은 각각 PrintCapabilities, DefinedFeaturesPrintCapabilities 및 NewFeaturesPrintCapabilties가 됩니다. 각 형식은 WholePrintTicket의 속성에 대한 패턴을 기반으로 생성됩니다.
WholePrintCapabilities 클래스에 대한 생성자에는 전체 PrintCapabilities 문서를 나타내는 단일 Stream 매개 변수가 사용됩니다. 이 생성자는 전체 입력 Stream을 해당 멤버 속성에 대한 모든 세 생성자에 전달해야 합니다. WholePrintCapabilities 클래스에는 WholePrintTicket의 GetXmlStream 및 SaveTo 메서드처럼 해당 설정을 XML 형식으로 내보내는 메서드가 없으므로 세 속성에 2중 및 3중 태그가 있어도 상관 없습니다.
자세한 내용은 PrintCapabilities Schema and Document Construction을 참조하십시오.
PrintCapabilities/PrintTicket XML 스트림 읽기 및 쓰기
기존 PrintTicket 및 PrintCapabilities 클래스와 위의 PrintCapabilities 및 PrintTicket 클래스 확장에서 만든 새 클래스의 생성자 및 메서드는 콘텐츠가 PrintTicket 문서 또는 PrintCapabilities 문서인 Stream 개체를 읽고, 구문 분석하고, 쓰며 해당 개체의 유효성을 검사하는 작업을 주로 수행합니다. 사용자는 기본 파일 I/O 메서드 및 해당 클래스의 메서드에 대해 잘 알아야 합니다. 이러한 스트림의 콘텐츠는 XML이므로 .NET Framework에서의 XML 처리 옵션에 설명된 XML 읽기 및 쓰기 지원에 대해서도 잘 알아야 합니다. 응용 프로그램에서 XPS(XML Paper Specification) 문서를 사용하는 경우에는 System.Windows.Xps, System.Windows.Xps.Packaging 및 System.Windows.Xps.Serialization 네임스페이스에 PrintTicket 읽기 및 쓰기를 비롯하여 XPS 문서에서 읽고 쓰기 위해 디자인된 API가 있습니다. 패키지에 PrintTicket에 대한 관계를 추가하는 방법에 대한 자세한 내용은 PackageRelationship도 참조하십시오.
PrintTicket 문서 및 PrintCapabilities 문서에 대한 전체 샘플은 PrintTicket Example 및 PrintCapabilities Document Example이 있습니다.
다음은 하나를 제외한 모든 장치 기능이 생략된 PrintCapabilities 문서에 대한 간단한 예제입니다. 표시된 기능은 PrintCapabilities.CollationCapability 및 PrintTicket.Collation 속성으로 나타나는 기능인 DocumentCollate입니다.
<psf:PrintCapabilities xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">
<!-- other features omitted -->
<psf:Feature name="psk:DocumentCollate">
<psf:Property name="psf:SelectionType">
<psf:Value xsi:type="xsd:QName">psk:PickOne</psf:Value>
</psf:Property>
<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">Collate Copies</psf:Value>
</psf:Property>
<psf:Option name="psk:Collated" constrained="psk:None">
<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">Yes</psf:Value>
</psf:Property>
</psf:Option>
<psf:Option name="psk:Uncollated" constrained="psk:None">
<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">No</psf:Value>
</psf:Property>
</psf:Option>
</psf:Feature>
<!-- other features omitted -->
</PrintCapabilities>
기능에 사용할 수 있는 모든 옵션(한 부씩 인쇄 및 한 부씩 인쇄 안 함)이 나열되어 있으며 각 옵션의 상태(제약을 받는지 여부)가 식별되어 있습니다. 전체 PrintCapabilities 문서에서는 각 기능 옵션의 상태가 식별되므로 문서가 장치 구성의 스냅숏과 같이 됩니다.
다음은 단일 기능만 있는 PrintTicket 문서에 대한 간단한 예제입니다.
<psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">
<!-- other features omitted -->
<psf:Feature name="psk:DocumentCollate">
<psf:Option name="psk:Collated" />
</psf:Feature>
<!-- other features omitted -->
</PrintTicket>
PrintTicket 문서에서는 각 옵션의 상태를 명시적으로 지정할 필요가 없으므로 구조가 보다 간단합니다. 이 문서에서는 요청된 옵션만 식별하면 됩니다.
기능의 구문 및 구조는 Print Schema Framework 및 Print Schema Public Keywords별로 DocumentCollate에 정의되어 있습니다. 새로운 기능을 사용할 때는 추가 스키마에 정의된 전용 XML 네임스페이스에 정의된 기능을 사용하게 됩니다. 일반적으로 이는 장치 제조업체, 관계 단체 또는 비영리 표준화 기구에서 제공하지만 사용자가 직접 만들 수도 있습니다. 기존 Print Schema Framework 및 Print Schema Public Keywords를 통해 필요한 구문을 배우고 정의의 기반으로 사용할 수 있는 모델을 찾습니다. Microsoft에서도 PrintCapabilities 및 PrintTicket 시스템을 새로운 Microsoft XPS Document Writer(MXDW) 드라이버로 확장하기 위해 새 네임스페이스를 만들었습니다. 자세한 내용은 MXDW Configuration Settings를 참조하십시오.
가상의 Ajax Embosser 회사가 Microsoft에서 문서 한 부씩 인쇄 기능을 정의한 방식과 동일하게 BrailleGrade3 변환 기능을 정의한 경우 기능에 대한 PrintCapabilities 및 PrintTicket 문서 입력이 어떻게 나타나는지 확인해 볼 수 있습니다. 기능이 정의된 네임스페이스는 <PrintCapabilities … > 및 <PrintTicket … > 시작 태그에 선언되어야 합니다.
PrintCapabilities 문서 태그
<psf:PrintCapabilities xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ajax="http://www.AjaxEmbossers.com/schemas/deluxemodels" version="1">
<!-- other features omitted -->
<psf:Feature name="ajax:BrailleGrade3Translation">
<psf:Property name="psf:SelectionType">
<psf:Value xsi:type="xsd:QName">psk:PickOne</psf:Value>
</psf:Property>
<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">Braille3 translation</psf:Value>
</psf:Property>
<psf:Option name="ajax:Translated" constrained="psk:None">
<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">Yes</psf:Value>
</psf:Property>
</psf:Option>
<psf:Option name="ajax:Untranslated" constrained="psk:None">
<psf:Property name="psk:DisplayName">
<psf:Value xsi:type="xsd:string">No</psf:Value>
</psf:Property>
</psf:Option>
</psf:Feature>
<!-- other features omitted -->
</PrintCapabilities>
PrintTicket 문서 태그
<psf:PrintTicket xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ajax="http://www.AjaxEmbossers.com/schemas/deluxemodels" version="1">
<!-- other features omitted -->
<psf:Feature name="ajax:BrailleGrade3Translation">
<psf:Option name="ajax:Translated" />
</psf:Feature>
<!-- other features omitted -->
</PrintTicket>
새로운 기능을 처리하는 PrintTicket 문서 작성에 대한 자세한 내용은 Creating a Device-Specific PrintTicket을 참조하십시오. PrintTicket 및 PrintCapabilities 문서 작성에 대한 광범위한 설명서는 인쇄 스키마 설명서의 PrintCapabilities Schema and Document Construction 및 PrintTicket Schema and Document Construction 단원을 참조하십시오.
속성/메서드 오버로드 및 확장
PrintTicket 매개 변수를 사용하거나 PrintTicket을 반환하며 확장된 기능 시스템에 사용하려는 모든 클래스의 메서드는 PrintTicket 대신 WholePrintTicket을 사용하는 메서드로 바꿔야 합니다. 마찬가지로 형식이 PrintTicket인 속성 중 사용하려는 속성을 형식이 WholePrintTicket인 속성으로 바꿔야 합니다. PrintCapabilities와 WholePrintCapabilities에 대해서도 필요한 사항을 수정하여 동일한 작업을 수행해야 합니다.
메서드 또는 속성을 호스팅하는 클래스를 상속할 수 있으면 클래스를 파생시키고 메서드 또는 속성을 오버로드하여 PrintTicket 대신 WholePrintTicket을 사용할 수 있습니다.
호스팅 클래스를 상속할 수 없으면 위에서 PrintTicket 및 PrintCapabilities를 확장한 방법대로 해당 클래스를 확장하고 호스팅 클래스가 멤버로 속한 클래스를 만들어야 합니다. 그런 다음 외부 클래스에 PrintTicket 또는 PrintCapabilities 매개 변수를 포함하거나 반환하는 해당 메서드와 이름이 같은 메서드 및 속성을 지정해야 합니다. 일반적으로 외부 클래스는 이름이 같은 내부 클래스의 기능과 일치해야 하지만 PrintTicket 또는 PrintCapabilities 매개 변수 대신 WholePrintTicket 또는 WholePrintCapabilities 매개 변수를 사용합니다. 또한 형식이 PrintTicket 또는 PrintCapabilities인 내부 클래스의 속성에 대해 외부 클래스에 이름이 같으며 WholePrintTicket 또는 WholePrintCapabilities를 사용하는 일치하는 속성을 만듭니다.
오버로드해야 하는 가장 중요한 메서드는 두 버전의 MergeAndValidatePrintTicket입니다. BrailleEmbosser 클래스(위의 상속을 통해 새 클래스 파생 참조)는 WholePrintTicket 매개 변수를 사용하며 새로운 기능의 티켓을 전용 네임스페이스의 스키마에 대해 유효성을 검사하기 위한 논리를 추가하는 클래스로 바꿔야 합니다. 기존 메서드를 오버로드하거나 MergeAndValidateWholePrintTicket이라는 새 메서드를 만들 수 있습니다.
PrintTicket을 반환하는 두 메서드는 ConvertDevModeToPrintTicket 및 Clone입니다. .NET Framework에는 오버로드를 제외하고 PrintTicket 매개 변수를 사용하는 15개의 또 다른 메서드가 있으며 형식이 PrintTicket인 19개의 속성이 있습니다. 그러나 응용 프로그램에서 일정 수 이상의 메서드 또는 속성을 사용하는 경우는 거의 없으므로 이러한 많은 메서드 또는 속성으로 인해 사용자 작업이 가중되지는 않습니다. 다행히도 PrintCapabilities 개체를 반환하는 유일한 메서드는 GetPrintCapabilities이며 형식이 PrintCapabilities인 속성은 없습니다.
스키마 정의 기능 확장
완전히 새로운 기능이 있는 경우에만 Print Schema를 확장해야 하는 것은 아닙니다. 정의된 친숙한 기능에 대해 정의되지 않은 새로운 옵션을 장치에서 제공할 수 있습니다. 완전히 새로운 기능과 마찬가지로 정의되지 않은 새로운 옵션에도 전용 네임스페이스를 사용해야 하므로 이러한 확장된 기능을 완전히 새로운 기능과 같이 처리하는 것이 쉽습니다(기능의 스키마 정의 이름 및 이미 정의된 해당 옵션의 스키마 정의 이름 사용). 이러한 기능은 NewFeaturesPrintTicket 및 NewFeaturesPrintCapabilities에 저장합니다. 이러한 종류의 스키마를 구현하는 데 필요한 모든 정보는 이 문서의 범위를 벗어나지만 WholePrintTicket.GetXmlStream 및 WholePrintTicket.SaveAs 메서드로 수행해야 하는 연결 작업은 보다 복잡해진다는 점에 유의하십시오.
System.Printing.IndexedProperties 네임스페이스 확장
System.Printing.IndexedProperties 네임스페이스에서 API를 활용하려면 PrintProperty에서 새 클래스를 파생시켜야 할 수 있습니다. PrintQueue에서 파생시킨 클래스에 대해 만든 속성의 형식이 System.Printing.IndexedProperties의 어떤 기존 클래스로도 표현되지 않는 경우 이 작업을 수행할 수 있습니다. System.Printing.IndexedProperties 네임스페이스를 사용하여 수행할 수 있는 작업의 예는 방법: 프린터 복제 및 방법: 리플렉션을 사용하지 않고 인쇄 시스템 개체 속성 가져오기를 참조하십시오.
BrailleEmbosser 클래스에 추가한 속성은 Boolean인 IsBraile3Enabled뿐이므로 위 예제에 대해서는 이 작업이 필요하지 않습니다. 이미 System.Printing.IndexedProperties.PrintBooleanProperty 클래스가 있습니다.
참고 항목
작업
방법: 리플렉션을 사용하지 않고 인쇄 시스템 개체 속성 가져오기
개념
Windows Presentation Foundation의 문서
참조
System.Printing.IndexedProperties
System.Windows.Xps.Serialization