pro printer para mac inactiva imprimir impresora desde descargar cualquier como ios macos printing wkwebview osx-yosemite

printer - Cómo se imprime todo el contenido de OSK e iOS de WKWebView On AND Offscreen



printer pro desktop para windows (4)

Esta pregunta es sobre la impresión de TODO el contenido (incluido el contenido fuera de pantalla) de WKWebView. Actualmente (aún, a partir de iOS 10.2 u OSX 10.12) NO hay una solución que funcione y ninguna de las supuestas soluciones en el Stackoverflow funciona. Solo proporcione una respuesta aquí si ha verificado por sí mismo que puede imprimir CONTENIDO DE PANTALLA FUERA, y si lo hizo, proporcione el código de ejemplo de trabajo.

Estoy intentando imprimir TODO el contenido de un WKWebView o WebView en OSX 10.10 o superior (actualmente se ejecuta en 10.11.2). Por ejemplo, una tabla html ancha donde las columnas están fuera de la vista y fuera de la derecha. Las versiones anteriores de OSX paginarían automáticamente e imprimirían correctamente todo el html.

He intentado usar las soluciones disponibles aquí en Stackoverflow y en otros lugares. Esencialmente, todos dicen lo mismo que es imprimir el documentView así:

[[NSPrintOperation printOperationWithView:_webView.mainFrame.frameView.documentView printInfo:pInfo] runOperation];

Esto dejó de funcionar tanto para WKWebView como para WebView en 10.10. Si haces esto:

[[NSPrintOperation printOperationWithView:_wkWebView printInfo:pInfo] runOperation];

Obtiene paginación pero la impresión incluye barras de desplazamiento WebView , y el otro WKWebView le da páginas en blanco.

No puedo encontrar ninguna mención en absoluto en la documentación de Apple sobre la impresión para WKWebView en OSX. Tampoco puedo encontrar ninguna respuesta que sea específica de OSX y no de iOS.

¿Alguien tiene alguna idea de cómo imprimir esto en OSX?

ACTUALIZACIÓN : este es un error en WebView [Radar: 23159060] (aún abierto el 2/2018) y WKWebView ni siquiera parece abordar la impresión en OSX. Después de examinar el Open Source para esta clase en la red, veo que todas las clases que tienen algo que ver con la impresión están en un bloque de compilación condicional que solo es compatible con la plataforma: iOS .

ACTUALIZACIÓN Part Deux : ¡Sorprendentemente, este error ridículo existe en TODAS las implementaciones de esta clase, incluidas las de iOS! Me parece ridículo que esto aún no se haya solucionado en esta fecha tardía a pesar de la declaración de la documentación para usar esto (y solo esta clase) en aplicaciones compatibles con iOS 8 o superior. Ahora es IMPOSIBLE imprimir todo el contenido en pantalla y fuera de pantalla de una WebView en iOS o OSX. Falla Apple. ¡Es hora de arreglar esto! Todos sabemos lo que Steve hubiera dicho al respecto ...

Nota: Además, creo que la causa raíz de este problema es lo que también hace que sea imposible guardar TODO el contenido de WKWebView como una imagen. Solía ​​haber algunas técnicas que uno podría usar con un UIWebView para guardar todo el contenido en pantalla y fuera de la pantalla de WebView en una imagen. Todavía no he encontrado una solución de trabajo.


En iOS, paso UIView.viewPrintFormatter () a UIActivityViewController para permitir a los usuarios imprimir todo

let myShare = [webView.viewPrintFormatter()] let avc = UIActivityViewController(activityItems: myShare, applicationActivities: nil) present(avc, animated: true, completion: nil)


Esta no es la respuesta correcta porque Apple debe proporcionar la respuesta correcta con un método de impresión funcional o .evaluateJavaScript("window.print()", completionHandler: nil)

Pero tengo una solución estúpida que "funciona" para mí y quizás ayude a otras personas con una solución hasta ese momento.

Paso 1: Agarra el HTML y corrige la <body> tag with <body onload=''window.print()''> . Si está recuperando el html de algún lugar y no está cargando el suyo, querrá usar algunas expresiones regulares. No voy a entrar en eso.

Paso 2: Guarde el html en un archivo en algún lugar y mantenga la ruta completa en una variable. En mi ejemplo: nombre de archivo

Paso 3: Conecte su botón de impresión a este código:

RunCommand(command: "/usr/bin/open /(filename)")

Vea el código de RunCommand a continuación. Esto deja una estúpida ventana de safari, pero permite imprimir algo sin guardar en un archivo y luego recordar dónde lo guardó para poder abrirlo con Safari por su cuenta y hacer la impresión.

func RunCommand(command: String) -> (success: Bool, result: String) { let cc = command.components(separatedBy: " ") let process = Process() process.launchPath = cc[0] var cp: [String] = [] for i in (1..<cc.count) { cp.append(cc[i]) } process.arguments = cp let pipe = Pipe() process.standardOutput = pipe process.launch() let data = pipe.fileHandleForReading.readDataToEndOfFile() if (data.count > 0) { let output = String(data: data, encoding: String.Encoding.utf8) // let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) return (success: true, result: output!) } return (success: true, result: "") }

Sería muy bueno si Apple pudiera arreglar esto. Tengo una aplicación interna que hace todos sus informes en HTML y los informes son algo que usted quiere imprimir.


He agotado todas las formas posibles de imprimir el WKWebView directamente sin éxito. La única solución que se me ocurre sería convertir la página web a un objeto PDF y luego imprimir dicho objeto. Actualizaré con el código si logro que la solución funcione.


La solución que utilizo es crear una instancia de un buen objeto antiguo de WebView y utilizar el método de impresión de ese objeto.

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) 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 sender.isLoading { return } if frame != sender.mainFrame { 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) } } }