如何从 UIWebView 打印内容?

Posted

技术标签:

【中文标题】如何从 UIWebView 打印内容?【英文标题】:How to take PRINT of content from UIWebView? 【发布时间】:2017-12-16 05:53:20 【问题描述】:

我正在使用 swift,我需要打印在 UIWebView 中打开的工作表。

    let url = webView.request?.url
    let stringurl = url?.absoluteString

    let pic = UIPrintInteractionController.shared
    let printInfo : UIPrintInfo = UIPrintInfo(dictionary: nil)

    printInfo.outputType = UIPrintInfoOutputType.general
    printInfo.jobName = stringurl!

    pic.printInfo = printInfo
    pic.printFormatter = webView.viewPrintFormatter()
    pic.showsPageRange = false

    pic.present(animated: true, completionHandler: nil)

【问题讨论】:

【参考方案1】:

这是我的解决方案:

UIWebViewDelegate 函数webViewDidFinishLoad 中,我们需要将window.print 函数“重定向”到我们将负责打印的本机函数:

open func webViewDidFinishLoad(_ webView: UIWebView) 
    webView.stringByEvaluatingjavascript(from: "(function()var originalPrintFn = window.print;window.print = function()window.location = 'webViewPrintAction';)();")

下一步:

public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool 
   if request.url!.absoluteString.contains("webViewPrintAction") 
            printContent()
            return false
        
   return true

最后一步实现printContent()函数:

private func printContent() 
   let printInfo = UIPrintInfo(dictionary: nil)
   printInfo.jobName = webView.description
   printInfo.outputType = .general

   let printController = UIPrintInteractionController.shared
   printController.printInfo = printInfo
   printController.printingItem = webView
   printController.present(animated: true)

现在,当我们在 webView 中按下 print 时(第一张截图),我们将看到 ios 原生对话框(第二张截图):

【讨论】:

我认为这行不通。printingItem 只能接受 NSURL、NSData、UIImage 或 ALAsset。它不接受 UIView。【参考方案2】:

通过创建图像上下文,然后在 Web 视图上调用 drawHierarchy(in:afterScreenUpdates:) 方法,将 Web 视图的内容绘制到 UIImage

然后您可以将生成的图像作为printingItem 传递给您的打印交互控制器。

【讨论】:

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

iPhone - 如何防止 UIWebView 绘制/更新其内容

从 appdelegate swift 访问 UIwebview

使用手势将图像从 UIWebView 保存到相机胶卷

如何打印具有多个数据的标题和uitableview的uiwebview

如何使用多个数据打印带有标题和uitableview的uiwebview

将 UIWebView 上的 ScreenEdgePanGesture 传递给父 PageViewController