【问题标题】:PDF Parsing with SWIFT使用 SWIFT 解析 PDF
【发布时间】:2015-10-14 22:50:00
【问题描述】:

我想解析一个没有图像,只有文本的 PDF。我正在尝试查找文本。例如搜索字符串“Name:”并能够读取“:”后面的字符。

我已经能够打开 PDF、获取页数并循环播放它们。问题是当我想使用像CGPDFDictionaryGetStreamCGPDFStreamCopyData 这样的函数时,因为它们使用指针。我没有在互联网上为 swift 程序员找到太多信息。

也许最简单的方法是将所有内容解析为 NSString。然后我就可以做剩下的了。

这是我的代码:

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

【问题讨论】:

  • 我会为遇到同样问题的人更新自己的更多信息。目前很少有信息可供 swift 程序员使用。一方面,我建议阅读 pdf 内容是如何写入 pdf 文件中的。在 www.adobe.com 上搜索“PDF 规范”。另一方面,我们可以在这里找到一些关于如何使用 C# 解析 PDF 文件的信息:developer.apple.com/library/mac/documentation/GraphicsImaging/…>
  • 你知道这个收藏吗:也许你可以在那里找到一些东西:ipdfdev.com/2013/03/13/…
  • 嗨@JoseAntonio,你已经很久没有问这个问题了。您能找到任何更新吗?

标签: swift parsing pdf


【解决方案1】:

您可以使用PDFKit 来执行此操作。它是Quartz 框架的一部分,可在iOS 和MacOS 上使用。它也非常快,我能够在 0.07 秒内搜索超过 15000 个字符的 PDF。

这是一个例子:

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."

您仍然可以访问您之前拥有的大部分(如果不是全部)属性。如pdf.pageCount为页数,pdf.page(at: <Int>)获取具体页数。

【讨论】:

    【解决方案2】:

    这是一项相当密集的任务。像 PDFKitten 这样的库不再维护。这是我所做的 PDFKitten 到 swift 的一个端口,对字符串搜索/内容索引的完成方式进行了一些修改,以及对 truetype 字体的支持。

    https://github.com/SimpleApp/PDFParser

    [免责声明:库作者]

    [第二个免责声明:这个库是 100% 开源的。图书馆与公司无关,它不是广告,甚至不是产品,我发布此评论是为了帮助人们,然后可能会围绕它发展一个社区,因为这是一个非常普遍的要求,没有任何免费的作品足够好]

    编辑:这是一项非常密集的任务(更不用说所有字符编码问题)的原因是 PDF 格式没有“文本行”甚至“单词”的概念。它只有字符打印指令。这意味着如果你想找到一个“单词”,你必须使用字体信息重新计算每个字符块的框架,并找到可以合并成一个单词的那些。

    这就是为什么您不会找到很多库提供此类功能的原因,甚至一些大型项目有时也无法提供正确的复制/粘贴或文本搜索功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      相关资源
      最近更新 更多