iOS: Créer un file PDF à partir d'UIView

UIView de créer un PDF à partir d'un UIView qui peut contenir des images, des labels, etc. J'ai vérifié la reference ( GeneratingPDF ) et je connais également la méthode renderInContext: qui peut être utilisée pour dessiner le UIView de UIView sur le context PDF.

J'ai utilisé renderInContext: pour créer un PDF. Cependant, les images et le text ont perdu leur fidélité. Les images n'étaient pas sélectionnables individuellement et le text ne pouvait pas être sélectionné / copié, etc. dans le PDF résultant. Il était aussi bon / mauvais que le PDF créé à partir d'un instantané de l' UIView .

Ma question est, dois-je dessiner les texts et les images individuellement pour réaliser ce que je veux (en utilisant CGContextShowTextAtPoint & CGContextDrawImage )?

Si oui, comment puis-je scanner l' UIView pour les texts et les images? Supposons que je reçois l' UIView de l'extérieur et que je ne suis pas au courant de son contenu.

Vous devez en effet dessiner les texts / images individuellement dans un CGContextRef (regardez CGPDFContextCreateWithURL ) en utilisant des fonctions comme CGContextShowTextAtPoint . Alors que vous pourriez théoriquement scanner votre UIView pour les images / labels, il serait préférable de dessiner la layout à partir de zéro. Vous devez avoir un moyen de savoir quels éléments devraient être dans l'UIView. Bien que le code soit très différent, logiquement vous devriez l'aborder de la même manière que si vous deviez dessiner UIView par programme au lieu de le charger depuis une plume.

Si vous voulez vraiment scanner votre UIView, vous pouvez faire quelque chose comme ceci:

 for(UIView *subview in parentView.subviews) { if([subview isKindOfClass:[UIImageView class]]) { ... } else if([subview isKindOfClass:[UITextView class]]) { ... } else if([subview isKindOfClass:[UILabel class]]) { ... } } 

J'ai eu une chance modérée juste en marchant dans ma hiérarchie de vue, et en appelant -drawRect: moi-même. Il y a un peu de configuration que vous avez à faire avant chacun, comme traduire le ctm et effacer la masortingce de text, mais quand vous avez fait cela pour chaque vue, vous pouvez faire ceci:

 UIGraphicsPushContext(ctx); [self drawRect:self.frame]; UIGraphicsPopContext(); 

Le PDF qu'il génère est basé sur un vector – pas seulement un bitmap plat, donc il évolue bien et vous pouvez sélectionner le text dans un visualiseur / browser. Cela ne fonctionne que sur le dessin personnalisé de vanille ordinaire et des trucs très simples comme UILabels. Je doute que cela fonctionnerait avec des objects UIKit plus complexes (je pense aux vues de table et aux vues de défilement). En outre, vous auriez besoin d'un travail supplémentaire pour UIImageViews (que je suppose deviner la propriété de contenu de la couche avec un CGImageRef), et si vous avez d'autres attributes et transformations basés sur la couche – encore plus de travail.

Espérons que Apple nous donnera une meilleure solution que de maintenir le code de tirage parallèle!

essayer,

 { //read the pdf file CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("iPhoneAppProgrammingGuide.pdf"), NULL, NULL); PDFfile = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); CFRelease(pdfURL) CGPDFPageRef page = CGPDFDocumentGetPage(PDFfile,currentpage); context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0); CGContextFillRect(context,self.bounds); CGContextTranslateCTM(context, -1.0, [self bounds].size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFArtBox, [self bounds], 0, true)); CGContextDrawPDFPage(context, page); CGContextRestoreGState(context); //CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox), CGContextGetClipBoundingBox(context)); // CGContextConcatCTM(context, transform); UIGraphicsBeginImageContext(CGSizeMake(self.bounds.size.width, self.bounds.size.height)); }