目标c中从uiwebview生成PDF的问题

我已经在uiwebview中打开pdf文件,在uiwebview子视图中添加图像和文本。然后我尝试创buildPDF文件。 下面我用来生成pdf文件的示例。 在单页中写多页。 我如何写样本质量和确切的大小。 请检查屏幕截图和源代码 在这里输入图像说明

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(); 

而且我也尝试了下面这个链接,但是我不能添加uiwebview子视图来写pdf。 http://b2cloud.com.au/tutorial/drawing-over-a-pdf-in-ios-pdf-template/

它看起来像你只是想添加内容到现有的PDF,对不对?

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

部件参考:

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

您可以在UIView上使用以下类别来创build一个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 

坏消息:UIWebView不会在PDF中创build漂亮的形状和文本,而是将自身渲染为PDF中的图像。

要么

如何将iOS中的UIView转换为PDF?

要么

从UIWebView创buildPDF文件

这可能会帮助你:)

我也用同样的工作好希望这会对你有所帮助。

创build一个块: –
typedef void(^ PdfCompletion)(BOOL status,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); } 

你可以试试这个,它对我有用:)

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

像这样传递webView

你实际上非常接近你的代码。 我有一个感觉,你最大的问题是抓住一个新的CGContextRef与每个循环迭代..

 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(); 

让我知道你是如何去做的,毫无疑问,按照变换的顺序会有一些变化,也许翻译需要翻译,但是这会让你真的很接近..