【问题标题】:Convert byte array to PDF in swift 3在swift 3中将字节数组转换为PDF
【发布时间】:2017-06-26 07:24:19
【问题描述】:

我想做的是,从 api 响应中获取字节数组响应,并将其保存到文件 (PDF)。

(服务器返回一个字节数组)

我使用Alamofire 进行网络请求,

Alamofire.request("\(BaseUrl)api/mobile/downloadResume", headers : ProfileViewHeader)
        .response { response in
    print(response)
        // let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        // let filePath = "\(documentsPath)/readingfile.pdf"
        // let data:NSData = NSKeyedArchiver.archivedData(withRootObject: response.data) as NSData
        // let file = data.write(toFile: filePath, atomically: false)
}

我得到字节数组响应没有任何问题,

我的主要问题是如何将字节数组保存在文件中。我在 Android 中做了同样的事情,没有任何问题,但不能在 swift 中实现同样的效果,

我们将不胜感激任何形式的帮助。请帮帮我。

谢谢

【问题讨论】:

  • 你可以看看this
  • @ovo 感谢您的支持,但是和swift有关吗?
  • 删除NSKeyedArchiver 部分。直接拨打response.data.write(...)即可。
  • 要在 Web 视图中打开 PDF,您只需将 URL 获取到该文件,然后从该文件中获取 URLRequest 并加载它。
  • @Sulthan 感谢您的支持,我知道在网页视图中打开文件,这没有问题,但它是保存部分。

标签: ios arrays swift swift3


【解决方案1】:

对于未来的读者,这就是我使用 swiftyJson 的方法:

let documentDirectory = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

let fileURL = documentDirectory.appendingPathComponent("TEST2.pdf")

let bytes = json["Recibo"].arrayObject as! [UInt8]

let data = Data(bytes);
data.write(to: fileURL, options: .atomic)

【讨论】:

    【解决方案2】:

    使用 Alamofire,结果是内部数据。您可以这样做以保存在文档目录下的文件中。

       override func viewDidAppear(_ animated: Bool) {
    
    
        Alamofire.request("LINK", headers : nil)
        .response { response in
            print(response.data ?? "")
    
    
            self.createPDF(pdfData: response.data!)
        }
    }
    
    
    func createPDF( pdfData : Data) {
        let render = UIPrintPageRenderer()
    
        let html = "<b>Hello <i>World!</i></b> <p>Generate PDF file from HTML in Swift</p>"
        let fmt = UIMarkupTextPrintFormatter(markupText: html)
    
        render.addPrintFormatter(fmt, 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: 0, dy: 0)
    
        render.setValue(NSValue(cgRect: page), forKey: "paperRect")
        render.setValue(NSValue(cgRect: printable), forKey: "printableRect")
    
        // 4. Create PDF context and draw
        //let pointzero = CGPoint(x: 0,y :0)
        let rect = CGRect.zero
    
    
        let data = NSMutableData(base64Encoded: pdfData.base64EncodedData(), options: NSData.Base64DecodingOptions.ignoreUnknownCharacters);
    
        UIGraphicsBeginPDFContextToData(data!, rect, nil)
    
    
        for i in 1...render.numberOfPages {
    
            UIGraphicsBeginPDFPage();
            let bounds = UIGraphicsGetPDFContextBounds()
            render.drawPage(at: i - 1, in: bounds)
        }
    
        UIGraphicsEndPDFContext();
    
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    
        // 5. Save PDF file
        do {
            let fileURL = try documentsPath.asURL().appendingPathComponent("file.pdf")
           try pdfData.write(to: fileURL, options: .atomic)
    
        } catch {
    
        }
    
    
        print("saved success")
    }
    

    createPDF 函数将获取您的字节数组并基于该数组生成一个新的 pdf 文件。 另一种通用的方法就是像从服务器一样保存它

             let documentDirectory = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    
            // Save to a file
            let fileURL = documentDirectory.appendingPathComponent("file.pdf")
    
    
            do {
                try  response.data?.base64EncodedData().write(to: fileURL, options: .atomic)
            } catch {
                print(error)
            }
    

    【讨论】:

    • 感谢您的支持,对此答案有什么进一步的解释吗?
    • 谢谢,我会试试这个并告诉你:)
    • 您可以检查[ifunbbox] (i-funbox.com) 以显示文档目录下生成的文件。
    • @FaresBenHamouda 如何在应用中查看 pdf?
    • Pdf reader。这可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多