这个问题是关于打印 WKWebView 的所有内容(包括屏幕外内容)。目前(仍然是 iOS 10.2 或 OSX 10.12)没有可行的解决方案,也没有任何假定的解决方案计算器工作。仅当您已自行验证可以打印屏幕外内容时,才在此处提供答案,如果确实如此,则提供工作示例代码。
我正在尝试在 OSX 10.10 或更高版本上打印 ALL WKWebView 或 WebView 的内容(目前在 10.11.2 上运行)。例如,一个宽 html 表格,其中的列在 View 之外并偏向右侧。早期版本的 OSX 会自动分页并正确打印所有 html。
我已经尝试使用 Stackoverflow 和其他地方提供的解决方案。所有本质上都在说同样的事情,就是像这样打印 documentView:
[[NSPrintOperation printOperationWithView:_webView.mainFrame.frameView.documentView printInfo:pInfo] runOperation];
这在 10.10 中对 WKWebView 或 WebView 停止工作。如果你这样做:
[[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/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/