다음을 통해 공유


인쇄 작업 렌더링

중요

인쇄 지원 앱(PSA)과 함께 Microsoft의 IPP 받은 편지함 클래스 드라이버를 사용하여 프린터 장치 개발을 위해 Windows 10 및 11의 인쇄 환경을 사용자 지정하는 것이 좋습니다.

자세한 내용은 인쇄 지원 앱 디자인 가이드를 참조하세요.

인쇄 작업은 생성될 때 렌더링되거나 EMF 레코드로 스풀 파일에 기록됩니다. EMF 레코드의 경우 렌더링은 EMF 인쇄 프로세서 (localspl.dll)가 레코드를 재생할 때 발생합니다. 렌더링은 CreateDC부터 사용자 모드 GDI 그리기 함수에 대한 일련의 호출로 구성됩니다. CreateDC 호출은 그래픽 렌더링 엔진(GRE, 커널 모드 GDI라고도 함) 및 프린터 그래픽 DLL과 관련된 작업 체인으로 이어지는 일련의 애플리케이션 호출 중 첫 번째 호출입니다.

다음 그림에서는 CreateDC 가 호출된 후 커널 모드 GDI와 프린터 그래픽 DLL 간의 상호 작용을 보여 줍니다.

createdc가 호출된 후 커널 모드 gdi와 프린터 그래픽 dll 간의 상호 작용을 보여 주는 다이어그램

  1. 애플리케이션이 CreateDC 함수를 호출하여 프린터 디바이스 컨텍스트를 만들 때 GDI는 적절한 프린터 그래픽 DLL이 로드되었는지 확인합니다. 그렇지 않은 경우 GDI는 DLL을 로드하고 DLL에서 DrvEnableDriver 함수를 호출합니다. 드라이버가 다시 로드되지 않으면 함수가 다시 호출되지 않습니다.

  2. 다음으로, GDI는 프린터 그래픽 DLL의 DrvEnablePDEV 함수를 호출하여 드라이버가 물리적 디바이스 instance 만들고 디바이스 특성을 반환할 수 있도록 합니다. GDI는 반환된 정보를 사용하여 디바이스 instance 대한 내부 설명을 만듭니다.

  3. 그런 다음 GDI는 그래픽 DLL의 DrvCompletePDEV 함수를 호출하여 디바이스 instance GDI 핸들을 제공합니다. 그래픽 DLL은 GDI 그리기 엔진에서 제공하는 일부 Eng 접두사 콜백에 대한 입력으로 이 핸들을 사용해야 합니다( GDI 지원 서비스 참조).

  4. GDI는 디바이스 instance 핸들을 수신한 후 그래픽 DLL의 DrvEnableSurface 함수를 호출하여 그리기 위해 표면을 설정하고 물리적 디바이스 instance 연결합니다.

  5. 드라이버는 EngCreateBitmap을 호출하여 디바이스 instance 대한 그리기 표면을 만들 수 있습니다. 또는 그리기 표면이 디바이스 관리형인 경우 드라이버는 EngCreateDeviceSurface를 호출할 수 있습니다.

  6. EngCreateBitmap이 전체 물리적 페이지를 포함할 수 있을 만큼 큰 비트맵을 제공할 수 없고 드라이버가 페이지 줄무늬를 지원하는 경우 EngMarkBandingSurface를 호출하여 GDI에 줄무늬가 사용됨을 알릴 수 있습니다.

  7. 마지막으로, GDI가 생성된 표면을 지정된 디바이스 instance 연결하고 GDI가 이 특정 표면에 그릴 때 호출해야 하는 드라이버 제공 그래픽 DDI 그리기 함수(있는 경우)를 알 수 있도록 EngAssociateSurface를 호출해야 합니다.

이 시점에서 그리기 표면이 만들어지고 렌더링이 시작될 수 있습니다. GDI가 호출하는 함수는 밴딩이 적용되는지 여부에 따라 달라집니다.

사용 중인 밴딩

줄무늬를 사용할 때 렌더링할 각 문서에 대해 GDI는 프린터 그래픽 DLL에서 다음 함수를 호출합니다.

DrvStartDoc

각 실제 페이지에 대해

DrvStartPage

DrvStartBanding

실제 페이지의 각 밴딩 패스에 대해

DrvQueryPerBandInfo

렌더링 작업

DrvNextBand // 이 밴드에 대한 래스터 데이터를 보낸 다음 표면을 지우고 다음 밴드와 함께 다시 사용

DrvEndDoc

