2010-12-09 12 views
11

Estoy tratando de mostrar un PDF que he almacenado localmente en un UIWebView. Esta es la forma en la actualidad que intento hacer esto:Mostrar PDF en UIWebView usando loadData

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

También he intentado pasar nula para textEncoding, así como el uso de loadRequest UIWebView. El resultado es un UIWebView que muestra una página en blanco. No se producen errores en el método delegado UIWebView. Lo extraño es que los datos tienen la longitud correcta, en bytes, para el PDF que estoy tratando de mostrar, lo que significa que el archivo se encuentra y se carga correctamente.

¿Alguien tiene una idea de qué podría estar pasando mal aquí o cómo puedo solucionar mejor este problema?

Respuesta

4

A continuación puede encontrar dos enfoques diferentes para abrir un archivo en su .pdfUIWebView; uno de un url y uno como 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

Esto. Todo el mundo dice "¡no lo necesitas, solo carga la URL del archivo!". Pero en mi caso, tengo el PDF como 'NSData()' en la RAM (acabo de renderizarlo desde HTML) y no tiene sentido guardar una vez en un archivo temporal. Gracias por responder la pregunta real. –

+0

@NicolasMiari De nada, me alegro de ayudar –

1

No es necesario NSData para cargar archivos local, loadRequest debe trabajar directamente con NSURL

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

sólo puedo sugerir para hacer NSURL así

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

Usted está absolutamente correcto. Eso no estaba relacionado con mi solución, pero sí terminé haciéndolo de la manera que describes. – mmontalbo

2

Resulta que el problema era algo que ver con el formato de archivo de los PDF. Los edité usando Illustrator y los volví a guardar. Supongo que a Mobile Safari no le gusta la forma en que Illustrator formateó los archivos porque cada uno estaba en blanco cuando se veía usando el navegador del simulador (aunque podía abrir los archivos PDF en Safari normal).

La solución fue abrir los archivos PDF usando Vista previa y volverlos a guardar. Después de ejecutar cada PDF a través de la rutina de guardar Vista Previa, pude hacer que cada PDF se muestre en un UIWebView sin cambiar ninguno de mis códigos.

1

NSData se utiliza para cargar los archivos pdf cuando se almacenan localmente en cualquiera de los directorios. Para cargar el pdf que estaba en su aplicación, use el siguiente código.

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