ios objective-c uiwebview pdf-generation uigraphicscontext

ios - Problemas al generar PDF desde uiwebview en el objetivo c



objective-c pdf-generation (5)

Tengo el archivo pdf abierto en uiwebview, agrego imágenes y texto en la subvista uiwebview. Luego intenté crear el archivo pdf. Debajo de la muestra que he usado para generar el archivo pdf. Escritura de páginas múltiples en una sola página. ¿Cómo puedo escribir la calidad de la muestra y el tamaño exacto? Por favor revisa las capturas de pantalla y debajo de la fuente

UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil ); for (int i = 0; i < 10; i++) { CGRect f = [pdfView frame]; [pdfView setFrame: f]; UIGraphicsBeginPDFPage(); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(currentContext, 72, 72); // Translate for 1" margins [[[pdfView subviews] lastObject] setContentOffset:CGPointMake(0, 648 * i) animated:NO]; [pdfView.layer renderInContext:currentContext]; } UIGraphicsEndPDFContext();

y también he intentado este siguiente enlace, pero no pude agregar la subvista uiwebview para escribir el pdf. http://b2cloud.com.au/tutorial/drawing-over-a-pdf-in-ios-pdf-template/


Puedes probar esto. Funcionó para mí :)

https://github.com/iclems/iOS-htmltopdf/blob/master/NDHTMLtoPDF.h

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"]; self.PDFCreator = [NDHTMLtoPDF createPDFWithHTML:html pathForPDF:[path stringByExpandingTildeInPath] delegate:self pageSize:CGSizeMake(595,847) margins:UIEdgeInsetsMake(105, 0, 0, 0)];

Pase el webView como este


También he usado lo mismo, funciona bien Espero que esto sea útil para ti.

Crea un bloque: -
typedef void (^ PdfCompletion) (estado BOOL, NSString * filePath, NSArray * fbArr);

