XZ_iOS 之将WKWebView转成PDF然后再生成图片保存到相册

web页中有个'下载'按钮,需求想让点击'下载'的时候把图片下载到相册,查看web页发现,需要保存到相册的内容是PDF,不是图片,因为这个web页面是银行的,不是我们自己的,而且没法直接拿到这个PDF的下载地址进行文件下载;

想着就先把web页内容转换成PDF,然后把PDF文件转成图片保存到相册中,以下是实现的代码:

1、将WKWebView转成PDF

import UIKit

class PDFRender: UIPrintPageRenderer {
    // A4纸大小 595*842
    let pageFrame:CGRect = CGRect(x: 0.0, y: 0.0, width: 595.2, height: 841.8) 
    
    override init() {
        super.init()
        
        // 设置打印纸的尺寸大小
        self.setValue(pageFrame, forKey: "paperRect")
        // 设置内容区域大小
        self.setValue(pageFrame, forKey: "printableRect")
    }
    /// 绘制PDF并生成NSData
    func drawPDF() -> NSData! {
        
        let data:NSMutableData = NSMutableData()
        // 小心!第二个参数如果设置为CGRect.zero,PDF尺寸就会是默认的 612*792
        UIGraphicsBeginPDFContextToData(data, pageFrame, nil)
        self.prepare(forDrawingPages: NSRange.init(location: 0, length: self.numberOfPages))
        
        let bounds:CGRect = pageFrame
        for i in 0..<self.numberOfPages{
            UIGraphicsBeginPDFPage()
            self.drawPage(at: i, in: bounds)
        }
        UIGraphicsEndPDFContext()
        return data
    }
}

// 调用方法
private func PDFRenderToImage() {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5, execute: {
            // 创建打印渲染
            let printPageRenderer: PDFRender = PDFRender()
            // 获取渲染格式
            let viewFormatter: UIViewPrintFormatter = self.webView.viewPrintFormatter()
            // 设置渲染格式
            printPageRenderer.addPrintFormatter(viewFormatter, startingAtPageAt: 0)
            // 将HTML渲染为PDF
            let pdfData: NSData = printPageRenderer.drawPDF()
            // 输出文件
            let pdfFilename: String = "\(NSHomeDirectory())/Documents/test\(NSDate()).pdf"
            // 保存
            pdfData.write(toFile: pdfFilename, atomically: true)
            //                // 获取文件的保存位置
            //                let url = URL.init(fileURLWithPath: pdfFilename)
            print("-------文件的保存位置", pdfFilename)
            let handler = XZPDFToImage()
            handler.getUIImage(fromPDFPage: 1, filePath: pdfFilename) { (isSuccess) in
                
                self.hiddenAnimation()
                
                if isSuccess {
                    self.showMessage(msg: "保存成功!")
                }else {
                    self.showMessage(msg: "保存失败!")
                }
            }
        })
        
    }

2、PDF转图片保存到相册

.h
typedef void(^saveCompletion)(BOOL isSuccess);
@property (copy, nonatomic) saveCompletion saveCompletion;
/// 将web页转换成html
- (void)getUIImageFromPDFPage: (int)page_number filePath: (NSString*)pdfPath completion: (saveCompletion)completion;

.m
- (void)getUIImageFromPDFPage: (int)page_number filePath:(NSString*)pdfPath completion: (saveCompletion) completion {
    self.saveCompletion = completion;
    NSURL *filePath = [NSURL fileURLWithPath: pdfPath];
    //读取PDF原文件的大小
    CGPDFDocumentRef doc = CGPDFDocumentCreateWithURL((__bridge CFURLRef)filePath);
    CGPDFPageRef page =CGPDFDocumentGetPage(doc,1);
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    pageRect.origin = CGPointZero;
    pageRect.size.height = pageRect.size.height*2;
    pageRect.size.width = pageRect.size.width*2;
    //开启图片绘制 上下文
    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    // 设置白色背景
    CGContextSetRGBFillColor(context,1.0,1.0,1.0,1.0);
    CGContextFillRect(context,pageRect);
    CGContextSaveGState(context);
    // 进行翻转
    CGContextTranslateCTM(context, -pageRect.size.width/2, pageRect.size.height*1.5);
    CGContextScaleCTM(context,2, -2);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
    CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, pageRect,0,true));
    CGContextDrawPDFPage(context,page);
    CGContextRestoreGState(context);
    UIImage *pdfImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self saveImage:pdfImage];
}

- (void)saveImage:(UIImage*)image { UIImageWriteToSavedPhotosAlbum(image,self,@selector(image:didFinishSavingWithError:contextInfo:), (__bridge void*)self);
}

- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo {
    if(!error) {
        if (self.saveCompletion) {
            self.saveCompletion(YES);
        }
    }else{
        if (self.saveCompletion) {
            self.saveCompletion(NO);
        }
        NSLog(@"失败");
    }
}

猜你喜欢

转载自blog.csdn.net/understand_XZ/article/details/107854712
今日推荐