Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PDF Parsing with SWIFT

Tags:

parsing

pdf

swift

I want to parse a PDF that has no images, only text. I'm trying to find pieces of text. For example to search the string "Name:" and be able to read the characters after ":".

I'm already able to open a PDF, get the number of pages, and to loop on them. The problem is when I want to use functions like CGPDFDictionaryGetStream or CGPDFStreamCopyData, because they use pointers. I have not found much info on the internet for swift programmers.

Maybe the easiest way would be to parse all the content to an NSString. Then I could do the rest.

Here my code:

// Get existing Pdf reference
let pdf = CGPDFDocumentCreateWithURL(NSURL(fileURLWithPath: path))
let pageCount = CGPDFDocumentGetNumberOfPages(pdf);
for index in 1...pageCount {
    let myPage = CGPDFDocumentGetPage(pdf, index)
    //Search somehow the string "Name:" to get whats written next
}
like image 310
Jose Antonio Avatar asked Oct 14 '15 22:10

Jose Antonio


1 Answers

You can use PDFKit to do this. It is part of the Quartz framework and is available on both iOS and MacOS. It is also pretty fast, I was able to search through a PDF with over 15000 characters in just 0.07s.

Here is an example:

import Quartz

let pdf = PDFDocument(url: URL(fileURLWithPath: "/Users/...some path.../test.pdf"))

guard let contents = pdf?.string else {
    print("could not get string from pdf: \(String(describing: pdf))")
    exit(1)
}

let footNote = contents.components(separatedBy: "FOOT NOTE: ")[1] // get all the text after the first foot note

print(footNote.components(separatedBy: "\n")[0]) // print the first line of that text

// Output: "The operating system being written in C resulted in a more portable software."

You can also still access most of (if not all of) the properties you had before. Such as pdf.pageCount for the number of pages, and pdf.page(at: <Int>) to get a specific page.

like image 162
zoecarver Avatar answered Oct 01 '22 10:10

zoecarver