代码之家  ›  专栏  ›  技术社区  ›  Brian Postow

打印nsdocument

  •  4
  • Brian Postow  · 技术社区  · 15 年前

    我想打印一份文件。文档是一个nsImageRep数组,或一个具有多个页面的nsPDImageRep。我不知道如何使用nsprintooperation类来打印这个。

    nsprint操作似乎需要一个nsview来打印。是否需要手动将每个图像添加到视图中的计算位置,然后让它进行分页?这似乎不符合可可的精神…有什么技巧我遗漏了吗?

    4 回复  |  直到 8 年前
        1
  •  2
  •   Grimxn    8 年前

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

    我遇到了一个类似的问题(我有一个对象数组,每个对象都由相同的 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)
    }
    
        2
  •  1
  •   Chuck    15 年前

    你不能打印不能画的东西。nsview是如何绘制要打印的内容的。您可以创建一个仅用于打印的nsview子类,该子类决定打印的工作方式(例如,对于任何大小的页面,是否需要一个nsimagerep?)使用nsview的分页方法。只是覆盖 knowsPageRange: 返回“是”。

        3
  •  1
  •   stefanB    15 年前

    可以创建显示要打印内容的视图。然后使用它创建打印操作。

    通常会创建一个显示图像的视图。您可以实现一个算法来确定要在哪个页面上显示什么图像。然后返回可打印的页数,并实现打印特定页的方法。

    • 如果你有10张照片 每页打印一张很简单。
    • 如果要每页打印记录 你有100张唱片 计算你能记录多少 适合页面大小(使用当前字体 每条记录的行数和大小)。
    • 然后你从记录中找出 你需要多少页 显示所有记录-这是您的 页数(页数范围)。
    • 当要求打印特定 选择记录的页面范围 应该显示在给定的页面上 展示它们。
    • 关于如何 执行这些步骤。见 the custom pagination 信息为 例如如何实现这些步骤,并不困难。

    Print Programming Topics ,或者我从书中引用的完整示例下面有页码,我没有在这里包括。看一看 the custom pagination 更多提示。

    如果有基于文档的应用程序和要转储到打印机的视图,则在 MyDocument (或你所说的)延伸的 NSDocument 你将实施:

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

    然后视图使用标准 drawRect: 用于绘图。

    例如,这里 PeopleView 只画一个 table 关于人的细节 NSDictonary 人的 employees 在这里:

    - (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'Cocoa Programming for Mac OS X的第27章“打印”中查找更多详细信息。

        4
  •  0
  •   Brian Postow    15 年前

    为了以后的参考,我相信答案是pdfviews。您可以将pdfpage一次全部添加到pdfview(通过pdfdocument),然后可以使用printwithinfo:autorotate进行打印:

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

    但这是另一个问题。