XPS 래스터화 서비스 사용
Important
최신 인쇄 플랫폼은 Windows에서 프린터와 통신하는 데 선호되는 수단입니다. 프린터 장치 개발을 위해 Windows 10 및 11의 인쇄 환경을 사용자 지정하려면 MICROSOFT의 IPP 받은 편지함 클래스 드라이버와 PSA(인쇄 지원 앱)를 사용하는 것이 좋습니다.
자세한 내용은 최신 인쇄 플랫폼 및 인쇄 지원 앱 디자인 가이드를 참조하세요.
XPS 래스터화 서비스는 XPS 문서의 고정 페이지를 비트맵으로 변환하는 XPS 래스터라이저 개체를 구현합니다. 이 서비스는 XPS 문서를 일련의 비트맵 이미지로 렌더링하는 XPSDrv 필터의 디자인을 간소화합니다. 필터는 XPS 래스터라이저 개체에 고정 페이지에 축 맞춤 사각형 영역의 비트맵 이미지를 만들도록 지시할 수 있습니다.
예를 들어 프린터에 대한 XPSDrv 필터를 사용하려면 고정 페이지를 일련의 가로 또는 세로 대역으로 프린터로 보내야 할 수 있습니다. 이 경우 필터는 XPS 래스터라이저 개체에 각 밴드를 별도의 비트맵으로 래스터화하도록 지시합니다. 또는 프린터에 충분한 메모리가 있는 경우 필터가 래스터라이저에 전체 페이지의 비트맵 이미지를 만들도록 지시할 수 있습니다.
XPS 래스터화 서비스는 시스템 파일 Xpsrasterservice.dll 구현됩니다. 그러나 XPSDrv 필터는 이 DLL의 진입점에 직접 액세스하지 않습니다. 대신 필터는 필터가 인쇄 필터 파이프라인 관리자로부터 받는 인쇄 파이프라인 속성 모음을 통해 XPS 래스터화 서비스의 인터페이스에 액세스합니다.
XPSDrv 필터에서 사용할 수 있도록 하려면 인쇄 필터 파이프라인의 필터를 설명하는 필터 파이프라인 구성 파일에서 XPS 래스터화 서비스를 지정해야 합니다. 특히 구성 파일에는 다음 XML 예제와 같이 dll 특성이 서비스 DLL 이름으로 설정된 FilterServiceProvider 요소가 포함되어야 합니다.
<FilterServiceProvider dll = "XpsRasterService.dll" />
FilterServiceProvider 요소는 파이프라인의 필터를 나열하는 Filters 요소의 자식입니다. 파이프라인 초기화 중에 인쇄 필터 파이프라인 관리자는 XPS 래스터화 서비스를 로드하고 속성 모음을 통해 필터에 액세스할 수 있도록 합니다. XPS 래스터화 서비스를 로드하는 필터 파이프라인 구성 파일의 예제는 WDK의 XpsRasFilter 샘플을 참조하세요. 이 샘플은 WDK 설치의 Src\Print\Xpsrasfilter 폴더에 있습니다.
XPS 래스터화 팩터리 가져오기
XPS 문서를 래스터화하기 전에 XPSDrv 필터는 인쇄 파이프라인 속성 모음에서 래스터화 팩터리 개체에 대한 참조를 검색해야 합니다. 그 후 필터는 팩터리에서 렌더링해야 하는 고정된 각 페이지에 대한 새 XPS 래스터라이저 개체를 가져옵니다.
XPSDrv 필터를 초기화하기 위해 인쇄 필터 파이프라인 관리자는 필터의 IPrintPipelineFilter::InitializeFilter 메서드를 호출하고 속성 모음의 IPrintPipelinePropertyBag 인터페이스를 입력 매개 변수로 메서드에 전달합니다.
XPS 래스터화 팩터리 개체에 대한 포인터를 가져오기 위해 XPSDrv 필터는 IPrintPipelinePropertyBag::GetProperty 메서드를 호출합니다. 속성 이름 "MS_IXpsRasterizationFactory"은 래스터화 팩터리 개체를 식별합니다. 이 속성의 경우 GetProperty에서 가져온 값은 래스터화 팩터리 개체의 IUnknown 인터페이스에 대한 참조입니다. 이 인터페이스를 가져온 후 필터는 IUnknown::QueryInterface 메서드를 호출하여 개체의 IXpsRasterizationFactory 인터페이스에 대한 참조를 가져와야 합니다. 이후에 필터는 IXpsRasterizationFactory::CreateRasterizer 메서드를 호출하여 XPS 래스터라이저 개체를 만들 수 있습니다.
팩터리 개체가 더 이상 필요하지 않은 경우 필터는 개체의 IXpsRasterizationFactory 인터페이스에서 Release 메서드를 호출하여 개체를 해제해야 합니다.
다음 코드 예제에서는 IPrintPipelinePropertyBag 인터페이스 인스턴스에서 IXpsRasterizationFactory 인터페이스 인스턴스를 가져오는 방법을 보여 줍니다.
//
// Retrieve a reference to the XPS rasterization factory
// from the print pipeline property bag.
//
HRESULT CreateRasterizationFactory(
IPrintPipelinePropertyBag *pPropertyBag,
IXpsRasterizationFactory **ppXPSRasFactory)
{
if (ppXPSRasFactory != NULL)
{
*ppXPSRasFactory = NULL;
}
if (pPropertyBag == NULL || ppXPSRasFactory == NULL)
{
return E_POINTER;
}
HRESULT hr;
VARIANT var;
IXpsRasterizationFactory *pXPSRasFactory;
//
// Retrieve the factory object from the property bag.
//
VariantInit(&var);
hr = pPropertyBag->GetProperty(L"MS_IXpsRasterizationFactory",
&var);
if (SUCCEEDED(hr))
{
assert(var.vt == VT_UNKNOWN && var.punkVal != NULL);
//
// Get the factory object's IXpsRasterizationFactory interface.
//
IUnknown *pUnknown = var.punkVal;
hr = pUnknown->QueryInterface(__uuidof(IXpsRasterizationFactory),
reinterpret_cast<void**>(&pXPSRasFactory));
}
if (SUCCEEDED(hr))
{
//
// Give the caller our reference to the IXpsRasterizationFactory interface.
//
*ppXPSRasFactory = pXPSRasFactory;
}
VariantClear(&var);
return hr;
}
고정 페이지의 XPS 개체 모델 만들기
XPS 래스터화 팩터리를 만든 후 XPSDrv 필터는 팩터리를 사용하여 XPS 래스터라이저 개체를 만들 수 있습니다. XPS 래스터라이저 개체에는 IXpsRasterizer 인터페이스가 있습니다. 각 XPS 래스터라이저 개체는 XPS 문서의 특정 고정 페이지 전용입니다. XPS 래스터라이저 개체를 만들려면 팩터리에 고정 페이지의 XPS OM(개체 모델)이 필요합니다. XPS OM(고정 페이지)은 IXpsOMPage 인터페이스가 있는 개체에 포함되어 있습니다. XPS 래스터라이저 개체는 이 인터페이스를 사용하여 고정된 페이지의 내용에 액세스합니다. IXpsOMPage 인터페이스에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.
XPSDrv 필터는 다음 단계에 따라 XPS 래스터라이저 개체를 만듭니다.
필터는 입력 스트림에서 IFixedPage 인터페이스가 있는 고정 페이지 개체를 읽습니다.
필터는 IXpsOMPage 인터페이스를 사용하여 XPS OM 개체를 만들어 고정 페이지의 내용을 저장합니다. XPS 래스터라이저는 나중에 이 인터페이스를 사용하여 고정된 페이지의 내용에 액세스합니다.
XPS 래스터라이저 개체를 만들기 위해 필터는 XPS OM 개체의 IXpsOMPage 인터페이스를 XPS 래스터화 팩터리의 IXpsRasterizationFactory::CreateRasterizer 메서드에 전달합니다.
XPS 래스터라이저 개체가 더 이상 필요하지 않은 경우 필터는 개체의 IXpsRasterizer 인터페이스에서 Release 메서드를 호출하여 개체를 해제해야 합니다. XPS 래스터화 서비스를 사용하는 XPSDrv 필터의 예제 구현은 WDK의 XpsRasFilter 샘플 드라이버를 참조하세요.
XPS 래스터화 서비스에서 사용하기 위해 고정 페이지 내의 캔버스 및 시각적 브러시를 최대 64개 수준까지 중첩할 수 있습니다. 캔버스 및 시각적 브러시에 대한 자세한 내용은 XML 용지 사양을 다운로드하세요.
비트맵 해상도 및 픽셀 형식
고정 페이지에 대한 XPS 래스터라이저 개체는 페이지가 렌더링되는 해상도를 알고 있어야 합니다. XPSDrv 필터는 XPS 래스터라이저 개체를 만드는 IXpsRasterizationFactory::CreateRasterizer 호출의 입력 매개 변수로 이 해상도를 DPI(인치당 도트 단위)로 지정합니다. 예를 들어 디스플레이 디바이스의 해상도가 600DPI이고 고정 페이지에서 표준 문자 크기 페이지를 설명하는 경우 전체 페이지의 비트맵 이미지에는 다음과 같은 크기가 있습니다.
width = (8.5 인치)x(600 DPI) = 5100 점
height = (11 인치)x(600 DPI) = 6600 점
고정 페이지의 사각형 영역의 비트맵 이미지를 만들기 위해 XPSDrv 필터는 XPS 래스터라이저 개체의 IXpsRasterizer::RasterizeRect 메서드를 호출합니다. 이 메서드는 항상 픽셀 크기가 32비트인 비트맵을 생성합니다. 픽셀 형식은 헤더 파일 Wincodec.h에 정의된 GUID 값 GUID_WICPixelFormat32bppPBGRA 의해 지정됩니다. 이 형식은 8비트 빨간색, 녹색 및 파란색 구성 요소를 포함하며 표준(sRGB) 색 공간을 사용합니다. 또한 형식에는 8비트 알파 구성 요소가 포함됩니다. 각 픽셀 값의 색 구성 요소는 알파 구성 요소에 의해 미리 곱합니다. 이 형식에 대한 자세한 내용은 네이티브 픽셀 형식 개요를 참조 하세요.
일부 XPSDrv 필터는 XPS 래스터라이저 개체에 의해 생성된 비트맵의 추가 처리를 수행할 수 있습니다. 예를 들어 컬러 프린터의 필터는 비트맵을 프린터의 페이지 설명 언어로 래핑하고 프린터로 보내기 전에 비트맵을 CMYK 픽셀 형식으로 변환할 수 있습니다.
XPS 래스터화 서비스가 XPSDrv 필터와 통신하는 데 사용하는 인터페이스에 대한 자세한 내용은 xpsrassvc.h 헤더 DDI 참조를 참조하세요.
XPSRas 및 높은 정밀도 픽셀 형식
Windows 8에서 XPS 래스터화 서비스는 IXpsRasterizationFactory의 새 버전인 새 인터페이스 IXpsRasterizationFactory1을 노출합니다. IXpsRasterizationFactory1은 출력 픽셀 형식에 대해 하나의 새 매개 변수를 사용한다는 점을 제외하고 Windows 7 버전(IXpsRasterizationFactory::CreateRasterizer)과 동일한 새 메서드 IXpsRasterizationFactory1::CreateRasterizer를 노출합니다.
이 기능은 호출자가 IXpsRasterizer::RasterizeRect 메서드에서 반환되는 IWICBitmap 인터페이스에서 사용하는 픽셀 형식을 선택할 수 있도록 하는 새 열거형 XPSRAS_PIXEL_FORMAT 노출합니다.
XPSRas 및 GPU
WDDM 1.2 디스플레이 드라이버가 있는 Windows 8을 실행하는 컴퓨터가 있고 XPSRas GPU 사용 의사 결정 트리에 표시된 모든 조건이 충족된 경우 GPU 하드웨어 가속이 항상 사용됩니다. 즉, 개발자는 GPU에서 제공하는 성능 향상을 활용하기 위해 어떤 단계도 수행할 필요가 없습니다. 그러나 시스템의 그래픽 성능을 추가로 최적화하려면 다음을 수행해야 합니다.
일관된 사각형 차원을 사용하여 RasterizeRect 메서드를 호출합니다. 가능하지 않은 경우 첫 번째 호출에서 가장 큰 필수 사각형 크기를 RasterizeRect에 제공하고 후속 호출 시 더 작은 사각형 크기를 요청하는 것이 가장 좋습니다.
반드시 필요한 경우에만 앤티앨리어싱을 사용합니다. 별칭이 지정된 텍스트 및 벡터는 IXpsRasterizationFactory::CreateRasterizer 메서드에 제공된 DPI 값이 상당히 높을 때 해당 앤티앨리어싱된 해당 항목과 동일하게 보입니다. 예를 들어 200DPI보다 큰 DPI 값은 높은 것으로 간주됩니다. 높은 DPI와 함께 별칭이 지정된 텍스트 및 벡터를 사용할 때 지정된 디바이스의 출력 품질이 충분한지 확인하기 위해 테스트를 수행해야 합니다.
IXpsOMPage를 래스터화하기 전에 문서를 조작할 수 있는 경우 글꼴을 하위 설정하고 여러 페이지에서 반복되는 요소에 대한 리소스 사전을 사용하면 XPSRas 성능이 향상됩니다.