2017-05-11 116 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