2010-12-09 2 views
11

Ich versuche, eine PDF-Datei anzuzeigen, die ich lokal in einem UIWebView gespeichert habe. Dies ist, wie ich zur Zeit, dies zu tun versuchen:PDF in UIWebView mit loadData anzeigen

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]; 

ich auch versucht nil für Textencoding vorbei haben, sowie UIWebView der loadrequest verwenden. Das Ergebnis ist ein UIWebView, das eine leere Seite anzeigt. In der UIWebView-Delegatmethode treten keine Fehler auf. Das Seltsame ist, dass die Daten die richtige Länge (in Bytes) für die PDF haben, die ich anzeigen möchte, was bedeutet, dass die Datei gefunden und korrekt geladen wird.

Hat jemand eine Idee, was hier schief gehen könnte oder wie ich dieses Problem besser beheben kann?

Antwort

4

Im Folgenden finden Sie zwei verschiedene Ansätze finden können eine .pdf Datei auf Ihrem UIWebView zu öffnen; die man von einem url und einer als 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]; 
} 
+3

Dies. Jeder sagt "Sie brauchen es nicht, laden Sie einfach die Datei-URL!". Aber in meinem Fall habe ich die PDF als 'NSData()' im RAM (ich habe es nur aus HTML gerendert) und es ist sinnlos, einmal in eine temporäre Datei zu speichern. Vielen Dank für die Beantwortung der Frage. –

+0

@NicolasMiari Sie sind herzlich willkommen, froh zu helfen –

1

Sie nicht NSData brauchen lokale Datei zu laden, sollte direkt loadrequest arbeiten mit NSURL

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

ich nur NSURL mag, dass es stellt sich heraus,

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

Sie sind absolut richtig. Das war nicht mit meiner Lösung verbunden, aber ich habe es so gemacht, wie du es beschrieben hast. – mmontalbo

2

machen vorschlagen kann, das Problem war, etwas mit dem Dateiformat der PDFs zu tun. Ich habe sie mit Illustrator bearbeitet und erneut gespeichert. Ich schätze, Mobile Safari gefällt die Art und Weise, wie Illustrator die Dateien formatiert hat, weil sie im Browser des Simulators leer waren (obwohl ich die PDFs in normalem Safari problemlos öffnen konnte).

Die Lösung bestand darin, die PDFs mit Vorschau zu öffnen und sie erneut zu speichern. Nachdem ich jedes PDF durch die Vorschau-Speicherroutine laufen hatte, konnte ich jedes PDF in einem UIWebView anzeigen lassen, ohne irgendeinen Code zu ändern.

1

NSData wird verwendet, um die PDF-Dateien zu laden, wenn sie lokal in einem der Verzeichnisse gespeichert sind. Verwenden Sie den folgenden Code, um die PDF-Datei zu laden, die sich in Ihrer Anwendung befand.

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