问题是
dataWithPDF
使用视图的当前帧来决定生成的PDF的宽度。自从你
WebView
你的应用程序中的框架可能比8.5/11英寸的页面更薄,你得到的PDF不够宽
调整
将框架的大小调整到合适的大小,制作PDF,然后将其调整回来,或者您可以创建一个新的框架
网络视图
,将其渲染到屏幕外,将其设置为适当的大小,然后创建PDF。不过,这背后有点痛。如果有一种方法可以通过编程实现打印对话框中“PDF”按钮的功能,那岂不是太好了,因为打印系统会自动为您处理所有这些事情?
事实证明你可以!但你必须深入到核心打印的文档记录不足的世界。
func makePDF(at url: URL, for webView: WebView, printInfo: NSPrintInfo) throws {
webView.preferences.shouldPrintBackgrounds = true
guard let printOp = webView.mainFrame.frameView.printOperation(with: printInfo) else {
throw MyPrintError.couldntGetPrintOperation // or something like this
}
let session = PMPrintSession(printOp.printInfo.pmPrintSession())
let settings = PMPrintSettings(printOp.printInfo.pmPrintSettings())
if PMSessionSetDestination(session,
settings,
PMDestinationType(kPMDestinationFile),
kPMDocumentFormatPDF as CFString,
url as CFURL) != noErr {
throw MyPrintError.couldntSetDestination // or something like this
}
printOp.showsPrintPanel = false
printOp.run()
}
关键是
PMSessionSetDestination
调用,它允许我们将打印会话配置为打印到PDF而不是实际打印机。然后我们就说
NSPrintOperation