objective-c - WKWebView 的打印内容 (OS X)

标签 objective-c macos cocoa webkit wkwebview

我正在尝试打印 WkWebView 的内容,但是当打印面板出现时,打印预览是空的。

代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    _webView = [[WKWebView alloc] initWithFrame:self.webViewOutlet.frame configuration:config];
    [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com"]]];
    [_webViewOutlet addSubview:_webView];
    _webView.navigationDelegate = self;

}

我有一个 WKWebView 导出,所以我可以查看它是否已加载,我将 print 调用放入 didFinishNavigation 委托(delegate)中这样的方法只是为了确定:

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    [self.webView print:nil];
}

无论做什么页面,打印预览总是空白页。我还尝试使用 NSPrintOperation,结果是一样的——打印预览和保存的 PDF 都是空白页。

知道我做错了什么吗?还有另一种方法可以将 WKWebView 打印/转换为 PDF 吗?欢迎提出建议。谢谢。

最佳答案

我使用的解决方案是实例化一个很好的旧 WebView 对象,并使用该对象的打印方法。我的示例使用 html 字符串作为起点,但它应该很容易适应 URL。

Objective-C

@interface WebPrinter ()
{
    WebView *printView;
    NSPrintInfo *printInfo;
}

@implementation WebPrinter

- (void)printHtml:(NSString *)html {

    if (!printInfo) {
        printInfo = [NSPrintInfo sharedPrintInfo];
        printInfo.topMargin = 25;
        printInfo.bottomMargin = 10;
        printInfo.rightMargin = 10;
        printInfo.leftMargin = 10;
    }

    NSRect printViewFrame = NSMakeRect(0, 0, printInfo.paperSize.width, printInfo.paperSize.height);
    printView = [[WebView alloc] initWithFrame:printViewFrame frameName:@"printFrame" groupName:@"printGroup"];
    printView.shouldUpdateWhileOffscreen = true;
    printView.frameLoadDelegate = self;
    [printView.mainFrame loadHTMLString:html baseURL:NSBundle.mainBundle.resourceURL];
}

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {

    if (frame != sender.mainFrame) {
        return;
    }

    if (sender.isLoading) {
        return;
    }

    if ([[sender stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {

        sender.frameLoadDelegate = nil;

        NSWindow *window = NSApp.mainWindow;
        if (!window) {
            window = NSApp.windows.firstObject;
        }

        NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView: frame.frameView.documentView printInfo:printInfo];
        [printOperation runOperationModalForWindow:window delegate:window didRunSelector:nil contextInfo:nil];
    }
}

@end

swift

class WebPrinter: NSObject, WebFrameLoadDelegate {

    let window: NSWindow
    var printView: WebView?
    let printInfo = NSPrintInfo.shared

    init(window: NSWindow) {
        self.window = window
        printInfo.topMargin = 30
        printInfo.bottomMargin = 15
        printInfo.rightMargin = 0
        printInfo.leftMargin = 0
    }

    func printHtml(_ html: String) {
        let printViewFrame = NSMakeRect(0, 0, printInfo.paperSize.width, printInfo.paperSize.height)
        if let printView = WebView(frame: printViewFrame, frameName: "printFrame", groupName: "printGroup") {
            printView.shouldUpdateWhileOffscreen = true
            printView.frameLoadDelegate = self
            printView.mainFrame.loadHTMLString(html, baseURL: Bundle.main.resourceURL)
        }
    }

    func webView(_ sender: WebView!, didFinishLoadFor frame: WebFrame!) {
        if frame != sender.mainFrame {
            return
        }

        if sender.isLoading {
            return
        }

        if sender.stringByEvaluatingJavaScript(from: "document.readyState") == "complete" {
            sender.frameLoadDelegate = nil
            let printOperation = NSPrintOperation(view: frame.frameView.documentView, printInfo: printInfo)
            printOperation.runModal(for: window, delegate: window, didRun: nil, contextInfo: nil)
        }
    }
}

关于objective-c - WKWebView 的打印内容 (OS X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29236929/

相关文章:

python - Python 选项卡完成时的重复输出 (OsX 10.8)

ios - 如何防止在后续异步调用完成之前发送下一个事件的信号?

objective-c - 如何获取 NSOutlineView 上下文菜单中右键单击的元素?

objective-c - 将 NSMutableDictionary 的键/值存储到另一个 NSMutableDictionary

iphone - 如何在 UITableView Cell 中制作透明的 UIButton

c - 使用 OSX Instruments 7.2 进行时间分析 C 程序

macos - 以编程方式获取/设置 Macos 默认系统键盘快捷键

ios - 核心数据 : disable undo for specific attributes. 推荐的方法不起作用

ios - 从 Storyboard实例化后无法分配给 View Controller 的属性

macos - 为什么当我按 F1、F2 等时会选择此功能键?