在Swift 3中将字节数组转换为PDF

3
我尝试的是从API响应中获取字节数组响应,并将其保存到文件(PDF)中。
(服务器返回一个字节数组)
我使用Alamofire进行Web请求。
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中却无法实现这一点。非常感谢您提供任何帮助,请帮帮我。谢谢。

你可以查看这个链接:https://dev59.com/OHLYa4cB1Zd3GeqPaapm - ovo
@ovo 感谢您的支持,但这与 Swift 有关吗? - Sanoop Surendran
移除 NSKeyedArchiver 部分,直接调用 response.data.write(...) - Sulthan
@Sulthan 感谢您的支持,我知道如何在 Web 视图中打开文件,这方面没有问题,但是保存部分有些困难。 - Sanoop Surendran
NSKeyedArchiver 用于将符合 Coding 协议的对象编码/解码为设备上的 Data(类似于 Java 中的序列化)。它不用于解码从服务器发送的数据。服务器已经向您发送了原始 PDF 数据,您不必对其进行任何处理,只需将其保存到文件中即可。 - Sulthan
显示剩余3条评论
2个回答

2

对于未来的读者,这是我使用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)

1
使用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)
        }

感谢您的支持,这个答案还需要进一步解释吗? - Sanoop Surendran
谢谢,我会尝试并告诉你结果 :) - Sanoop Surendran
您可以查看 iFunBox 来显示文档目录下生成的文件。 - Fares Benhamouda
@FaresBenHamouda 怎样在应用程序中查看PDF文件? - Thripthi Haridas
Pdf reader。 这可能会有所帮助。 - Fares Benhamouda
@FaresBenHamouda 谢谢。 - Thripthi Haridas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接