我正在尝试使用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,所以我觉得此时有点迷失。
感谢阅读。
答案 0 :(得分:1)
你在这里混合了两个世界。 CoreGraphics和高级Cocoa绘图调用。要使Cocoa绘图工作,您需要创建一个基于CoreGraphics的NSGraphicsContext并使其成为当前上下文:
let graphicsContext = NSGraphicsContext(CGContext: context!, flipped:true)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.setCurrentContext(graphicsContext)