2010-07-07 4 views
4

여러 페이지에 WPF 캔버스를 인쇄하려고합니다.WPF DocumentPaginator 및 DocumentPage 예기치 않은 자르기

저는 페이지 너비에 맞추기 위해 크기를 조정 한 다음 각 페이지에 대해 캔버스를 자르고 번역하는 것에 만족합니다. 모든 아주 간단한 수학.

내가 이해할 수없는 것은 인쇄 영역의 크기와 인쇄 위치를 프린터에 알려주는 방법입니다. 내가 시도하는 것은 무엇이든간에 내가 사용하고있는 값은 용지의 크기이며, 따라서 프린터가 용지의 가장자리로 인쇄를 할 수 없으므로 자르기가 발생합니다.

capabilities.PageImageableArea.ExtentWidth 
// "Gets the width of the imageable area" 

은 "이미지 가능"영역은 무엇인가 :

var capabilities = printDialog.GetPrintCapabilities(dialog.PrintTicket); 

기능에는 다음과 같은 속성이 있습니다? 내가 콘텐츠를 넣을 수있는 종이 영역입니까? 나는 그렇게 생각한다 :

capabilities.PageImageableArea.OriginWidth 
// Gets the distance from the left edge of the page to the imageable area. 

하지만 아래 및 오른쪽 여백은 어떻게됩니까? 이 정보는 어디에서 찾을 수 있습니까?

DocumentPaginatorPageSize 속성은 어떻게 설정해야합니까? 내가 이것을 capabilities.PageImageableArea에서 설정해야합니까? 아니면 dialog.Print() 함수가 이것을 설정합니까? GetPage()에서 읽어야합니다.

마지막으로 DocumentPage을 반환하면 pageSize, bleedBoxcontentBox 세 개의 기하학적 인수로 무엇을 전달합니까?

답변

4

좋아요. 인쇄는 항상 (0, 0) (왼쪽 상단)에서 발생합니다.

이와 용지의 크기 가져 오기 :

printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight 

과 함께 위쪽 및 왼쪽 여백 :

var printCapabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket); 
printCapabilities.PageImageableArea.OriginWidth, printCapabilities.PageImageableArea.OriginHeight 

을 나는 하단 및 오른쪽 여백은 위쪽 및 왼쪽과 동일하다 가정 , 이것은 안전하지 않을 수도 있습니다.

평소와 같이 캔버스를 확장 및 클립 한 다음 여백 크기를 TranslateTransform 적용하여 인쇄 가능 영역으로 이동해야합니다.

1

:

덕분에 당신은 FlowDocument를 사용하는 대신에 단지 캔버스 인쇄 봤어? Here을 만들고 인쇄하는 좋은 예가 있습니다.

많은 수학을 필요로하지 않기를 바랍니다.

+0

캔버스에서 flowdocument를 얻는 방법은 무엇입니까? –

+0

캔버스를 인쇄하고 데이터를 바인딩 할 FlowDocument를 만드는 것을 잊어 버리십시오. 기본적으로 FlowDocument에서 캔버스에있는 것을 다시 만듭니다. – Blounty