Convert File(txt, pdf) to an image in iOS Swift

Krishna kushwaha
2 min readApr 8, 2021

I am trying to create a dynamic image from text or text files as well.

Hopefully you aware about UIGraphicsBeginImageContext so im using to drawing image from files like text or pdf etc.

First upload files from your phone files so i am handles to upload all file in same documentation
imports this in top -

import MobileCoreServices
import UniformTypeIdentifiers
import SystemConfiguration.CaptiveNetwork

you can add this function in viewdidload or your button action

func openFile() {
let docPicker = UIDocumentPickerViewController(documentTypes: [String(kUTTypeText),String(kUTTypeContent),String(kUTTypeItem),String(kUTTypeData), String(kUTTypePNG),String(kUTTypeJPEG)], in: .open)

docPicker.delegate = self
self.present(docPicker, animated: true, completion: nil)
}

Almost you done, now create documentDelegate

extension ViewController: UIDocumentPickerDelegate{
var imagePDF: UIImage!

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
print(urls)

guard let myURL = urls.first else {
return
}
print(myURL.pathExtension)
if myURL.pathExtension == "txt" || myURL.pathExtension == "TXT"{
myURL.startAccessingSecurityScopedResource()
do {
let readString = try String(contentsOf: myURL)
imagePDF = imageWith(name: readString)
// if you wanna show image in your view controller then uncomment blow these line
let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "IMGViewController") as? IMGViewController
vc?.imagePDF = imageWith(name: readString)
self.navigationController?.pushViewController(vc!, animated: true)

} catch let error as NSError {
print("failed to read file")
print(error)
}
} else {
imagePDF = drawPDFfromURL(url: urls.first!)

let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "IMGViewController") as? IMGViewController
vc?.imagePDF = drawPDFfromURL(url: urls.first!)
self.navigationController?.pushViewController(vc!, animated: true)
}
}
func imageWith(name: String?) -> UIImage? {
// let frame = CGRect(x: 10, y: 10, width: view.frame.width, height: view.frame.height)

let nameLabel = UILabel()
nameLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width)

nameLabel.numberOfLines = 0
// nameLabel.textAlignment = .center
// nameLabel.backgroundColor = .lightGray
// nameLabel.textColor = .white
// nameLabel.font = UIFont.boldSystemFont(ofSize: 40)
nameLabel.font = UIFont(name: "Menlo", size: 11)

nameLabel.text = name
print(nameLabel.maxNumberOfLines)
print(nameLabel.numberOfVisibleLines)
if nameLabel.maxNumberOfLines < 30 {
nameLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width*2)
} else if nameLabel.maxNumberOfLines < 50 {
nameLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width*3)
} else if nameLabel.maxNumberOfLines < 80 {
nameLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width*4)
} else if nameLabel.maxNumberOfLines < 100 {
nameLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width*5)
} else if nameLabel.maxNumberOfLines < 125 {
nameLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width*6)
}else {
nameLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width*7)

}


UIGraphicsBeginImageContext(nameLabel.frame.size)
if let currentContext = UIGraphicsGetCurrentContext() {
nameLabel.layer.render(in: currentContext)
let nameImage = UIGraphicsGetImageFromCurrentImageContext()
return nameImage
}
return nil
}



func drawPDFfromURL(url: URL) -> UIImage? {
guard let document = CGPDFDocument(url as CFURL) else { return nil }
guard let page = document.page(at: 1) else { return nil }

let pageRect = page.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
let img = renderer.image { ctx in
UIColor.white.set()
ctx.fill(pageRect)

ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
ctx.cgContext.scaleBy(x: 1.0, y: -1.0)

ctx.cgContext.drawPDFPage(page)
}

return img
}
}

You can check small, medium and large file to image as well.
hope this is helpful to you, sometime server is taking to load for convert files so batter we can convert in frontend only.

please check here full code

please comment if you have any doubt

Thanks for reading….

https://www.linkedin.com/in/krishna-kushwaha/

--

--