Création d'un fichier PDF à partir de UIWebView
-(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename
{
//Creates a mutable data object for updating with binary data, like a byte array
UIWebView *webView = (UIWebView*)aView;
NSString *heightStr = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];
int height = [heightStr intValue];
//Get the number of pages needed to print. 9 * 72 = 648
int pages = ceil(height / 648.0);
NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
CGRect frame = [webView frame];
for (int i = 0; i < pages; i++) {
//Check to see if page draws more than the height of the UIWebView
if ((i+1) * 648 > height) {
CGRect f = [webView frame];
f.size.height -= (((i+1) * 648.0) - height);
[webView setFrame: f];
}
UIGraphicsBeginPDFPage();
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(currentContext, 72, 72); //Translate for 1" margins
[[[webView subviews] lastObject] setContentOffset:CGPointMake(0, 648 * i) animated:NO];
[webView.layer renderInContext:currentContext];
}
UIGraphicsEndPDFContext();
//Retrieves the document directories from the iOS device
NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString* documentDirectory = [documentDirectories objectAtIndex:0];
NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];
//instructs the mutable data object to write its context to a file on disk
[pdfData writeToFile:documentDirectoryFilename atomically:YES];
[webView setFrame:frame];
NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
}
Je suis en utilisant le code ci-dessus pour générer un fichier pdf à partir d'une webview. C'est le travail, cependant, le contenu n'est pas recadrée correctement : le contenu sur le bas des pages se faire massacrer.
Je pense que je pourrais faire quelque chose de mieux à l'aide de Graphiques de Base des méthodes mais je ne trouve pas comment faire. Des idées ?
OriginalL'auteur AnderCover | 2013-04-04
Vous devez vous connecter pour publier un commentaire.
Utilisation
UIPrintPageRenderer
deUIWebView
Suivez les étapes ci-dessous :Ajouter
Category
deUIPrintPageRenderer
pour obtenir des Données PDFAjouter ces définissent, pour format A4
Maintenant dans
UIWebView's
webViewDidFinishLoad
delegate
utilisationUIPrintPageRenderer
property
deUIWebView
.Je souhaite que j'avais un million de upvotes à vous donner. Fantastique.
Ici, je peux rendre le fichier pdf à partir de uiwebview. Mais je ne peux pas rendre le fichier pdf avec les sous-vues dans uiwebview. je suis confronté à ce problème en utilisant le code ci-dessus.
L'orientation est paysage, comment convertir le portrait?
OriginalL'auteur Paresh Navadiya
Merci pour vos réponses Firemarble, il m'a beaucoup aidé.
J'ai réussi à obtenir un peu de bon résultats avec cette méthode :
OriginalL'auteur AnderCover
Swift 2.0 solution, comment faire pour enregistrer le fichier pdf à partir de webview pour NSData:
Vous devez également ajouter UIWebViewDelegate à votre ViewController et l'extension de UIPrintPageRenderer.
OriginalL'auteur Konrad Siemczyk
Swift 3 solution de @Dan Loewenherz réponse:
OriginalL'auteur Alfi
On dirait que le problème peut venir de la codé en dur hauteur 648. Qu'advient-il si vous remplacez toutes les instances de 648 à l'appel de la windows screenHeight?
//Grab les fenêtres de largeur et de hauteur.
Quelle a été votre raisonnement pour l'utilisation de 648 alors?
NSMutableData *pdfData = [NSMutableData de données]; UIGraphicsBeginPDFContextToData(pdfData, webView.limites, nil); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); UIGraphicsBeginPDFContextToData [webView.couche renderInContext:pdfContext]; UIGraphicsEndPDFContext();
Eh bien il n'y a pas de raisonnement que ce soit... N'obtenez pas rencontré de mal je suis d'accord que 648 ne convient pas à la taille de l'iPad, je n'ai tout simplement pas attention à elle.
Regardez cette ligne, vous devez UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil ); Essayez de supprimer CGRectZero et de le remplacer avec webView.limites
OriginalL'auteur user-44651