2016-05-15 215 views
0

我有一个PDF文件,并希望提取其所有文本。 我试过如下:如何从Swift中的PDF中获取所有文本?

import Quartz 

let url = NSBundle.mainBundle().URLForResource("test", withExtension: "pdf") 
let pdf = PDFDocument(URL: url) 
print(pdf.string()) 

它得到的文本,但是提取的完全混合了行的顺序相比,开放在Adobe,编辑全选,复制PDF,粘贴!

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

+0

找不到'pdf(pdf)实例的'string()'吗?它消失了吗? – Hemang

回答

2

这不幸是不可能的。
至少不是没有你的主要工作。对于所有pdf文件而言,这在一般情况下是不可能的。

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

提取文本是非平凡的,并且只适用于基本图像-PDF伴随文本(它不需要)的某些PDF文件。 PDF中出现的所有文本信息都与位置信息相结合,以确定要显示的位置。

如果你在左边的列中包含的条目和右行包含内容的名称的PDF所示的表格,这两个列都可以表示为只出现文本完全不同的块由于它们的位置彼此相邻,彼此之间有一些联系。

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

最后一点说明,因为它可能会引起混淆:Adobe和Apple当然也有可能已经做了一些这样的分组并且取得了很好的结果,但它仍然不够完美。通过Mac Preview提取文本后,我刚刚测试的PDF格式变得非常糟糕。

+0

那真不幸!你知道我怎样才能切出一部分PDF?它确实有专栏。然后,我可以切入部分,并再次尝试使用'pdf.string'。 –

+0

@CenTinel我不知道,不。但我知道你可以剪掉两边,并从中取出绳子。 'PDFDocument'文档中有很多功能,您可能需要通过该网站和Google阅读您所关注的有趣关键字。 – luk2302

+0

好吧,我设法使用PDF.pageAtIndex(x).selectionForRect(somerect)在PDF上做出选择矩形,但是这也完全混乱了:( –

2

如果你只想文本内容:

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

苹果的PDFDocument类文档中说,字符串是“的便捷方法,相当于整个文档创建一个选择对象,然后调用PDFSelection类的字符串方法“。

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

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

相关问题