2010-03-18 4 views
4

문서를 인쇄하려고합니다. 이 문서는 NSImageReps의 배열이거나 여러 페이지가있는 단일 NSPDFImageRep입니다. NSPrintOperation 클래스를 사용하여이를 인쇄하는 방법을 알아내는 데 문제가 있습니다.NSDocument 인쇄

NSPrintOperation은 NSView를 인쇄해야하는 것 같습니다. 계산 된 위치의 뷰에 각 이미지를 수동으로 추가 한 다음 페이지 매기기를 수행해야합니까? 그게 코코아의 정신이 아닌 것 같아요. 제가 놓친 몇 가지 기술이 있습니까?

+0

나는이에 대한 새로운 솔루션을 게시했습니다. – Grimxn

답변

0

나중에 참조 할 수있는 대답은 PDFViews입니다. PDF 문서 (PDFDocument를 통해)에 PDFPage를 한꺼번에 추가 한 다음 printWithInfo로 인쇄 할 수 있습니다. autoRotate :

이론적으로 볼 때 최소한 뷰를 생성하고 인쇄 대화 상자가 표시되지만 "인쇄"를 누르면 대화 상자가 사라지지 않습니다 ...

하지만 다른 질문입니다.

1

그릴 수없는 것을 인쇄 할 수 없습니다. NSView는 인쇄하려는 것을 그리는 방법입니다. NSView의 페이지 매김 (pagination) 메소드를 사용하여 인쇄 방법을 결정하는 인쇄용 NSView 서브 클래스를 만들 수 있습니다 (예 : 페이지에 대해 NSImageRep을 원하십니까? ANY 크기 페이지를 원하십니까?). YES를 리턴하려면 knowsPageRange:을 대체하십시오.

+0

물론, 그릴 수없는 것을 인쇄 할 수는 없습니다. 그러나 여러 개의 imageReps를 다루려면이 작업을 지루하게 수행해야합니다. 거대한 가상보기에 이미지를 수동으로 배치 한 다음 각 사각형을 수동으로 배치하는 것보다 더 우아한 방법이 있습니까? 불필요하게 바로크적인 것처럼 보입니다 ... 또한, knowsPageRange :의 점이 무엇인지는 분명하지 않습니다. 페이지 범위를 아는 것은 무엇을 의미합니까? –

+0

이미지를 자동으로 배치하는 NSImageViews를 사용할 수 있지만 어떻게 든 문서를 그리는 방법을 지정해야합니다. 그리고'knowsPageRange :'는 인쇄 서브 시스템에게 당신이 페이지 매김을 처리하길 원한다는 것을 알려줍니다. – Chuck

1

인쇄 할 내용을 표시하는보기를 만들 수 있습니다. 그런 다음이를 사용하여 인쇄 작업을 만듭니다.

일반적으로 이미지를 표시하는보기가 만들어집니다. 어떤 이미지를 어떤 페이지에 표시할지 결정하는 알고리즘을 구현합니다. 그런 다음 인쇄 할 수있는 페이지 수를 반환하고 특정 페이지를 인쇄하는 방법을 구현합니다.

  • 이미지가 10 개인 경우 페이지를 쉽게 인쇄 할 수 있습니다.
  • 당신은 페이지 당 기록을 인쇄 할 경우 당신은 당신이 페이지에 적합 (현재 글꼴 크기와 레코드 당 라인 수를 사용) 할 수있는 레코드 수를 계산 (100 개) 기록을 가지고있다.
  • 그러면 페이지의 레코드 수 모든 레코드를 표시하는 데 필요한 페이지 수 - 이것은 페이지 수 (페이지 범위)입니다.
  • 특정 페이지 범위를 인쇄하도록 요청하면 해당 페이지에 표시되어야하는 레코드를 선택하고 표시하십시오.
  • 에서 이러한 단계를 수행하는 방법에 대한 아래 참조를 참조하십시오. 예제의 경우 the custom pagination 정보를 참조하십시오.이 단계를 구현하는 방법은 어렵지 않습니다.

Print Programming Topics을 참조하거나 여기에 포함되지 않은 페이지 매김이있는 책의 전체 예 I 참고 문헌을 참조하십시오. 더 많은 힌트를 얻으려면 the custom pagination을보십시오.

