2016-05-15 38 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中以編程方式訪問該流程。

相關問題