I am in middle of developing an iOS app and I want to export certain reports in PDF format. So I am using webView to generate report and print webView to pdf.
Here is my code:
var renderer : UIPrintPageRenderer!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
renderer = CustomPrintPageRenderer()
if let url = Bundle.main.url(forResource: "pdf", withExtension: "html", subdirectory: "web") {
let request = URLRequest(url: url);
webView.delegate = self;
webView.loadRequest(request);
}
}
func webViewDidFinishLoad(_ webView: UIWebView) {
var pages : [UIViewPrintFormatter] = []
var index = 0
for query in queryList {
var result = webView.stringByEvaluatingJavaScript(from: query)
if(!webView.isLoading) {
let printFormatter = webView.viewPrintFormatter()
pages.append(printFormatter)
}
}
for page in pages {
renderer.addPrintFormatter(page, startingAtPageAt: index)
index = index + 1
}
let pdfData = drawPDFUsingPrintPageRenderer(printPageRenderer: renderer)
pdfData?.write(toFile: "\(AppDelegate.getAppDelegate().getDocDir())/report.pdf", atomically: true)
}
func drawPDFUsingPrintPageRenderer(printPageRenderer: UIPrintPageRenderer) -> NSData! {
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, CGRect.zero, nil)
printPageRenderer.prepare(forDrawingPages: NSMakeRange(0, printPageRenderer.numberOfPages))
let bounds = UIGraphicsGetPDFContextBounds()
for i in 0...(printPageRenderer.numberOfPages - 1) {
UIGraphicsBeginPDFPage()
printPageRenderer.drawPage(at: i, in: bounds)
}
UIGraphicsEndPDFContext();
return data
}
Now problem is that, the generated PDF contains only last page printed multiple time (once for each page in pages which is not the expected behavior.