在iOS上的HTML到PDF转换?

我知道把UIWebView的截图,并将其转换为PDF,但我需要生成一个正确的PDF(文本为文本,而不是截图)。 Save2PDF是创build正确PDF的应用程序。 有人有一个想法,他们如何做到这一点?

我根据我发现的每一个好build议创build了一个class级。 我一直在挖掘很多东西,我希望我的课程能为任何想从某些HTML源代码直接创build多页PDF的人提供一些好的开始。

你会在这里find一些基本的示例代码: https : //github.com/iclems/iOS-htmltopdf

我和你有同样的问题,我的要求是: – 完整的PDF(真正的文本,没有位图) – 智能多页(与每X像素切割全高度的网页视图…)

因此,我使用的解决scheme是相当不错的,因为它采用了iOS用于分割页面以供打印的相同工具。

让我解释一下,我设置一个基于Web视图打印格式化(第一技巧)的UIPrintPageRenderer:

UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init]; [render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0]; CGRect printableRect = CGRectMake(self.pageMargins.left, self.pageMargins.top, self.pageSize.width - self.pageMargins.left - self.pageMargins.right, self.pageSize.height - self.pageMargins.top - self.pageMargins.bottom); CGRect paperRect = CGRectMake(0, 0, self.pageSize.width, self.pageSize.height); [render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"]; [render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"]; NSData *pdfData = [render printToPDF]; [pdfData writeToFile: self.PDFpath atomically: YES]; 

同时,我在UIPrintPageRenderer上创build了一个类别来支持:

 - (NSData*) printToPDF { NSMutableData *pdfData = [NSMutableData data]; UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil ); [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)]; CGRect bounds = UIGraphicsGetPDFContextBounds(); for ( int i = 0 ; i < self.numberOfPages ; i++ ) { UIGraphicsBeginPDFPage(); [self drawPageAtIndex: i inRect: bounds]; } UIGraphicsEndPDFContext(); return pdfData; } 

这个问题的整个问题是文本而不是截图

以下答案显示了如何在PDF容器中制作位图截图…

 #import <QuartzCore/CALayer.h> - (NSString *)pdfPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"tmp.pdf"]; return writableDBPath; } - (NSDictionary *)pdfContextDictionary { NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:@"JP Author", kCGPDFContextAuthor, @"My Cool App", kCGPDFContextCreator, @"This is the Output", kCGPDFContextTitle, nil]; return d; } - (void)printToPDF { NSString *path = [self pdfPath]; UIView *displayView = self.view; CGRect pageRect = displayView.bounds; if (UIGraphicsBeginPDFContextToFile(path, pageRect, [self pdfContextDictionary]) == NO) { return; // error } UIGraphicsBeginPDFPage(); CGContextRef context = UIGraphicsGetCurrentContext(); CALayer *layer = displayView.layer; [layer renderInContext:context]; UIGraphicsEndPDFContext(); NSLog(@"[%@ %@] %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), path); }