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

Cen*_*nel 3 pdf parsing quartz-core swift

我有一个 PDF 文档,想提取其中的所有文本。我尝试了以下方法:

import Quartz

let url = NSBundle.mainBundle().URLForResource("test", withExtension: "pdf")
let pdf = PDFDocument(URL: url)
print(pdf.string())
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

我做到了。有了这个:

if let pdf = PDFDocument(url: url) {
    let pageCount = pdf.pageCount
    let documentContent = NSMutableAttributedString()

    for i in 1 ..< pageCount {
        guard let page = pdf.page(at: i) else { continue }
        guard let pageContent = page.attributedString else { continue }
        documentContent.append(pageContent)
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。


www*_*com 5

如果您只想要文本内容:

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


luk*_*302 4

不幸的是这是不可能的。
至少在你没有做一些重大工作的情况下是这样。对于所有 pdf 文件来说,这当然是不可能的。

PDF(通常)是一条单行道。
创建它们的目的是在每个系统上以相同的方式显示文本,没有任何差异,并且打印机可以打印文档而无需打印机知道所有字体和内容。

提取文本并非易事,仅适用于某些 PDF,其中基本 image-pdf 附有文本(并非必须如此)。PDF 中存在的所有文本信息都与位置信息相结合,以确定其显示位置。

如果 PDF 中显示一个表格,其中左列包含条目名称,右行包含其内容,那么这两列都可以表示为完全不同的文本块,它们之间似乎只有一些链接由于它们的位置彼此相邻。

框架/您的代码必须做的是确定视觉上链接的文本的哪些部分也在逻辑上链接并且属于在一起。这(目前)还不可能。你我之所以能够阅读、理解和分组PDF,是因为在某些领域我们的大脑仍然比计算机好得多。

最后一点,因为这可能会引起混乱:当然,Adobe 和 Apple 也可能已经做了一些这样的分组并取得了良好的结果,但它仍然不完美。我刚刚测试的 PDF 在通过 Mac 预览提取文本后非常混乱。