【问题标题】:How to print a specific iFrame from a WKWebView如何从 WKWebView 打印特定的 iFrame
【发布时间】: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 吗?

【问题讨论】:

    标签: ios iframe wkwebview


    【解决方案1】:

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

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

    1. 将以下用户脚本添加到 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 中,而不仅仅是在顶部窗口中

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

    在标题中:

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

    实施:

    -(void) userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
    
    1. 使用消息处理程序检索 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,这一点很重要,而我的情况并非如此

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2012-11-19
      相关资源
      最近更新 更多