11
func drawOnPDF(path: String)
{
    // Get existing Pdf reference
    let pdf = CGPDFDocumentCreateWithURL(NSURL(fileURLWithPath: path))

    // Get page count of pdf, so we can loop through pages and draw them accordingly
    let pageCount = CGPDFDocumentGetNumberOfPages(pdf);

    // Write to file
    UIGraphicsBeginPDFContextToFile(path, CGRectZero, nil)

    // Write to data
//        var data = NSMutableData()
//        UIGraphicsBeginPDFContextToData(data, CGRectZero, nil)

    for index in 1...pageCount {
        let page = CGPDFDocumentGetPage(pdf, index)
        let pageFrame = CGPDFPageGetBoxRect(page, kCGPDFMediaBox)

        UIGraphicsBeginPDFPageWithInfo(pageFrame, nil)

        var ctx = UIGraphicsGetCurrentContext()

        // Draw existing page
        CGContextSaveGState(ctx);
        CGContextScaleCTM(ctx, 1, -1);
        CGContextTranslateCTM(ctx, 0, -pageFrame.size.height);
        CGContextDrawPDFPage(ctx, page);
        CGContextRestoreGState(ctx);

        // Draw image on top of page
        var image = UIImage(named: "signature3")
        image?.drawInRect(CGRectMake(100, 100, 100, 100))
        // Draw red box on top of page
        //UIColor.redColor().set()
        //UIRectFill(CGRectMake(20, 20, 100, 100));
    }

    UIGraphicsEndPDFContext()
}

My problem is PDF convert to image but how to open image in View then swipe left,right,up and down how to possible

Vivek Sehrawat
  • 6,560
  • 2
  • 26
  • 39
Bhargav
  • 237
  • 1
  • 3
  • 10

5 Answers5

13

Swift 3:

func convertPDFPageToImage(page:Int) {

    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let filePath = documentsURL.appendingPathComponent("pathLocation").path

    do {

        let pdfdata = try NSData(contentsOfFile: filePath, options: NSData.ReadingOptions.init(rawValue: 0))

        let pdfData = pdfdata as CFData
        let provider:CGDataProvider = CGDataProvider(data: pdfData)!
        let pdfDoc:CGPDFDocument = CGPDFDocument(provider)!
        pageCount = pdfDoc.numberOfPages;
        let pdfPage:CGPDFPage = pdfDoc.page(at: page)!
        var pageRect:CGRect = pdfPage.getBoxRect(.mediaBox)
        pageRect.size = CGSize(width:pageRect.size.width, height:pageRect.size.height)

        print("\(pageRect.width) by \(pageRect.height)")

        UIGraphicsBeginImageContext(pageRect.size)
        let context:CGContext = UIGraphicsGetCurrentContext()!
        context.saveGState()
        context.translateBy(x: 0.0, y: pageRect.size.height)
        context.scaleBy(x: 1.0, y: -1.0)
        context.concatenate(pdfPage.getDrawingTransform(.mediaBox, rect: pageRect, rotate: 0, preserveAspectRatio: true))
        context.drawPDFPage(pdfPage)
        context.restoreGState()
        let pdfImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()            

        self.imageView.image = pdfImage

    }
    catch {

    }

}
Blain Ellis
  • 289
  • 3
  • 3
  • hi Blain . i try to run your code but do {} block not executing.do you know why? – Subin K Kuriakose Sep 14 '17 at 07:05
  • 3
    you can find a similar answer on https://www.hackingwithswift.com/example-code/core-graphics/how-to-render-a-pdf-to-an-image (it's a better reusable function with URL as input and UIImage as return) – Samuël Feb 15 '19 at 11:13
6

I Got the Solution for Pdf page convert in UIImage. This code PDF Page convert in Uiimage and save in image document directory. PDF Download And Page Count to separate Page vise image convert.

    func drawOnPDF(path: String)
    {
        var urlstr: NSURL = NSURL.fileURLWithPath(path)!
        var pdf: CGPDFDocumentRef = CGPDFDocumentCreateWithURL(urlstr)
        var page: CGPDFPageRef;
        var frame: CGRect = CGRectMake(0, 0, 100, 200)
        var pageCount: Int = CGPDFDocumentGetNumberOfPages(pdf);
        for (var i = 0; i < pageCount; i++)
        {
            var mypage: CGPDFPageRef = CGPDFDocumentGetPage(pdf, i+1)
            frame = CGPDFPageGetBoxRect(mypage, kCGPDFMediaBox)
            UIGraphicsBeginImageContext(CGSizeMake(600, 600*(frame.size.height/frame.size.width)))
            var ctx: CGContextRef = UIGraphicsGetCurrentContext()
            CGContextSaveGState(ctx)
            CGContextTranslateCTM(ctx, 0.0, frame.size.height)
            CGContextScaleCTM(ctx, 1.0, -1.0)
            CGContextSetGrayFillColor(ctx, 1.0, 1.0)
            CGContextFillRect(ctx, frame)
            page = CGPDFDocumentGetPage(pdf, i + 1)
            var pdfTransform: CGAffineTransform = CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, frame, 0, true)
            CGContextConcatCTM(ctx, pdfTransform);
            CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh)
            CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault)
            CGContextDrawPDFPage(ctx, page)
            var thumbnailImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
            CGContextRestoreGState(ctx)
            var documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as! String 
            documentsPath = documentsPath.stringByAppendingFormat("/Page%d.png", i+1)
            UIGraphicsEndImageContext()
            imagedata = UIImagePNGRepresentation(thumbnailImage)
            imagedata.writeToFile(documentsPath, atomically: true)
            array.addObject(documentsPath)
        }
        let dirPath = array.objectAtIndex(0) as? String
        let image    = UIImage(contentsOfFile: dirPath!)
        NSUserDefaults.standardUserDefaults().setObject(array, forKey: "Array")
        println("\(array)")
    }
Bhargav
  • 237
  • 1
  • 3
  • 10
4

All these solution converts a single pdf page into an UIImage. Here is my findings for converting multiple page pdf into a single image

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

        var width: CGFloat = 0
        var height: CGFloat = 0
        
        // calculating overall page size
        for index in 1...document.numberOfPages {
            print("index: \(index)")
            if let page = document.page(at: index) {
                let pageRect = page.getBoxRect(.mediaBox)
                width = max(width, pageRect.width)
                height = height + pageRect.height
            }
        }

        // now creating the image
        let renderer = UIGraphicsImageRenderer(size: CGSize(width: width, height: height))

        let image = renderer.image { (ctx) in
            ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
            for index in 1...document.numberOfPages {
                
                if let page = document.page(at: index) {
                    let pageRect = page.getBoxRect(.mediaBox)
                    ctx.cgContext.translateBy(x: 0.0, y: -pageRect.height)
                    ctx.cgContext.drawPDFPage(page)
                }
            }
            
            ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
        }
        return image
    }
Ratul Sharker
  • 7,484
  • 4
  • 35
  • 44
3

I have found a cool solution. Borrowed from here: https://www.hackingwithswift.com/example-code/core-graphics/how-to-render-a-pdf-to-an-image

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
}
1

Using PDFKit:

1)Get the pdf path

2)Access the pdf page which you want to convert to an image:

let pdfPage = PDFDocument(url: pdfPath)?.page(at: 0)

3)Get pdf page size:

let pageSize = pdfPage.bounds(for: .mediaBox).size

3)Convert the page to an image using the thumbnail function:

let pdfImage = pdfPage?.thumbnail(of: pageSize, for: .mediaBox)
Raj Kiran
  • 152
  • 1
  • 9