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

时间:2016-01-20 16:33:25

标签: swift cocoa pdf quartz-graphics

我正在尝试使用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)

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

我可以找到用于创建和绘制PDF的代码示例都很旧。他们肯定不是Swift,他们也倾向于使用Quartz C API,所以我觉得此时有点迷失。

感谢阅读。

1 个答案:

答案 0 :(得分:1)

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

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