Просмотр PDF в UIWebView с использованием loadData

Я пытаюсь отобразить PDF, который я сохранил локально в UIWebView. Вот как я сейчас пытаюсь это сделать:

if (![[NSFileManager defaultManager] fileExistsAtPath:self.url]) {
LOG_ERROR(@"Couldn't load local file. File at path: %@ doesn't exist", self.url);
        return; 
}

nsurl=[NSURL fileURLWithPath:self.url];
NSData *data = [NSData dataWithContentsOfFile:self.url];
LOG_DEBUG(@"data length:%d",[data length]);
[self.webView loadData:data MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];

Я также пробовал передавать nil для textEncoding, а также использовать UIWebView loadRequest. Результатом является UIWebView, который отображает пустую страницу. Ошибок в методе делегата UIWebView не возникает. Странно, что данные имеют правильную длину в байтах для PDF, который я пытаюсь отобразить, что означает, что файл находится и загружается правильно.

Есть ли у кого-нибудь идея о том, что может быть неправильным здесь, или как я могу лучше отладить эту проблему?

Ответ 1

Ниже вы можете найти два разных подхода, чтобы открыть файл .pdf на вашем UIWebView; один из a url и один как NSData:

if (self.pdfDataToLoad) //Loading the pdf as NSData
{ 
    [self.webView loadData:self.pdfData 
                  MIMEType:@"application/pdf" 
          textEncodingName:@"UTF-8" 
                   baseURL:nil];
}
else  //Open the pdf from a URL 
{ 
    NSURL *targetURL = [NSURL URLWithString:@"https://bitcoin.org/bitcoin.pdf"];
    NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
    [self.webView loadRequest:request];
}

Ответ 2

Оказывается, проблема связана с форматом файлов PDF файлов. Я редактировал их с помощью Illustrator и повторно сохранил их. Мне кажется, Mobile Safari не нравится, как Illustrator отформатировал файлы, потому что каждый из них был пустым при просмотре с помощью браузера симулятора (хотя я мог нормально открыть PDF файлы в обычном Safari).

Решение заключалось в том, чтобы открыть PDF файлы, используя Preview и повторно сохранить их. После запуска каждого PDF файла с помощью процедуры предварительного просмотра Preview я смог получить каждый PDF файл для отображения в UIWebView без изменения какого-либо кода.

Ответ 3

Вам не нужно NSData для загрузки локального файла, loadRequest должен работать непосредственно с NSURL

[self.webView loadRequest:[NSURLRequest requestWithURL:nsurl]];

Я могу предложить только сделать NSURL таким

nsurl = [NSURL URLWithString:[self.url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

Ответ 4

NSData используется для загрузки файлов PDF, когда они хранятся локально в любом из каталогов. Чтобы загрузить pdf файл, который был в вашем приложении, используйте следующий код.

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