-(void)addData { [MBProgressHUD showHUDAddedTo:self.view animated:YES]; NSMutableDictionary *contactDict = [[NSMutableDictionary alloc] init]; [contactDict setObject:contactTextField.text forKey:@"phonenumber"]; [contactDict setObject:emailTextField.text forKey:@"emailid"]; [contactDict setObject:userNameLabel.text forKey:@"displayname"]; [self drawPdf:contactDict completion:^(BOOL status,NSString *filePath,NSArray *fbArr) { if (status) { NSMutableArray *arr; arr = [[NSMutableArray alloc] init]; NSData *filedata; filedata = [NSData dataWithContentsOfFile:filePath]; double locaTotalFileSize = filedata.length +498; totalFileSize += locaTotalFileSize; NSMutableDictionary *fileDict = [[NSMutableDictionary alloc] init]; [fileDict setObject:userPicImageView.image forKey:@"image"]; [fileDict setObject:filePath forKey:@"filePath"]; [fileDict setObject:@"txt" forKey:@"fileType"]; [fileDict setObject:[NSString stringWithFormat:@"%@_%@_%@",@"contact",[self getFbID],[self CurrentSystemTime]] forKey:@"fileName"]; [fileDict setObject:@"1" forKey:@"uploadStatus"]; [fileDict setObject:@"0 KB/0 KB" forKey:@"fileSizeStatus"]; [fileDict setObject:@"0 KB/0 KB" forKey:@"ContentSize"]; [arr addObject:fileDict]; [self switchToReviewFiles:arr]; //////NSLog(@"pdf convrt successfull"); } else { //////NSLog(@"Error to convert into pdf"); } }]; } // Then Call The DrawPDF Method::-- -(void)drawPdf:(NSMutableDictionary *)drawText completion:(PdfCompletion)callback { NSString* fileName = @"contact_card.txt"; NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [arrayPaths objectAtIndex:0]; NSString* txtFileName = [path stringByAppendingPathComponent:fileName]; NSData *data = [NSJSONSerialization dataWithJSONObject:drawText options:NSJSONWritingPrettyPrinted error:nil]; [data writeToFile:txtFileName atomically:YES]; callback(YES,txtFileName,nil); }


En realidad estás muy cerca con el código que tienes. Tengo la sensación de que su mayor problema es tomar un nuevo CGContextRef con cada iteración de bucle.

UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil ); CGContextRef currentContext = UIGraphicsGetCurrentContext();//movedByJef // default pdf.. // 8.5 X 11 inch // 612 x 792 for (int i = 0; i < 10; i++) { CGContextSaveGstate( currentContext ); //addedByJef CGRect f = [pdfView frame]; [pdfView setFrame: f]; // hmm what does this even do?? UIGraphicsBeginPDFPage(); CGContextTranslateCTM(currentContext, -72, -72); // Translate for 1" margins ///editedByJef, you had it backwards.. //assuming you want a 72pt margin on right and bottom as well.. //we want to reduce our size (612 x 792) by 72pts on all four sides.. CGSize printPageSize = CGSizeMake( (612.0 - (72.0 * 2.0)), (792.0 -(72.0*2.0)) ); CGSize layrSize = self.layer.bounds.size; //so we translate the context so our view fills it nicely.. CGFloat xScaler = layrSize.width / printPageSize.width; CGFloat yScaler = layrSize.height / printPageSize.height; CGContextConcatCTM(currentContext, CGAffineTransformMakeScale(xScaler, yScaler) ); [[[pdfView subviews] lastObject] setContentOffset:CGPointMake(0, 648 * i) animated:NO]; [pdfView.layer renderInContext:currentContext]; CGContextRestoreGstate(currentContext);//added by jef } UIGraphicsEndPDFContext();

déjame saber cómo te va con eso, sin duda habrá un poco de barajamiento en el orden de las transformaciones, tal vez una traducción necesaria en cualquier lado de la escala, pero esto te acercará mucho ...


Me parece que solo intentas agregar contenido a un PDF existente, ¿verdad?

- (void) drawCustomPDFContent { // Put your drawing calls here // Draw a red box [[UIColor redColor] set]; UIRectFill(CGRectMake(20, 20, 100, 100)); // Example of drawing your view into PDF, note that this will be a rasterized bitmap, including the text. // To get smoother text you''ll need to use the NSString draw methods CGContextRef ctx = UIGraphicsGetCurrentContext(); [view.layer renderInContext:ctx]; } - (void) createCustomPDF { NSURL* pdfURL = ... /* URL to pdf file */; CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); const size_t numberOfPages = CGPDFDocumentGetNumberOfPages(pdf); NSMutableData* data = [NSMutableData data]; UIGraphicsBeginPDFContextToData(data, CGRectZero, nil); for(size_t page = 1; page <= numberOfPages; page++) { // Get the current page and page frame CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdf, page); const CGRect pageFrame = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox); UIGraphicsBeginPDFPageWithInfo(pageFrame, nil); // Draw the page (flipped) CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSaveGState(ctx); CGContextScaleCTM(ctx, 1, -1); CGContextTranslateCTM(ctx, 0, -pageFrame.size.height); CGContextDrawPDFPage(ctx, pdfPage); CGContextRestoreGState(ctx); if(page == 1) { [self drawCustomPDFContent]; } } UIGraphicsEndPDFContext(); CGPDFDocumentRelease(pdf); pdf = nil; // Do something with data here [data writeToFile:... atomically:YES]; }

Partes referenciadas desde:

http://b2cloud.com.au/tutorial/drawing-over-a-pdf-in-ios-pdf-template/


Puede usar la siguiente categoría en UIView para crear un archivo PDF:

#import <QuartzCore/QuartzCore.h> @implementation UIView(PDFWritingAdditions) - (void)renderInPDFFile:(NSString*)path { CGRect mediaBox = self.bounds; CGContextRef ctx = CGPDFContextCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], &mediaBox, NULL); CGPDFContextBeginPage(ctx, NULL); CGContextScaleCTM(ctx, 1, -1); CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); [self.layer renderInContext:ctx]; CGPDFContextEndPage(ctx); CFRelease(ctx); } @end

Malas noticias: UIWebView no crea formas y textos agradables en el PDF, sino que se presenta como una imagen en el PDF.

O

¿Cómo convertir UIView a PDF dentro de iOS?

O

Creando archivo PDF desde UIWebView

Esto podría ayudarte :)