在 WebView 中使用 QLViewController 查看 PDF

Posted

技术标签:

【中文标题】在 WebView 中使用 QLViewController 查看 PDF【英文标题】:Viewing a PDF with QLViewController in a WebView 【发布时间】:2013-10-18 22:10:04 【问题描述】:

基本上,我想在我的 Web 视图中单击一个按钮,该按钮将从远程网站下载 PDF 并使用关闭/返回按钮显示它。我正在使用 QLViewController,因此人们可以捏缩放 PDF,并且我正在使用 PhoneGap 3.0 和 XCode 5 对其进行编码。

这是我的插件的代码,它将显示带有后退按钮的新视图,但我似乎无法显示 PDF。有什么想法吗?

#import "PDFViewer.h"
#import <Cordova/CDV.h>

@implementation PDFViewer

- (void)loadRemotePdf:(CDVInvokedUrlCommand*)command

    CDVPluginResult* pluginResult = nil;
    NSString *website = [command.arguments objectAtIndex:0];
    NSString *filename = [command.arguments objectAtIndex:1];

    if (website != nil && [website length] > 0) 

        CGRect rect = [[UIScreen mainScreen] bounds];
        CGSize screenSize = rect.size;
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];

        UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,screenSize.width,screenSize.height)];
        webView.autoresizesSubviews = YES;
        [webView canGoBack];
        webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

//        NSURL *myUrl = [NSURL URLWithString:website];
//        NSURLRequest *myRequest = [NSURLRequest requestWithURL:myUrl];

//        [webView loadRequest:myRequest];

//        [window addSubview: webView];

        NSURL  *url = [NSURL URLWithString:website];
        NSData *urlData = [NSData dataWithContentsOfURL:url];
        if ( urlData )
        
            NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString  *documentsDirectory = [paths objectAtIndex:0];

            filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, filename];
            [urlData writeToFile:filePath atomically:YES];

            // Create test view controller
            QLPreviewController *previewer = [[QLPreviewController alloc] init];
            previewer.dataSource = self;
            previewer.delegate = self;

            // Create navigation controller
            UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:previewer];

            [window addSubview: [nav view]];
            [window makeKeyAndVisible];
        


        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    
    else 
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];

    

    // return result
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];


#pragma mark - QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller 
    return 1;


- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index;

    NSURL *fileURL = [NSURL fileURLWithPath: filePath];
    return fileURL;

@end

【问题讨论】:

仅使用xcode 标签来回答有关 IDE 本身的问题。谢谢! 【参考方案1】:

是的,这可以通过 UIWebView 完成。

如果您尝试显示驻留在某处服务器上的 PDF 文件,您可以简单地将其直接加载到您的 Web 视图中:

UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 10, 200, 200)];

NSURL *targetURL = [NSURL URLWithString:@"http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIWebView_Class/UIWebView_Class.pdf"];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webView loadRequest:request];

[self.view addSubview:webView];
[webView release];

//或者如果您的应用程序捆绑了一个 PDF 文件(在本示例中名为“document.pdf”):

UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 10, 200, 200)];

NSString *path = [[NSBundle mainBundle] pathForResource:@"document" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webView loadRequest:request];

[self.view addSubview:webView];
[webView release];

【讨论】:

我一开始就尝试过这样做(上面已经注释掉了),但它缺少放大/缩小并且不显示关闭按钮。许多人建议使用 QLPreviewController 来获得这些功能。所以基本上我想了解如何让 PDF 显示在网络视图上,然后关闭以返回它。

以上是关于在 WebView 中使用 QLViewController 查看 PDF的主要内容,如果未能解决你的问题,请参考以下文章

使用chrome开发者工具在原生安卓应用中调试WebView

在 Fragment 中使用 WebView

使用flutter_webview_plugin加载页面后如何在WebView中执行JavaScript代码

如何在 Webview2 中使用透明度?

Android:如何在webview中呈现html而不显示webview

如何在 Fragment l 中使用 WebView? [关闭]