2010-12-09 33 views
11

J'essaie d'afficher un PDF que j'ai stocké localement dans un UIWebView. Voici comment je tente actuellement de le faire:Afficher le PDF dans UIWebView en utilisant 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]; 

J'ai aussi essayé nul pour passer TextEncoding, ainsi que l'utilisation de loadRequest UIWebView. Le résultat est un UIWebView qui affiche une page vierge. Aucune erreur ne se produit dans la méthode déléguée UIWebView. La chose étrange est que les données ont la bonne longueur, en octets, pour le PDF que j'essaie d'afficher, ce qui signifie que le fichier est trouvé et chargé correctement.

Est-ce que quelqu'un a une idée de ce qui pourrait mal se passer ici ou comment je peux mieux déboguer ce problème?

Répondre

4

Ci-dessous vous trouverez deux approches différentes pour ouvrir un fichier sur votre .pdfUIWebView; un d'un url et un comme 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

Ceci. Tout le monde dit "vous n'en avez pas besoin, il suffit de charger l'URL du fichier!". Mais dans mon cas, j'ai le fichier PDF en tant que 'NSData()' dans la RAM (je l'ai juste rendu à partir de HTML) et il est inutile de sauvegarder une fois dans un fichier temporaire. Merci d'avoir répondu à la question. –

+0

@NicolasMiari Vous êtes les bienvenus, heureux d'aider –

1

Vous n'avez pas besoin NSData de charger le fichier local, loadRequest doit travailler directement avec NSURL

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

Je ne peux que suggérer de faire NSURL comme ça

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

Vous avez absolument raison. Ce n'était pas lié à ma solution, mais j'ai fini par le faire comme vous le décrivez. – mmontalbo

2

Il se trouve le problème quelque chose à voir avec le format de fichier des fichiers PDF. Je les ai édités en utilisant Illustrator et les ai réenregistrés. Je suppose que Mobile Safari n'aime pas la façon dont Illustrator a formaté les fichiers car chacun d'eux était vide lorsqu'il était visionné en utilisant le navigateur du simulateur (bien que je puisse très bien ouvrir les fichiers PDF dans Safari normal).

La solution consistait à ouvrir les PDF en utilisant Aperçu et à les réenregistrer. Après avoir exécuté chaque fichier PDF à l'aide de la routine de sauvegarde de prévisualisation, j'ai pu obtenir chaque PDF à afficher dans un UIWebView sans modifier mon code.

1

NSData est utilisé pour charger les fichiers pdf lorsqu'ils sont stockés localement dans l'un des répertoires. Pour charger le pdf qui était dans votre application, utilisez le code suivant.

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