/ / Impossible d'insérer un nouveau fichier PDF avec Cocoa / Swift / Quartz - swift, cacao, pdf, quartz-graphics

Impossible d'insérer un nouveau fichier PDF avec Cocoa / Swift / Quartz - swift, cacao, pdf, quartz-graphics

J'essaie de créer une application simple en ligne de commande avec Swift, qui créera un nouveau PDF, y dessinera et en enregistrera le PDF sur disque. Vous trouverez ci-dessous une version complète de mon code:

// 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)

En exécutant ce code, il crée un nouveau test.pdf déposer dans mon ~/Documents répertoire, comme prévu, mais il s’agit juste d’une page vierge de 8,5 x 11 po. Tout code de dessin échoue avec l’erreur suivante: <Error>: CGContextSetFillColorWithColor: invalid context 0x0.

Les exemples de code permettant de créer et d’insérer dans un PDF que je peux trouver sont tous très anciens. Ils ne sont certainement pas Swift et ils ont aussi tendance à utiliser les API Quartz C, ce qui me laisse un peu perdu.

Merci d'avoir lu.

Réponses:

1 pour la réponse № 1

Vous mélangez deux mondes ici. CoreGraphics et appels de dessin Cocoa de haut niveau. Pour que le dessin Cocoa fonctionne, vous devez créer un NSGraphicsContext basé sur celui de CoreGraphics et en faire le contexte actuel:

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