如何从Swift中获取PDF中的所有文本?

时间:2016-05-15 16:27:37

标签: swift parsing pdf quartz-core

我有一份PDF文档,想要提取所有文本。 我尝试了以下方法:

{{1}}

它确实获得了文本,但是与在Adobe中打开PDF,编辑全选,复制,粘贴相比,提取的行的顺序完全混淆了!

如何在Swift中获得相同的结果,如打开PDF,全选,复制/粘贴!?

5 个答案:

答案 0 :(得分:3)

遗憾的是,这是不可能的 至少在没有你做一些重要工作的情况下。对于所有pdf来说,这在一般情况下肯定是不可能的。

PDF(通常)是单行道 创建它们是为了在每个系统上以相同的方式显示文本而没有任何区别,并且打印机可以打印文档,而打印机不必知道所有字体和内容。

提取文本非常重要,只有基本图像-pdf附带文本(不必使用)的某些PDF才有可能。 PDF中存在的所有文本信息都与位置信息相结合,以确定它的显示位置。

如果PDF中有一个表,其中左列包含条目的名称,右行包含其内容,则这两列都可以表示为完全不同的文本块,只有出现< / em>由于它们彼此相邻放置而在彼此之间存在一些链接。

框架/您的代码必须做的是确定视觉链接的文本的哪些部分也在逻辑上链接并且属于一起。那是不可能的。你和我可以阅读,理解和分组PDF的原因是,在某些领域,我们的大脑仍远远优于计算机。

最后的注意事项,因为它可能会引起混淆:Adobe和Apple当然也可以做一些这样的分组并取得好成绩,但它仍然不完美。通过Mac预览提取文本后,我刚刚测试过的PDF文件非常糟糕。

答案 1 :(得分:3)

如果您只想要文字内容:

  extension String
{
    func readPDF() -> String
    {
        let path = "\(self)"
        let url = URL(fileURLWithPath: path)
        let pdf = PDFDocument(url: url)
        return pdf!.string!
    }
}

答案 2 :(得分:3)

我做到了。与此:

top: 0

希望有帮助。

答案 3 :(得分:0)

Apple的PDFDocument类文档说,字符串是&#34;一种方便的方法,相当于为整个文档创建一个选择对象,然后调用PDFSelection类的字符串方法。&#34 ;

因此,您应该在预览中使用它作为复制和粘贴获得相同的结果。

Adob​​e的Acrobat可能会使用其他一些例程来创建更具逻辑功能的流程,但您无法在MacOS中以编程方式访问它。

答案 4 :(得分:0)

以下是使用PDFKit的选项:

import Cocoa
import Quartz

func pdfToText(fromPDF: String) -> String {
    let urlPath = Bundle.main.url(forResource: fromPDF, withExtension: "pdf")
    let docContent = NSMutableAttributedString()
    if let pdf = PDFDocument(url: urlPath!) {
        let pageCount = pdf.pageCount

        for i in 1 ..< pageCount {
            guard let page = pdf.page(at: i) else { continue }
            guard let pageContent = page.attributedString else { continue }
            docContent.append(pageContent)
        }
    }

    return docContent.string
}

let pdfString = pdfToText(fromPDF: "documentName")

这使您可以选择获取PDF内容作为属性字符串。如果您只是在纯文本后面,则可以像在上面的示例中那样将.string附加到结果上来获取它。

cf。 Paul Hudson's snippet