首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印NSDocument

打印NSDocument
EN

Stack Overflow用户
提问于 2010-03-19 03:47:05
回答 4查看 2.6K关注 0票数 4

我正在试着打印一份文件。文档是一个NSImageReps数组或单个NSPDFImageRep,它有多个页面。我在弄清楚如何使用NSPrintOperation类来打印这个代码时遇到了麻烦。

NSPrintOperation似乎需要一个NSView才能打印出来。我是否需要手动将每个图像添加到视图中的计算位置,然后让它进行分页?这看起来不符合可可的精神。有没有我遗漏的技巧?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-19 05:53:56

对于未来的参考,我相信答案是PDFViews。您可以将PDFPage一次性添加到PDFView中(通过PDFDocument),然后可以使用printWithInfo:autoRotate进行打印:

至少在理论上,我已经创建了视图,打印对话框出现了,但当我点击“打印”时,对话框并没有消失……

但这是一个不同的问题。

票数 0
EN

Stack Overflow用户

发布于 2017-04-13 22:36:15

尽管有一个公认的答案,但它并没有真正回答基本问题,只是提供了一个变通方法。

我刚刚遇到了一个类似的问题(我有一个对象数组,每个对象都由相同的NSView子类呈现,每个页面一个)。这是我如何解决它的,没有巴洛克式的胡说八道,创建一个容纳所有页面的巨大视图...

1)我们有一个NSView子类,它有一个与之关联的模型(在您的例子中是NSImage,在我的例子中是ModelData )

代码语言:javascript
复制
class BaseView: NSView {
    var modelData: ModelData /* Whatever your view needs to draw */
    //...
}

2)我们在文档控制器中有一个数组var models: [ModelData]

3)创建一个新的子类,它将成为打印机视图。

代码语言:javascript
复制
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)在您的文档控制器中执行此操作:

代码语言:javascript
复制
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)
}
票数 3
EN

Stack Overflow用户

发布于 2010-03-19 04:00:33

你不能打印不能绘制的东西。NSView是您绘制要打印的内容的方式。您可以创建一个仅用于打印的NSView子类,它决定您希望打印如何工作(例如,您是否需要一个NSImageRep用于页面-任何大小的页面?)通过使用NSView的分页方法。只需重写knowsPageRange:返回YES即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2472889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档