我正在试着打印一份文件。文档是一个NSImageReps数组或单个NSPDFImageRep,它有多个页面。我在弄清楚如何使用NSPrintOperation类来打印这个代码时遇到了麻烦。
NSPrintOperation似乎需要一个NSView才能打印出来。我是否需要手动将每个图像添加到视图中的计算位置,然后让它进行分页?这看起来不符合可可的精神。有没有我遗漏的技巧?
发布于 2010-03-19 05:53:56
对于未来的参考,我相信答案是PDFViews。您可以将PDFPage一次性添加到PDFView中(通过PDFDocument),然后可以使用printWithInfo:autoRotate进行打印:
至少在理论上,我已经创建了视图,打印对话框出现了,但当我点击“打印”时,对话框并没有消失……
但这是一个不同的问题。
发布于 2017-04-13 22:36:15
尽管有一个公认的答案,但它并没有真正回答基本问题,只是提供了一个变通方法。
我刚刚遇到了一个类似的问题(我有一个对象数组,每个对象都由相同的NSView子类呈现,每个页面一个)。这是我如何解决它的,没有巴洛克式的胡说八道,创建一个容纳所有页面的巨大视图...
1)我们有一个NSView子类,它有一个与之关联的模型(在您的例子中是NSImage,在我的例子中是ModelData )
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)
}发布于 2010-03-19 04:00:33
你不能打印不能绘制的东西。NSView是您绘制要打印的内容的方式。您可以创建一个仅用于打印的NSView子类,它决定您希望打印如何工作(例如,您是否需要一个NSImageRep用于页面-任何大小的页面?)通过使用NSView的分页方法。只需重写knowsPageRange:返回YES即可。
https://stackoverflow.com/questions/2472889
复制相似问题