2013-08-01 15 views
0
将HTML转换为PDF

我使用下面的代码的HTML转换为PDF格式(如张贴cwehrung在各种各样的地方)与iOS上

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类别支持:

-(NSData*) printToPDF 
{ 
    [self doNotRasterizeSubviews:self.view]; 

    NSMutableData *pdfData = [NSMutableData data]; 

    UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, 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; 
} 

我遇到的问题是图像和文本之间的对齐。

我将HTML文件上传到here,很容易在转换后的PDF文件中看到问题,我上传到here。 (见第三本书和第六本书)

任何帮助将不胜感激!

+0

的Theres心不是一个差的太多....我想这是很好 – IronManGill

+0

你可以改变框架pdf。 – user2545330

+0

in UIGraphicsBeginPDFContextToData 尝试设置边界 根据Apple Documents:bound - 一个指定PDF页面的默认大小和位置的矩形。 (此值用作每个新页面的默认媒体框。)矩形的原点通常应为(0,0)。指定空矩形(CGRectZero)将默认页面大小设置为8.5×11英寸(612×792点)。 尝试将CGRectZero更改为另一个值.. :) – iProgrammer

回答

1

我们可以HTML转换成PDF在UIWebView的另一way-

中打开HTML和代码是 -

-(void)display 
{ 
webViewHeight = [[self.printWebView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] integerValue]; 

CGRect screenRect = self.printWebView.frame; 

double currentWebViewHeight = webViewHeight; 


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *imageCacheDirPath = [documentsDirectory stringByAppendingPathComponent:@"pdfImages"]; 
if (![[NSFileManager defaultManager] fileExistsAtPath: imageCacheDirPath]) 
{ 
    [[NSFileManager defaultManager] createDirectoryAtPath:imageCacheDirPath withIntermediateDirectories:NO attributes:nil error:NULL]; 
} 
else 
{ 
    NSError *error; 
    [[NSFileManager defaultManager] removeItemAtPath: imageCacheDirPath error: &error]; 
    [[NSFileManager defaultManager] createDirectoryAtPath:imageCacheDirPath withIntermediateDirectories:NO attributes:nil error:NULL]; 
} 

while (currentWebViewHeight > 0) 
{ 
    imageName ++; 
    UIGraphicsBeginImageContext(screenRect.size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [[UIColor blackColor] set]; 
    CGContextFillRect(ctx, screenRect); 
    [self.printWebView.layer renderInContext:ctx]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSString *pngPath = [imageCacheDirPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png",imageName]]; 
    if(currentWebViewHeight < 440) 
    { 
     CGRect lastImageRect = CGRectMake(0,440-currentWebViewHeight, self.printWebView.frame.size.width, currentWebViewHeight); 
     CGImageRef lastImageRef = CGImageCreateWithImageInRect([newImage CGImage], lastImageRect); 
     newImage = [UIImage imageWithCGImage:lastImageRef]; 
     CGImageRelease(lastImageRef); 
    } 
    [UIImagePNGRepresentation(newImage) writeToFile:pngPath atomically:YES]; 
    [self.printWebView stringByEvaluatingJavaScriptFromString:@"window.scrollBy(0,440);"]; 
    currentWebViewHeight -= 440; 
} 
[self drawPdf]; 
} 

- (void) drawPdf 
{ 
CGSize pageSize = CGSizeMake(612, webViewHeight); 
NSString *fileName = @"Demo.pdf"; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *imageCacheDirPath = [documentsDirectory stringByAppendingPathComponent:@"pdfImages"]; 

NSString *pdfFileName = [imageCacheDirPath stringByAppendingPathComponent:fileName]; 
NSLog(@"file path:%@",pdfFileName); 

UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil); 

// Mark the beginning of a new page. 
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); 

double currentHeight = 0.0; 
for (int index = 1; index <= imageName ; index++) 
{ 
    NSString *pngPath = [imageCacheDirPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png", index]]; 
    UIImage *pngImage = [UIImage imageWithContentsOfFile:pngPath]; 

    [pngImage drawInRect:CGRectMake(0, currentHeight, pageSize.width, pngImage.size.height)]; 
    currentHeight += pngImage.size.height; 
} 
UIGraphicsEndPDFContext(); 
} 
+0

这很好,除非你真的希望PDF不是一堆图像。在这种情况下,它是无用的。要制作可搜索的PDF(例如,将文本视为文本并将图像视为图像),您不能将其渲染为图像。 – Bergasms

+0

好的检查http://stackoverflow.com/questions/5817840/print-paper-size-and-content-inset/5988357#5988357可能会帮助 – RMRAHUL

+0

可搜索PDF可能是我的方式去,所以代码不会做工作对我来说......但是投你一票为你的努力。 – Joshua