无法使用 Cocoa/Swift/Quartz 绘制到新的 PDF 中

Unable to draw into a new PDF with Cocoa/Swift/Quartz

我正在尝试使用 Swift 创建一个简单的命令行应用程序,它将创建一个新的 PDF,在其中绘图,并将 PDF 保存到磁盘。以下是我的代码的基本版本:

// main.swift
import Cocoa

let fileName = "test.pdf"

func getPath() -> NSURL? {
    let fileManager = NSFileManager.defaultManager()
    do {
        let dir = try fileManager.URLForDirectory(
          NSSearchPathDirectory.DocumentDirectory,
          inDomain: NSSearchPathDomainMask.UserDomainMask,
          appropriateForURL: nil,
          create: false
        )
        return dir.URLByAppendingPathComponent(fileName)
    } catch {
        return nil
    }
}

let context = CGPDFContextCreateWithURL(getPath(), nil, nil)
CGPDFContextBeginPage(context, nil)

let path = NSBezierPath(rect: NSRect(x: 0, y: 0, width: 100, height: 100))
NSColor.greenColor().set()
path.fill()

CGPDFContextEndPage(context)
CGPDFContextClose(context)

当 运行 此代码按预期在我的 ~/Documents 目录中创建一个新的 test.pdf 文件时,它只是一个空白的 8.5x11 页面。任何绘图代码都因以下错误而失败:<Error>: CGContextSetFillColorWithColor: invalid context 0x0.

我能找到的用于创建和绘制成 PDF 的代码示例都很旧。他们当然不是 Swift 而且他们也倾向于使用 Quartz C API,所以我现在感觉有点迷茫。

感谢阅读。

你在这里混合了两个世界。 CoreGraphics 和 high-level Cocoa 绘图调用。要使 Cocoa 绘图工作,您需要创建一个基于 CoreGraphics 的 NSGraphicsContext 并使其成为当前上下文:

let graphicsContext = NSGraphicsContext(CGContext: context!, flipped:true)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.setCurrentContext(graphicsContext)