Поиск PDF на iPhone - PullRequest
       24

Поиск PDF на iPhone

23 голосов
/ 04 ноября 2010

После двух дней попыток прочитать аннотации из PDF-файла с помощью Quartz мне удалось это сделать, и опубликовал мой код .

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

То, что я пробовал:

Я пытался использовать CGPDFScannerScan для обработки операторов TJ и Tj - возвращает правильный текст в некоторых PDF, тогда как в другихдокументы он возвращает в основном случайные буквы. Может быть, это связано с кодировкой текста? Кто-то указал , что вместо этого должны обрабатываться текстовые блоки (отмеченные операторами BT / ET), но мне все еще не удалось это сделать.Кому-нибудь удалось извлечь текст из любого PDF-файла?

После этого поиск должен быть легким путем сохранения всего текста в NSMutableString и использования rangeOfString (если есть лучший способ, пожалуйста, дайте мне знать).

Но тогда как выделить результат ?Я знаю, что есть несколько операторов, чтобы найти размеры глифов, так что я мог вычислить результирующий прямоугольник на основе этих значений, но я часами читал спецификации ... это раздутый беспорядок, и я схожу с ума.Кто-нибудь с практическим объяснением?

Обновление

Пользователь Naveen Thunga обнаружил PDFKitten , "фреймворк для извлечения данных из PDF-файлов в iOS".Я только что попробовал демоверсию, и она, кажется, работает как рекламируется.Я протестирую его с большим количеством PDF-файлов и скоро опубликую результаты.В качестве примечания, код кажется мне очень хорошим - если вас интересует, как это работает, это довольно здорово.

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

Это не простая задача для реализации, но она проста.

Для любой данной страницы вам необходимо отсканировать страницу, используя API сканера CGPDF.Вам необходимо зарегистрировать обратные вызовы для операторов PDF, которые влияют на текст на странице - не только на TJ / Tj, но и на те, которые устанавливают шрифт, влияют на матрицу рисования текста и т. Д. Вам необходимо создать конечный автомат, который обновляется с каждым встреченным тегом +параметры.Вам необходимо проверить учет текста для кодировки текущего шрифта.Когда вы найдете текст, который хотите выделить, вам нужно изучить текущую текстовую матрицу рисования, которую вы обновляли, чтобы определить координаты чертежа.Прочитайте спецификацию PDF (версию 1.7 можно загрузить из Adobe), чтобы понять, на каких операторов вам следует обратить внимание.

Шифрование, пожалуй, самая сложная часть, поскольку существует несколько способов кодирования, инекоторые из них являются собственностью шрифта.В основном вы можете обмануть и использовать подмножество кодировки ANSI - но это БУДЕТ нарушено для некоторых PDF-файлов, имеющих странные шрифты.

По сути, вы обрабатываете страницу, как если бы вы ее визуализировали.

3 голосов
/ 15 октября 2015

Я создал служебный класс в target-c, используя PDF.js

, что позволит отображать и искать PDF-файл.

Класс утилит позволяет осуществлять поиск с использованием параметров Highlight all search result и «с учетом регистра».

посмотреть PDF-поиск в действии Ссылка

1 голос
/ 03 октября 2018

Так что теперь в iOS 11 у нас есть PDFKit , с которым поиск текста является легким

if #available(iOS 11.0, *) {
     let pdfDocument = PDFDocument(url: fileUrl)!
     let allText = pdfDocument.string /// Gets all text in pdf separated by /n

     let s: PDFSelection = pdfDocument.findString("Hello", withOptions: [])
     let sWithFormatting = s!.first!.attributedString
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...