Objective c 使用内存中的UIWebView在PhoneGap中生成PDF
我在想怎么做 注意:我不是一个有经验的objective-c开发人员(因此我首先使用PhoneGap) 简而言之:My UIWebView(不,不是呈现webapp的PhoneGap,在内存中创建的第二个UIWebView,不可见)未呈现到PDF中。我刚得到一张空白的PDF。我将发布我的一些想法和代码,希望有人知道我做错了什么Objective c 使用内存中的UIWebView在PhoneGap中生成PDF,objective-c,uiwebview,cordova,pdf-generation,Objective C,Uiwebview,Cordova,Pdf Generation,我在想怎么做 注意:我不是一个有经验的objective-c开发人员(因此我首先使用PhoneGap) 简而言之:My UIWebView(不,不是呈现webapp的PhoneGap,在内存中创建的第二个UIWebView,不可见)未呈现到PDF中。我刚得到一张空白的PDF。我将发布我的一些想法和代码,希望有人知道我做错了什么 我的出发点是,这里已经有了PhoneGap的打印插件: 该插件动态创建UIWebView,您通过JavaScript向其传递一些HTML,然后它调用一些打印控制器来进
我的出发点是,这里已经有了PhoneGap的打印插件: 该插件动态创建UIWebView,您通过JavaScript向其传递一些HTML,然后它调用一些打印控制器来进行打印 所以我从中借用了一些想法。然后我注意到这篇关于生成PDF的很棒的博文 因此,我正试图将两者结合到我自己的PhoneGap插件中,以获取一些HTML(来自我的Web应用程序)并动态生成PDF 标题:
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
#ifdef PHONEGAP_FRAMEWORK
#import <PhoneGap/PGPlugin.h>
#else
#import "PGPlugin.h"
#endif
@interface ExportPlugin : PGPlugin <UIWebViewDelegate> {
NSString* exportHTML;
}
@property (nonatomic, copy) NSString* exportHTML;
//This gets called from my HTML5 app (Javascript):
- (void) exportPdf:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
@end
但是为什么呢?PhoneGap打印插件不必这样做。如果我不设置它,大小是0,然后我会得到很多上下文错误
接下来的问题是UIWebView没有呈现任何内容。也许是第一个问题的症状
我如何调试它并找出问题所在
更新 我非常确定,除非UIWebView实际上是可见的,否则可能无法将UIWebView层渲染到图像上下文中 我不确定PhoneGap打印插件是如何工作的。它似乎使它的UIWebView非常好,因为它不可见 我目前正在尝试将实际的PhoneGap UIWebView呈现到PDF中(与我自己的UIWebView相反)。但这并不理想
- 这意味着我必须隐藏所有工具栏等等,然后平移UIWebView,以便捕获视口外的所有内容。这并不理想,因为用户会直观地看到这种情况发生
- 上面的第1点似乎无论如何都不起作用,因为iPad在动态调整布局时更新屏幕的速度太慢了。在iPad上,如果你很快地做一些视觉上的事情(比如左右摇动屏幕),iPad的速度太慢,根本无法显示出来。你最终只能看到最终状态。因此,当我拍摄屏幕截图时,屏幕在视觉上并没有平移(即使DOM说已经平移)。(希望这是有道理的)
啊,令人沮丧。我现在有了一个可行的解决方案,但并不理想 我要做的是将phonegap UIWebView呈现到PDF中 要做到这一点是相当棘手的。我有两个objective-c函数
- (void) takeScreenshot;
- (void) renderPdf;
我从Javascript调用的
然后我必须编写一个递归JS算法,在调用takeScreenshot
的同时,将屏幕平移到各个方向
在调用takeScreenshot
之间,我使用setTimeout
在JS处理过程中提供20毫秒的中断-足够让iPad更新屏幕,以便拍摄下一个屏幕截图
这是一个巨大的痛苦的屁股。悬赏仍然是开放的,以防有人知道一个更好的方式来处理这个-我会非常好奇知道 以下是如何在UIWebView(网页是您的UIWebView)中呈现PDF,您的代理(此处为“self”)可以实现UIWebViewDelegate协议:
- (void)loadingPDFwithURL:(NSURL *)anURL {
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
appFrame.origin.y = 0;
[self.webPage initWithFrame:appFrame];
[self.webPage setScalesPageToFit:YES];
[self.webPage setDelegate:self];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:anURL];
[self.webPage loadRequest:requestObj];
[self.view addSubview:self.webPage];
}
因此,您给出了PDF的URL(如果它在内存中,只需在应用程序中编写文件,因为URL可以是文件路径)
另一种可能是深入研究CGPdf,但越来越困难。如果您想将UIWebView渲染为PDF,我认为您可以这样做: 1/使用UIWebView对象实现的convertRect:fromView方法获取CGRect 2/请参阅以制作打印预览 3/使用UIGraphicsGetCurrentContext从中获取CGContextRef
4/从CGRect和CGContextRef创建PDF(您可以使用Apple中提供的帮助使用CGPdf构建PDF我实际上需要相反的方法-将UIWebView的内容呈现为PDF
- (void) takeScreenshot;
- (void) renderPdf;
- (void)loadingPDFwithURL:(NSURL *)anURL {
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
appFrame.origin.y = 0;
[self.webPage initWithFrame:appFrame];
[self.webPage setScalesPageToFit:YES];
[self.webPage setDelegate:self];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:anURL];
[self.webPage loadRequest:requestObj];
[self.view addSubview:self.webPage];
}