Objective c 使用内存中的UIWebView在PhoneGap中生成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,然后它调用一些打印控制器来进

我在想怎么做

注意:我不是一个有经验的objective-c开发人员(因此我首先使用PhoneGap)

简而言之:My UIWebView(不,不是呈现webapp的PhoneGap,在内存中创建的第二个UIWebView,不可见)未呈现到PDF中。我刚得到一张空白的PDF。我将发布我的一些想法和代码,希望有人知道我做错了什么


我的出发点是,这里已经有了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];
}