NSView의 내용을 PDF로 만들기 (Swift)

뷰로부터 pdf 데이터 얻기

AppKit의 모든 그리기 명령은 PDF로 변환가능하다. 그리고 이렇게 변환된 PDF 데이터는 프린터로 보내지거나 파일에 기록될 수 있다. PDF는 해상도에 의존하지 않기 때문에 어느 기기에서 봐도 제법 괜찮은 품질을 보여준다는 점을 잊지 말자.

draw:를 사용해서 뷰를 그리는 것을 할 수 있다면, PDF는 공짜로 얻을 수 있다. 이 방법은 매우 쉬운데 NSView는 다음과 같은 메소드를 가지고 있다.

  • func dataWithPDF(inside: NSRect) -> Data

이 메소드는 draw(:)를 호출해서 이를 통해 그래픽 데이터를 얻는다. 뷰 그리기 명령에서 얻어지는 모든 내역은 화면이 아닌 데이터 객체로 들어간다. 이렇게 얻은 내용은 간단히 파일에 저장할 수 있다.

@IBAction func savePDF(_ sender: Any) {
    let panel = NSSavePanel()
    panel.allowedFileTypes = ["pdf"]
    panel.allowsOtherFileTypes = false
    panel.beginSheetModal(for: window!) { clicked in
        if clicked == NSFileHandleingPanelOKButton, let url = panel.url {
            let data = self.dataWithPDF(inside: self.bounds)
            do {
                try data.write(to:url)
            } catch {
                let a = NSAlert(error: error as! NSError)
                a.runModal()
            }
        }
    }
}