Я пытаюсь экспортировать PDF-файл, созданный с использованием html. PDF-файл отображается с использованием WKWebView
. Я могу сохранить свой PDF-файл, используя UIActivityViewController
, однако у меня возникли проблемы с удалением пробелов вокруг него. Можно ли экспортировать только контент, который находится в синей области?
func exportAsPdfFromWebView() -> String {
let pdfData = createPdfFile(printFormatter: self.webView.viewPrintFormatter())
return self.saveWebViewPdf(data: pdfData)
}
func createPdfFile(printFormatter: UIViewPrintFormatter) -> NSMutableData {
let originalBounds = self.webView.bounds
self.webView.bounds = CGRect(x: originalBounds.origin.x,
y: webView.bounds.origin.y,
width: self.webView.bounds.size.width,
height: self.webView.scrollView.contentSize.height)
let pdfPageFrame = CGRect(x: 0, y: 0, width: self.webView.bounds.size.width,
height: self.webView.scrollView.contentSize.height)
let printPageRenderer = UIPrintPageRenderer()
printPageRenderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)
printPageRenderer.setValue(NSValue(cgRect: UIScreen.main.bounds), forKey: "paperRect")
printPageRenderer.setValue(NSValue(cgRect: pdfPageFrame), forKey: "printableRect")
self.webView.bounds = originalBounds
return printPageRenderer.generatePdfData()
}
func saveWebViewPdf(data: NSMutableData) -> String {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let docDirectoryPath = paths[0]
let pdfPath = docDirectoryPath.appendingPathComponent("export.pdf")
if data.write(to: pdfPath, atomically: true) {
return pdfPath.path
} else {
return ""
}
}
}
extension UIPrintPageRenderer {
func generatePdfData() -> NSMutableData {
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, nil)
self.prepare(forDrawingPages: NSMakeRange(0, self.numberOfPages))
let printRect = UIGraphicsGetPDFContextBounds()
for pdfPage in 0..<self.numberOfPages {
UIGraphicsBeginPDFPage()
self.drawPage(at: pdfPage, in: printRect)
}
UIGraphicsEndPDFContext();
return pdfData
}
}