如何从 WKWebView 打印特定的 iFrame

Posted

技术标签:

【中文标题】如何从 WKWebView 打印特定的 iFrame【英文标题】:How to print a specific iFrame from a WKWebView 【发布时间】:2018-03-23 01:00:41 【问题描述】:

我正在使用类似于下面链接的问题的技术来捕获 window.print() 并触发 WKWebView 的打印。这适用于主页。

Capturing window.print() from a WKWebView

我希望做的是在页面中打印 iFrame,而不是页面本身。在 javascript 中,我关注 iFrame 并调用 window.print(),它适用于 ios 上的 Safari(它使用 WKWebView?)以及各种桌面浏览器。

有人知道如何使用 WKWebView printFormatter 来打印 html 内容的 iFrame 吗?

【问题讨论】:

【参考方案1】:

在过去的 3 天里,我一直在为同样的问题苦苦挣扎,并且拼命地在网上寻找解决方案,但我没有找到。

但我终于让它运行起来了,所以这是我的解决方案:

    将以下用户脚本添加到 WKWebViewconfig.userContentController:

     WKUserScript *printScript = [[WKUserScript alloc] initWithSource:@"window.print = function() window.webkit.messageHandlers.print.postMessage('print')"
                                                  injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
    
    [webViewConfig.userContentController addUserScript:printScript];
    [webViewConfig.userContentController addScriptMessageHandler:self name:@"print"];
    

=> 这与Capturing window.print() from a WKWebview 中的相同,但有一个关键区别:forMainFrameOnly 设置为 NO,因为我们希望将其注入 iframe 中,而不仅仅是在顶部窗口中

    在持有您的 WKWebview 的视图控制器中定义一个消息处理程序:

在标题中:

@interface MyViewcontroller : UIViewController <UIGestureRecognizerDelegate, WKNavigationDelegate, WKScriptMessageHandler>

实施:

-(void) userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

    使用消息处理程序检索 iframe 的源(即您的 pdf),并将其用作 iOS 的 PrintController 的打印项:

    -(void) userContentController:(WKUserContentController     *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
    
    
     if([message.name isEqualToString:@"print"])
    
        [self.webView evaluateJavaScript:@"window.document.querySelector(\"iframe\").src" completionHandler:^(NSString *result, NSError *error)
        
            UIPrintInteractionController    *printController = UIPrintInteractionController.sharedPrintController;
            printController.printingItem = [NSURL URLWithString:result];
    
            UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error)
            
                if(!completed)
                
                    if(error != nil) NSLog(@"Print failed: \nDomain: %@\nError code:%ld", error.domain, (long) error.code);
                    else             NSLog(@"Print canceled");
                
                NSLog(@"Print completed!\nSelected Printer ID: %@", printController.printInfo.printerID);
            ;
    
            if(printController != nil)
                [printController presentAnimated:YES completionHandler:completionHandler];
        ];
    
    
    else
        NSLog(@"Unrecognized message received from web page");    
    

注意:我使用 window.document.querySelector(\"iframe\") 因为我们的 iframe 没有 id,否则我会使用 window.getComponentByID。如果您有多个 iframe,这一点很重要,而我的情况并非如此

我希望这对您和其他人也有帮助!

【讨论】:

以上是关于如何从 WKWebView 打印特定的 iFrame的主要内容,如果未能解决你的问题,请参考以下文章

如何将 iFrame 的高度和宽度设置为与 WKWebView 框架相同?

如何在 iOS 中使用 WKWebView 将值动态传递到 iFrame

如何访问科尔多瓦 WKWebview ios 应用程序的 iframe 中的元素?

从 WKWebView 打印按钮单击 [重复]

iframe 未在 WKWebview 中加载

Jquery:如何从具有相同类名的多个 iframe 加载特定 iframe