2017-05-11 115 views
0

我想创建一个使用swift的iOS应用程序,它可以让用户拍照或从他们的画廊中选择一张图片,并将其转换为他们可以保存的pdf文件他们的电话。我的代码目前可用于打开相机或图库并选择图像,但我无法将其转换为pdf。 任何提示将非常感激,谢谢!将uiimageview转换为pdf - Swift

CameraViewController类

import UIKit 

class CameraViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate 
{ 

    @IBOutlet weak var myImg: UIImageView! 

    @IBAction func takePhoto(_ sender: AnyObject) { 
     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) { 
      let imagePicker = UIImagePickerController() 
      imagePicker.delegate = self 
      imagePicker.sourceType = UIImagePickerControllerSourceType.camera 
      imagePicker.allowsEditing = false 
      self.present(imagePicker, animated: true, completion: nil) 
     } 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      myImg.contentMode = .scaleToFill 
      myImg.image = pickedImage 
     } 
     picker.dismiss(animated: true, completion: nil) 
    } 

    @IBAction func savePhoto(_ sender: AnyObject) { 
     let imageData = UIImagePNGRepresentation(myImg.image!) 
     let compressedImage = UIImage(data: imageData!) 
     UIImageWriteToSavedPhotosAlbum(compressedImage!, nil, nil, nil) 

     let alert = UIAlertController(title: "Saved", message: "Your image has been saved", preferredStyle: .alert) 
     let okAction = UIAlertAction(title: "Ok", style: .default, handler: nil) 
     alert.addAction(okAction) 
     self.present(alert, animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

GalleryViewController类

import UIKit 

class GalleryViewController: UIViewController { 

    @IBOutlet weak var myImg: UIImageView! 

    @IBAction func pickPhoto(_ sender: Any) { 
     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) { 
      let imagePicker = UIImagePickerController() 
      imagePicker.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate 
      imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary 
      imagePicker.allowsEditing = true 
      self.present(imagePicker, animated: true, completion: nil) 
     } 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      myImg.contentMode = .scaleToFill 
      myImg.image = pickedImage 
     } 
     picker.dismiss(animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

回答

2

回答Upda ted:

由于Apple在iOS 11.0中引入了PDFKit,因此您可以使用下面的代码将uiimage转换为pdf,我只尝试下面的osx,但它应该在iOS上以相同的方式工作。

// Create an empty PDF document 
let pdfDocument = PDFDocument() 

// Load or create your UIImage 
let image = UIImage(....) 

// 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() 

// The url to save the data to 
let url = URL(fileURLWithPath: "/Path/To/Your/PDF") 

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

=========================================== =====

其实有很多类似的问题和足够好的答案。让我试着再次回答这个问题。

基本生成PDF与iOS中的绘图类似。

  1. 创建PDF上下文并将其推送到图形堆栈上。
  2. 创建一个页面。
  3. 使用UIKit或Core Graphics例程来绘制页面的内容。
  4. 如有需要,添加链接。
  5. 根据需要重复步骤2,3和4。
  6. 结束PDF上下文以从图形堆栈中弹出上下文,并根据创建上下文的方式将结果数据写入指定的PDF文件或将其存储到指定的NSMutableData对象中。

所以最简单的方法是这样的:

func createPDF(image: UIImage) -> NSData? { 

    let pdfData = NSMutableData() 
    let pdfConsumer = CGDataConsumer(data: pdfData as CFMutableData)! 

    var mediaBox = CGRect.init(x: 0, y: 0, width: image.size.width, height: image.size.height) 

    let pdfContext = CGContext(consumer: pdfConsumer, mediaBox: &mediaBox, nil)! 

    pdfContext.beginPage(mediaBox: &mediaBox) 
    pdfContext.draw(image.cgImage!, in: mediaBox) 
    pdfContext.endPage() 

    return pdfData 
} 

创建所有的NSData为PDF文件,然后我们需要将数据保存到文件:

let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
let docURL = documentDirectory.appendingPathComponent("myFileName.pdf") 

try createPDF(image: someUIImageFile)?.write(to: docURL, atomically: true) 

了解更多:Generating PDF Content