사용 중이 아닌 밴딩

줄무늬를 사용하지 않을 때 렌더링할 각 문서에 대해 GDI는 프린터 그래픽 DLL에서 다음 함수를 호출합니다.

DrvStartDoc

각 실제 페이지에 대해

DrvStartPage

렌더링 작업

DrvSendPage // 페이지에 대한 래스터 데이터 보내기

DrvEndDoc

DrvQueryPerBandInfo를 제외하고 이러한 함수는 프린터 그래픽 DLL이 EngWritePrinter를 호출하여 프린터 하드웨어에 제어 시퀀스를 보내고 문서, 페이지 또는 대역의 처리를 초기화하거나 완료하는 데 필요한 내부 작업을 수행할 수 있도록 하기 위한 것입니다.

프린터 그래픽 DLL은 다음과 같이 렌더링된 이미지(즉, 드로잉 표면의 내용)를 적절한 시간에 프린터로 보내는 작업을 담당합니다( EngWritePrinter 호출).

  • GDI 관리 또는 디바이스 관리 비트맵 표면의 경우

    그리기 표면은 GDI 제공 비트맵 또는 드라이버 제공 비트맵입니다. 프린터 그래픽 DLL은 일부 그리기 기능을 후크할 수 있습니다( Surface 협상 참조). 페이지 밴딩을 사용하는 경우 DrvNextBand 함수는 그리기 표면 콘텐츠를 보내야 합니다. 밴딩을 사용하지 않는 경우 DrvSendPage 함수는 그리기 표면 콘텐츠를 보내야 합니다.

  • 디바이스 관리 벡터 표면의 경우

    드로잉 표면은 디바이스 내에 있습니다. 프린터 그래픽 DLL은 모든 그리기 함수( Surface 협상 참조)를 후크하고 이러한 함수는 렌더링 작업 중에 이미지 데이터를 프린터로 보냅니다. 페이지 밴딩은 사용되지 않습니다.

프린터 그래픽 DLL에서 제공하는 그래픽 DDI 함수를 실행하는 데 5초 이상 걸릴 수 있다고 예상하는 경우 인쇄 작업을 종료해야 하는지 확인하기 위해 적어도 5초마다 EngCheckAbort 를 호출하는 코드를 포함해야 합니다.

GDI가 DrvEndDoc 를 호출하여 문서가 완전히 렌더링되었음을 나타내면 DrvDisableSurface를 호출합니다. DrvEnableSurfaceEngCreateBitmap이라고 하는 경우 DrvDisableSurfaceEngDeleteSurface를 호출해야 합니다.

GDI는 애플리케이션이 DeleteDC를 호출할 때 프린터 그래픽 DLL의 DrvDisablePDEV 함수를 호출합니다.

문서를 인쇄하는 동안 애플리케이션이 ResetDC 함수를 호출하는 경우 GDI는 새 디바이스 컨텍스트를 만들고 새 컨텍스트에 대해 프린터 그래픽 DLL의 DrvEnablePDEV 함수를 호출합니다. 그런 다음 GDI는 DrvResetPDEV 함수를 호출하므로 그래픽 DLL은 이전 컨텍스트의 정보로 새 컨텍스트를 업데이트할 수 있습니다. 다음으로, 이전 컨텍스트에 대해 DrvDisableSurfaceDrvDisablePDEV 가 호출되고 새 컨텍스트에 대해 DrvEnableSurface 가 호출됩니다. 마지막으로 GDI는 DrvStartDoc를 호출하고 렌더링 다시 시작을 새 페이지에서 호출합니다.

GDI는 프린터 그래픽 DLL을 언로드하기 전에 DrvDisableDriver 를 호출합니다.

프린터 하드웨어가 GDI 그리기 함수에서 지원되지 않는 그리기 작업을 지원하는 경우 프린터 그래픽 DLL은 DrvDrawEscape 함수를 제공할 수 있습니다.

프린터 그래픽 DLL은 GDI 함수를 통해 사용할 수 없는 그리기 또는 그리기되지 않는 작업을 지원해야 하는 경우 DrvEscape 함수를 제공할 수 있습니다. 예를 들어 Microsoft PostScript 프린터 드라이버는 이스케이프를 사용하여 PostScript 삽입 지점을 지원합니다. 또는 애플리케이션에서 팩스 컴퓨터의 전화 번호를 가져와야 할 수도 있습니다. DrvEscape 함수는 DrvDrawEscape 함수에서 지원하는 작업을 나타내는 데도 사용됩니다.