gpt4 book ai didi

ios - 如何打印所有 WKWebView On 和 Offscreen 内容 OSX 和 iOS

转载 作者:IT王子 更新时间:2023-10-29 08:01:45 26 4
gpt4 key购买 nike

这个问题是关于打印 WKWebView 的所有内容(包括屏幕外内容)。目前(仍然是 iOS 10.2 或 OSX 10.12)没有可行的解决方案,也没有任何假定的解决方案计算器工作。仅当您已自行验证可以打印屏幕外内容时,才在此处提供答案,如果确实如此,则提供工作示例代码。

我正在尝试在 OSX 10.10 或更高版本上打印 ALL WKWebViewWebView 的内容(目前在 10.11.2 上运行)。例如,一个宽 html 表格,其中的列在 View 之外并偏向右侧。早期版本的 OSX 会自动分页并正确打印所有 html。

我已经尝试使用 Stackoverflow 和其他地方提供的解决方案。所有本质上都在说同样的事情,就是像这样打印 documentView:

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

这在 10.10 中对 WKWebViewWebView 停止工作。如果你这样做:

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

你得到了分页,但打印输出包括滚动条 WebView,而另一个 WKWebView 给你空白页。

我在 Apple 文档中找不到任何关于在 OSX 上打印 WKWebView 的内容。我也找不到任何特定于 OSX 而不是 iOS 的答案。

有人知道如何在 OSX 上打印这些吗?

更新:这是 WebView [Radar:23159060](仍然开放 2/2018) 中的一个错误,WKWebView 甚至似乎没有解决 OSX 上的打印问题。在网上检查了此类的开源后,我看到所有 与打印有关的类都在仅支持平台的条件编译 block 中: iOS

UPDATE Part Deux:令人惊讶的是,这个类的所有实现中都存在这个荒谬的错误,包括 iOS 上的实现!尽管文档声明在支持 iOS 8 或更高版本的应用程序中使用此(且仅此类),但在这么晚的日期,这仍然仍未修复,我觉得这很荒谬。现在不可能在 iOS 或 OSX 上打印 WebView 的所有屏幕上和屏幕外内容。失败的苹果。是时候解决这个问题了!我们都知道史蒂夫会怎么说……

更新第三部分 :)- 更令人惊讶的是,这个问题从 10.15.2 开始并没有得到解决,并且在 4 年多的时间里出现了!!!这个问题一直存在(Apple waaaaaake up up up up up ....)。考虑到他们在 iOS 领域对使用 WKWebView 和以上甚至拒绝不支持的应用程序(除非你试图支持 iOS 7)变得非常有进取心,这真是令人惊讶。

更新第四部分(2020 年......你能相信吗?!?):在大苏尔,这仍然是一个问题。我通过编写解决方案解决了这个问题,请参阅下面接受的答案:

printOperationWithPrintInfo:

不打印屏幕外或在水平或垂直方向上滚出 View 的所有内容。但是,它确实使用了您的 Print CSS,这比以下内容略有优势:

- (void)takeSnapshotWithConfiguration:(WKSnapshotConfiguration *)snapshotConfiguration 
completionHandler:(void (^)(NSImage *snapshotImage, NSError *error))completionHandler;

为了让它工作,我做了:

NSPrintInfo *pInfo = [[NSPrintInfo alloc] initWithDictionary:printInfoDict];
pInfo.horizontalPagination = NSPrintingPaginationModeAutomatic;
pInfo.verticalPagination = NSPrintingPaginationModeAutomatic;
pInfo.verticallyCentered = YES;
pInfo.horizontallyCentered = YES;
pInfo.orientation = NSPaperOrientationLandscape;
pInfo.leftMargin = 30;
pInfo.rightMargin = 30;
pInfo.topMargin = 30;
pInfo.bottomMargin = 30;

NSPrintOperation *po = [_webView printOperationWithPrintInfo:pInfo];
po.showsPrintPanel = YES;
po.showsProgressPanel = YES;

// Without the next line you get an exception. Also it seems to
// completely ignore the values in the rect. I tried changing them
// in both x and y direction to include content scrolled off screen.
// It had no effect whatsoever in either direction.
po.view.frame = _webView.bounds;

// [printOperation runOperation] DOES NOT WORK WITH WKWEBVIEW, use
[po runOperationModalForWindow:self.view.window delegate:self didRunSelector:@selector(printOperationDidRun:success:contextInfo:) contextInfo:nil];

**还有一些我不完全理解的事情。 wkWebView 的大小似乎无关紧要。如果我调整应用程序的大小以隐藏某些内容,它似乎仍然会在屏幕外抓取尽可能多的内容以适应指定的页面,但它似乎不知道如何对不适合页面大小的内容进行分页到其他页面。所以这似乎是问题所在。可能有一些解决方法,如果有人有线索,请在此处发布!!

最佳答案

我已经成功地使用了 SPI -[WKWebView _printOperationWithPrintInfo:] 通过了通常的 [NSPrintInfo sharedPrintInfo]。请注意,您不能对返回的 NSPrintOperation 使用 -runOperation。您必须使用 -runOperationModalForWindow:.... 这非常相似。问题出在 WebKit 内部,它需要一个正在运行的 runloop 并在内部进行预览以了解页面数量。

它绝对适用于屏幕外内容,如果屏幕外的意思是“未完全显示在屏幕上”。我仍然有一个 WKWebView 显示在一个窗口中,但它非常小并且只显示整个 webview 内容的一小部分(21 个 A4 页!)。希望这对您有所帮助!

PS:在 10.12、10.14 和 10.15 上测试。代码是这样的:

     SEL printSelector = NSSelectorFromString(@"_printOperationWithPrintInfo:"); // This is SPI on WKWebView. Apparently existing since 10.11 ?

NSMutableDictionary *printInfoDict = [[[NSPrintInfo sharedPrintInfo] dictionary] mutableCopy];
printInfoDict[NSPrintJobDisposition] = NSPrintSaveJob; // means you want a PDF file, not printing to a real printer.
printInfoDict[NSPrintJobSavingURL] = [NSURL fileURLWithPath:[@"~/Desktop/wkwebview_print_test.pdf" stringByExpandingTildeInPath]]; // path of the generated pdf file
printInfoDict[NSPrintDetailedErrorReporting] = @YES; // not necessary

// customize the layout of the "printing"
NSPrintInfo *customPrintInfo = [[NSPrintInfo alloc] initWithDictionary:printInfoDict];
[customPrintInfo setHorizontalPagination: NSPrintingPaginationModeAutomatic];
[customPrintInfo setVerticalPagination: NSPrintingPaginationModeAutomatic];
[customPrintInfo setVerticallyCentered:NO];
[customPrintInfo setHorizontallyCentered:NO];
customPrintInfo.leftMargin = 0;
customPrintInfo.rightMargin = 0;
customPrintInfo.topMargin = 5;
customPrintInfo.bottomMargin = 5;

NSPrintOperation *printOperation = (NSPrintOperation*) [_webView performSelector:printSelector withObject:customPrintInfo];

[printOperation setShowsPrintPanel:NO];
[printOperation setShowsProgressPanel:NO];

// BOOL printSuccess = [printOperation runOperation]; // THIS DOES NOT WORK WITH WKWEBVIEW! Use runOperationModalForWindow: instead (asynchronous)
[printOperation runOperationModalForWindow:self.window delegate:self didRunSelector:@selector(printOperationDidRun:success:contextInfo:) contextInfo:nil]; // THIS WILL WORK, but is async

关于ios - 如何打印所有 WKWebView On 和 Offscreen 内容 OSX 和 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com