Post

Replies

Boosts

Views

Activity

Generate a PDF from HTML template using WKWebview
Hello, We have functionality in an existing app, have to generate a pdf and it should be printable in the A4. The PDF is almost 8 to 10 pages I have applied below solution: Loading the HTML template on the WKwebview and doing a few operations on the content and converting it into a pdf. Converting the HTML into a string Replacing a few data with dynamic content Issue: The solutions worked fine in the previous OS(14.5,15.5,16.1), it is not working on the latest os 16.6 The Table background CSS is not Rendering. I have tried both Inline and external CSS loading but still facing the same issue. Approch1: func createPDF(formmatter: UIViewPrintFormatter, filename: String) -> String { let attributedString = NSAttributedString(string: "This is a test", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red]) let printFormatter = UISimpleTextPrintFormatter(attributedText: attributedString) let render = UIPrintPageRenderer() render.addPrintFormatter(printFormatter, startingAtPageAt: 0) // 2. Assign print formatter to UIPrintPageRenderer //let render = UIPrintPageRenderer() render.addPrintFormatter(formmatter, startingAtPageAt: 0) // 3. Assign paperRect and printableRect let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi let printable = page.insetBy(dx: 20, dy: 20) //let printable = page.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)); render.setValue(NSValue(cgRect: page), forKey: "paperRect") render.setValue(NSValue(cgRect: printable), forKey: "printableRect") // 4. Create PDF context and draw let pdfData = NSMutableData() UIGraphicsBeginPDFContextToData(pdfData, CGRect.zero, nil) for i in 1...render.numberOfPages { UIGraphicsBeginPDFPage(); let bounds = UIGraphicsGetPDFContextBounds() render.drawPage(at: i - 1, in: bounds) } UIGraphicsEndPDFContext(); // 5. Save PDF file var dst = self.getDestinationPath(1) if dst.contains("file://") { dst = dst.replacingOccurrences(of: "file://", with: "") } //let path = "\(NSTemporaryDirectory())\(filename).pdf" pdfData.write(toFile: dst, atomically: true) print("open \(dst)") return dst } } Approach2: But the pdf is Generating in a single page not multiple and it's not printable using the below solution. func createPDFMethod(webView: WKWebView, title:String="samplepdf"){ let pdfConfiguration = WKPDFConfiguration() /// Using `webView.scrollView.frame` allows us to capture the // entire page, not just the visible portion pdfConfiguration.rect = CGRect(x: 0, y: 0, width: webView.scrollView.contentSize.width, height: webView.scrollView.contentSize.height) webView.createPDF(configuration: pdfConfiguration) { result in switch result { case .success(let data): // Creates a path to the downloads directory DispatchQueue.main.async { let resourceDocPath = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL let pdfNameFromUrl = "\(title).pdf" let actualPath = resourceDocPath.appendingPathComponent(pdfNameFromUrl) do { try data.write(to: actualPath, options: .atomic) print("pdf successfully saved!") } catch { print("Pdf could not be saved") } } case .failure(let failure): print(failure.localizedDescription) } } } It seems the issue is with UIGraphics or WKwebview formaters. could you please help me to resolve this issue?
2
1
1.9k
Aug ’23