2016-01-26 57 views
1

我有一個項目,我正在使用Xcode7Swift 2。我有一個ViewController,允許用戶用他們的設備相機拍照。然後它將拍攝的照片加載到UIImageView中,他們可以將照片郵寄給PDF用戶拍攝的照片不能轉換爲PDF使用斯威夫特2

拍照時,我有一個UIBarButtonItem用的Action代碼:

@IBAction func takeScan(sender: UIBarButtonItem) { 

    var image = UIImagePickerController() 
    image.delegate = self 
    image.sourceType = UIImagePickerControllerSourceType.Camera 
    image.allowsEditing = false 
    self.presentViewController(image, animated: true, completion: nil) 

} 

我也有什麼用之後的圖像發生代碼:

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 

    // Dismiss imagePickerController 

    self.dismissViewControllerAnimated(true, completion: nil) 

    // Set the View Controller image to taken photo 
    scannedPhoto.image = image 

} 

我有一個UIButton將該照片作爲PDF附件發送。它提示用戶爲PDF鍵入文件名,並存儲該名稱的variable

let nameText = nameSaveAlert.textFields![0] 

// AUTO CAPITALIZE Input Alert Text 
// Create a String 
var textConvert = "" 

// Set string to inputed text from user 
textConvert = nameText.text! 

// Creat NSString that takes the above string and capitalizes it 
let capsWord: NSString = textConvert.capitalizedString 

// Assign the capitalized name to variable for use 
let pdfFileName = capsWord as String 

// Convert image to data to be saved using JPG data and 90% 
let imageData = UIImageJPEGRepresentation(self.scannedRecipe.image!, 0.9) 

// PDF Work 
let pdfWidth = self.scannedPhoto.bounds.width 

let pdfHeight = self.scannedPhoto.bounds.height 

let pdfData = imageData as! NSMutableData 
UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: 0, y: 0, width: pdfWidth, height: pdfHeight), nil) 

let context = UIGraphicsGetCurrentContext() 

UIGraphicsBeginPDFPage() 
self.view.layer.renderInContext(context!) 

UIGraphicsEndPDFContext() 

它然後打開郵件應用程序,並創建與PDF作爲附件的電子郵件。我可以發送它。問題是,它似乎在拍攝UIImage尺寸的屏幕截圖,並將該圖像保存爲PDF,而不是拍攝用戶拍攝的實際圖像。爲什麼?我是Swift新手,特別是Swift 2,所以請和我一起裸照。我的目標是讓用戶拍下照片並將其轉換爲PDF並作爲附件寄出。謝謝。

更新: 我改變了我的代碼看起來像這樣的PDF部分作爲建議:

 let pdfWidth = self.scannedPhoto.bounds.width 

     let pdfHeight = self.scannedPhoto.bounds.height 

     let pdfData = imageData as! NSMutableData 
     UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: 0, y: 0, width: pdfWidth, height: pdfHeight), nil) 

     let context = UIGraphicsGetCurrentContext() 

     // Convert scannedPhoto to a type UIImage 
     var imageConvert = self. scannedPhoto.image! as UIImage 

     UIGraphicsBeginPDFPage() 

     UIGraphicsPushContext(context!) 
     imageConvert.drawAtPoint(CGPointZero) 
     UIGraphicsPopContext() 

     UIGraphicsEndPDFContext() 

新的問題是,在圖像的我只是一個小左上角現在爲PDF 。我如何得到整個畫面?我認爲設置widthheight變量基於UIImage會做到這一點。

回答

2

這應該真的是評論,但無論如何。是不是UIGraphicsBeginPDFContextToData()函數意味着接受一個NSMutableData對象,它將成爲渲染PDF的輸出?此外,渲染層是不是一個好主意,我會建議使用這樣的渲染圖像:

UIGraphicsPushContext(context) 
yourUIImage.drawAtPoint(CGPointZero) 
UIGraphicsPopContext() 

在你的代碼,您所請求的視圖的層被抽,我假設不只是包含圖像。如果您將代碼中的self.view.layer.renderInContext(context!)部分替換爲上面的代碼片段,則上面的代碼片段會要求將圖像繪製在您的PDF上下文中。

看看apple documentation

編輯

所以我創建了一個小測試項目,看看我是否能得到的東西爲自己工作。我會告訴你代碼,然後顯示你出錯的幾點。

if let image: UIImage = self.scannedPhoto.image, // 1. 
    let imageData = UIImageJPEGRepresentation(image, 0.9) { 
    let pdfSize = image.size // 2. 
    let pdfData = NSMutableData(capacity: imageData.length)! // 3. 

    UIGraphicsBeginPDFContextToData(pdfData, CGRect(origin: CGPoint(), size: pdfSize), nil) 
    let context = UIGraphicsGetCurrentContext()! 
    UIGraphicsBeginPDFPage() 

    // required so the UIImage can render into our context 
    UIGraphicsPushContext(context) 
    image.drawAtPoint(CGPoint()) 
    UIGraphicsPopContext() 

    UIGraphicsEndPDFContext() 

    // now pdfData contains the rendered image. 
} 
  1. 你沒有真的去錯在這裏,我會親自使用一個可選的綁定。檢查this out。使用它的好處是你可以向用戶報告錯誤,而不是讓你的應用程序崩潰。
  2. 這將解決您的尺寸問題。在你的代碼中,你使用了self.scannedPhoto.bounds,這將返回UIImageView的大小。在視網膜屏幕上,這實際上可能是原始圖像大小的兩倍,這可能會導致您的尺寸問題。通過UIImage的實際尺寸也不會對我造成任何問題。

  3. 您需要爲要記錄的PDF操作創建一些內存.的文檔聲明這是輸出參數。我告訴NSMutableData給它現有圖像數據的容量,但實際上,PDF上下文的大小可能會有所不同。您的代碼存在的問題是您用PDF數據覆蓋了imageData - 這可能會或可能不會。

+0

我用你的建議更新了我的代碼。現在我只能拍攝照片的小角落,如PDF。 – ChallengerGuy

+0

@ChallengerGuy查看我更新的帖子。你的代碼中有一些不幸的情況,我認爲這會導致你的問題。 – Mrwerdo

+0

你說的話很有道理。我做了一些調整,但它完美運作。 PDF的文件大小在2.3MB的情況下也比我最初做的小部分照片上的7.8MB的PDF要好。我非常感謝你的幫助。謝謝。 – ChallengerGuy