ios - 如何在 Swift 4 中通过 html 以 pdf 格式写入图像

标签 ios swift

如何在 Swift 4 中通过 html 将图像写入 pdf?

func createPDF(html: String, formmatter: UIViewPrintFormatter, filename: String) -> String
{
    let fmt = UIMarkupTextPrintFormatter(markupText: sampleHTML)

    // 2. Assign print formatter to UIPrintPageRenderer

    let render = UIPrintPageRenderer()
    render.addPrintFormatter(fmt, startingAtPageAt: 0)
    render.drawPrintFormatter(formmatter, forPageAt: 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: 0, dy: 0)

    render.setValue(NSValue(cgRect: page), forKey: "paperRect")
    render.setValue(NSValue(cgRect: printable), forKey: "printableRect")

    // 4. Create PDF context and draw

    UIGraphicsBeginPDFContextToData(pdfData, CGRect.zero, nil)
    UIGraphicsBeginImageContext(CGSize.zero)
    for i in 1...render.numberOfPages
    {
        UIGraphicsBeginPDFPage();

        let bounds = UIGraphicsGetPDFContextBounds()
        render.drawPage(at: i - 1, in: bounds)
    }

    UIGraphicsEndPDFContext();

    // 5. Save PDF file

    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
     print(documentsPath)

    if pdfData.write(toFile: "\(documentsPath)/file.pdf", atomically: true)
    {
        pdfFilePath = "\(documentsPath)/file.pdf"
        var URL = NSURL(fileURLWithPath: pdfFilePath!)
        storedPdfFileData = try! Data(contentsOf:URL as URL)
        fileName = URL.lastPathComponent
        print("FileName\(fileName!)")
        self.UserDefaultForfileName.setValue(self.fileName, forKey: "FILE")
    }
    else
    {
        print("choose how to handle error here")

    }
    return pdfFilePath!
}

最佳答案

如果我们理解正确的话,我们可以从您的评论中看到两种不同的需求

1) 你想将 html 页面保存为 pdf。

2) 您想从图像(UIImage 列表)创建 pdf。

对于第一种方法:-

您应该使用 WKWebView 在您的 viewController 中显示 html 页面。 (要了解如何使用WKWebView,您可以从Stackoverflow搜索帮助。)在viewControler中,您可以为“printWebPagetoPDF”功能设置Button click事件。功能如下。

func printWebPagetoPDF( theHeight:CGFloat = 0 ) {
    var isHeightFound = true
    let deviceW = UIScreen.main.bounds.size.width
    let deviceH = UIScreen.main.bounds.size.height
    let width = min(deviceW, deviceH)
    var height = theHeight
    if height <= 0 {
        height = max(deviceW, deviceH)
        isHeightFound = false
    }

    let fileParentPath = "<absolute path to save pdf file>" + "/"

    let inDateTimeFormatter = DateFormatter()
    inDateTimeFormatter.dateFormat = "yyyyMMddHHmm"

    let dateTimeFileString = "test\(inDateTimeFormatter.string(from: Date()))"
    let pdfFileName =  dateTimeFileString + ".pdf"
    let sharePdfFilePath = fileParentPath + pdfFileName

    // - 1 - Grab the webView's print context
    let fmt = myWKWebView.viewPrintFormatter()

    fmt.perPageContentInsets = UIEdgeInsetsMake(10, 10, 10, 10) //Page margins

    // - 2 - Assign print formatter to UIPrintPageRenderer
    let render = UIPrintPageRenderer()
    render.addPrintFormatter(fmt, startingAtPageAt: 0)

    // - 3 - Assign paperRect and printableRect
    let page = CGRect(x: 0, y: 0, width: width, height: height)    //width: 841.85, height: 595.22) //Page size
    let printable = page.insetBy(dx: 0, dy: 0)

    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, page, nil)
    print( render.numberOfPages )
    render.prepare(forDrawingPages: NSMakeRange(0, render.numberOfPages-1))
    for i in 0..<render.numberOfPages {
        UIGraphicsBeginPDFPage()
        render.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
    }

    UIGraphicsEndPDFContext()

    // - 5 - Save the PDF file
    let path = sharePdfFilePath
    pdfData.write(toFile: path, atomically: true)

}

对于第二种方法:-

您可以尝试使用以下代码从图像创建 pdf。我没有正确测试它,但你可以自己试试。 mySelectedArray 是要添加到 pdf 中的图像索引序列。 dataArray 是 UIImage 的数组。 swift 文件开始时需要“import PDFKit”。

 // The url to save the data to
 let pdfFileName = "<some path>" + "/" + "test.pdf"
 let url = URL(fileURLWithPath: pdfFileName)

 if #available(iOS 11.0, *) {
       // Create an empty PDF document
       let pdfDocument = PDFDocument()
       pdfDocument.delegate = self

       for index in mySelectedArray {
            // Load or create your UIImage
            let image = dataArray[index].image

            // Create a PDF page instance from your image
            let pdfPage = PDFPage(image: image)

            // Insert the PDF page into your document
            pdfDocument.insert(pdfPage!, at: 0)
       }
       // Get the raw data of your PDF document
       let data = pdfDocument.dataRepresentation()

       // Save the data to the url
       try! data!.write(to: url)
 }

如果可能,请清楚地发表评论,以获得进一步的帮助。

关于ios - 如何在 Swift 4 中通过 html 以 pdf 格式写入图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53832891/

相关文章:

ios - UISplitViewController - 用作滑出式菜单

ios - 如何以编程方式将样式应用于所有 View

ios - HealthKit HKQuery 自创建日期起

ios - 如何在 UIAlertController 中更改 UIAlertAction 的字体大小和颜色

ios - 将 Storyboard 中的 UISwipeGuesture 连接到 TableView Controller

ios - Uint8 不可转换为 Int(节省游戏最佳时间)

ios - 解析本地数据存储+网络同步

ios - 应用升级后SKStoreReviewController提示限制

ios - 核心图形中三角函数定义的梯度

ios - 在 MapKit 中用 segue 替换 pushViewController