2016-05-15 4 views
0

У меня есть документ в формате PDF и вы можете извлечь весь текст. Я попробовал следующее:Как я могу получить весь текст из PDF в Swift?

import Quartz 

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

Это действительно получает текст, однако порядок строк извлекаемых полностью перепутаны по сравнению с открытием PDF в Adobe, Edit Select All, Копировать, Вставить!

Как я могу получить тот же результат в Swift, как открытие PDF, Выбрать все, Копировать/Вставить !?

+0

Не удалось найти 'string()' для 'pdf' экземпляра? Не прошло? – Hemang

ответ

2

Это, к сожалению, невозможно.
По крайней мере, не без какой-либо важной работы с вашей стороны. И это, конечно же, невозможно в общем для всех PDF-файлов.

PDF-файлы (как правило) улицы с односторонним движением.
Они были созданы для отображения текста одинаково в каждой системе без каких-либо различий, а для принтеров печатать документ без необходимости знать все шрифты и прочее.

Извлечение текста является нетривиальным и возможно только для некоторых PDF-файлов, где основное изображение-pdf сопровождается текстом (который ему не нужно). Вся текстовая информация, представленная в PDF, связана с информацией о местоположении, чтобы определить, где она должна отображаться.

Если у вас есть таблица, показанная в PDF, где в левом столбце указаны имена записей, а правая строка содержит его содержимое, обе эти столбцы могут быть представлены как совершенно разные блоки текста, которые отображаются только имеют некоторую связь друг с другом из-за их размещения рядом друг с другом.

Что должно сделать каркас/ваш код, так это определить, какие части текста, которые визуально связаны, также логически связаны и принадлежат друг другу. Это еще не возможно. Причина, по которой вы и я можем читать, понимать и группировать PDF, - это то, что в некоторых областях наш мозг по-прежнему намного лучше, чем компьютеры.

Заключительное примечание, потому что это может вызвать путаницу: возможно, что Adobe и Apple также выполняют некоторые из этих группировок и добиваются хорошего результата, но это все еще не идеально. PDF, который я только что протестировал, был довольно искажен после извлечения текста через Mac Preview.

+0

Это несчастливо! Вы знаете, как я могу вырезать раздел PDF? У него есть столбцы. Затем я мог нарезать разделы и снова попытаться использовать «pdf.string». –

+0

@CenTinel Я этого не знаю, нет. Но я знаю, что вы можете вырезать стороны и взять строку только от этого. В документах «PDFDocument» есть много функциональных возможностей, вы можете прочитать этот сайт и google для интересующих вас ключевых слов. – luk2302

+0

Ок, мне удалось сделать прямоугольники выбора через PDF, используя pdf.pageAtIndex (x) .selectionForRect (somerect), но это также полностью перепутано :( –

2

Если вы хотите только содержание текста:

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

документация Apple, для класса PDFDocument говорит, что строка «удобный метод, что эквивалентно созданию объекта выбора для всего документа, а затем, вызывая класс PDFSelection'S строковый метод ".

Таким образом, вы должны получить те же результаты, что и его копирование и вставка в Preview.

Adobe Acrobat может использовать некоторую другую процедуру для создания более логически полезного потока, но вы не можете получить доступ к программному обеспечению в MacOS.

Смежные вопросы