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(@"失败");
}
}