4

ドキュメントを印刷しようとしています。ドキュメントは、NSImageRepsの配列、または複数のページを持つ単一のNSPDFImageRepです。NSPrintOperationクラスを使用してこれを印刷する方法を理解するのに問題があります。

NSPrintOperationは、印刷するためにNSViewを必要としているようです。計算された位置で各画像を手動でビューに追加してから、ページネーションを実行させる必要がありますか?それはココアの精神ではないようです...私が見逃しているテクニックはありますか?

4

4 に答える 4

3

これには受け入れられた答えがありますが、基本的な質問には実際には答えず、回避策を提供するだけです。

NSView同様の問題が発生しました(ページごとに1つずつ、同じサブクラスによってレンダリングされたオブジェクトの配列があります)。すべてのページを保持する1つの巨大なビューを作成するというバロック的なナンセンスなしで、私がそれを解決した方法は次のとおりです...

1)NSViewモデルが関連付けられているサブクラスがあります(NSImageあなたの場合、ModelData私の場合)

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

var models: [ModelData]2)ドキュメントコントローラーに配列があります。

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)
}
于 2017-04-13T14:36:14.557 に答える
1

描けないものは印刷できません。NSViewは、印刷したいものを描画する方法です。NSViewのページ付けメソッドを使用して、印刷の動作を決定する印刷専用のNSViewサブクラスを作成できます(たとえば、ページに1つのNSImageRepが必要ですか?任意のサイズのページですか?)。オーバーライドknowsPageRange:してYESを返します。

于 2010-03-18T20:00:33.343 に答える
1

印刷したいものを表示するビューを作成できます。次に、それを使用して印刷操作を作成します。

通常、画像を表示するビューを作成します。どのページにどの画像を表示するかを判断するアルゴリズムを実装します。次に、印刷可能なページ数を返し、特定のページを印刷するメソッドを実装します。

  • 10枚の画像があり、1ページに1枚印刷したい場合は簡単です。
  • ページごとにレコードを印刷する必要があり、100レコードがある場合は、ページに収まるレコード数を計算します(現在のフォントサイズとレコードあたりの行数を使用)。
  • 次に、ページあたりのレコードから、すべてのレコードを表示するために必要なページ数を計算します。これは、ページ数(ページの範囲)です。
  • 特定の範囲のページを印刷するように要求されたら、特定のページに表示するレコードを選択して表示します。
  • これらの手順を実装する方法については、以下のリファレンスを参照してください。これらの手順を実装する方法については、カスタムページネーション情報を参照してください。難しいことではありません。

印刷プログラミングのトピックを参照してください。または、この本から以下で参照する完全な例には、ここには含まれていなかったページ付けがあります。その他のヒントについては、カスタムページ付けをご覧ください。

ドキュメントベースのアプリケーションとプリンターにダンプしたいビューがある場合はMyDocument、拡張する私たち(またはあなたがそれを呼ぶもの)に以下NSDocumentを実装します:

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

次に、ビューは標準drawRect:を使用して描画します。

たとえば、ここでは人の詳細をPeopleView描画します。ここでは人の数が必要です。tableNSDictonaryemployees

- (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;
}

詳細については、HillegassのMacOSX用Cocoaプログラミングの第27章「印刷」を参照してください。

于 2010-03-18T23:38:06.657 に答える
0

将来の参考のために、答えはPDFViewsだと思います。PDFPageを一度にPDFViewに(PDFDocumentを介して)追加してから、printWithInfo:autoRotate:を使用して印刷できます。

少なくとも理論的には、ビューが作成され、印刷ダイアログが表示されますが、[印刷]をクリックしてもダイアログは消えません...

しかし、それは別の質問です。

于 2010-03-18T21:53:55.937 に答える