당신은 당신이 다음에, 프린터로 덤프 할 문서 기반 응용 프로그램과 전망을 가지고 있다면 우리의 MyDocument (또는 무엇이든 당신이 그것을 호출) 그건 당신이 구현하는 것이 NSDocument 확장 : 다음

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps 
              error:(NSError **)e 

뷰를 사용 표준 도면은 drawRect:입니다.

예, 여기 PeopleView 단지 사람들이 정보의 table, 그것은 여기 사람들 employeesNSDictonary합니다립니다

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps 
              error:(NSError **)e 
{ 
    PeopleView * view = [[PeopleView alloc] initWithPeople:employees]; 
    NSPrintInfo * printInfo = [self printInfo]; 
    NSPrintOperation * printOp 
     = [NSPrintOperation printOperationWithView:view 
             printInfo:printInfo]; 
    [view release]; 
    return printOp; 
} 

당신은 장 27 자세한 내용은 볼 수에 대해서는 Hillegass '코코아 프로그래밍에 인쇄, Mac OS X.

+0

문제는 사용자 지정 페이지 매김을하고 싶지 않다는 것입니다. 페이지 당 하나의 이미지 만 있으므로 각 이미지를 지정된 위치의 뷰에 수동으로 배치하고 그 이미지를 처리하지 않아도됩니다. 나는 PDFView가 내가하고 싶은 것을 훨씬 쉽게한다고 생각한다 ... –

1

이 답변에도 불구하고 실제로 기본적인 질문에 답하지 않고 해결 방법을 제공합니다.

방금 ​​비슷한 문제가 있습니다. 객체 당 배열이 각 페이지 당 하나의 NSView 하위 클래스로 렌더링되었습니다. 여기에 내가

1) 우리는 귀하의 경우에는 그와 관련된 모델 (NSImage이있는 NSView 서브 클래스, ModelData이 ... 모든 페이지를 보유하고 커다란 뷰를 생성하는 바로크 말도하지 않고, 그것을 해결 방법은 내 case)

class BaseView: NSView { 
    var modelData: ModelData /* Whatever your view needs to draw */ 
    //... 
} 

2) 우리는 문서 컨트롤러에 var models: [ModelData]이라는 배열을 가지고 있습니다.

3) 프린터보기가 될 새 하위 클래스를 만듭니다.

class PrinterView: BaseView { 
    var pageIndex: Int = 1 
    var modelArray: [ModelData] 

    init(frame: NSRect, models: [ModelData]) { 
     self.modelArray = models 
     super.init(frame: frame) 
    } 

    required init?(coder: NSCoder) { 
     fatalError("invalid initializer") 
    } 

    override func knowsPageRange(_ range: NSRangePointer) -> Bool { 
     range.pointee.location = 1 
     range.pointee.length = self.modelArray.count 
     return true 
    } 

    override func rectForPage(_ page: Int) -> NSRect { 
     self.pageIndex = page 
     return self.bounds 
    } 

    override func draw(_ dirtyRect: NSRect) { 
     self.model = self.modelArray[self.page - 1] // Pages are 1, not 0, based 
     super.draw(dirtyRect) 
    } 
} // That's it! That's all... 

4) 문서 컨트롤러에서이 작업을 수행합니다 :

override func printOperation(withSettings printSettings: [String : Any]) throws -> NSPrintOperation { 
    self.printInfo.horizontalPagination = .fitPagination 
    self.printInfo.verticalPagination = .clipPagination 
    let printView = PrinterView(size: self.printInfo.paperSize, models: self.models) 

    return NSPrintOperation(view: printView, printInfo: self.printInfo) 
} 
+1

이것은 훌륭한 쉬운 해결책이다, 고마워! 이니셜 라이저로 파트를 편집 했으므로,'init'에 대한 신속한 규칙을 따르고 컴파일러를 달래주는 것이 필요합니다. 커스텀 초기화 프로그램은'super'를 호출해야하고, 커스텀 초기화 프로그램을 가지고 있기 때문에 필요한 초기화 프로그램 인'init (coder :)'를 오버 라이딩해야합니다. – charles