Поиск в PDF на iPhone
Через два дня, пытаясь прочитать аннотации из PDF с использованием Quartz, мне удалось это сделать, и разместил мой код.
Теперь я хотел бы сделать то же самое для другого часто задаваемого вопроса: поиск PDF-документов с помощью Quartz. В той же ситуации, что и раньше, этот вопрос задавался много раз практически без практических ответов. Поэтому сначала мне нужны некоторые указатели, поскольку я все еще не реализовал это сам.
Что я пробовал:
Я попытался использовать CGPDFScannerScan
для обработки операторов TJ
и TJ
- возвращает правильный текст в каком-то PDF файле, тогда как в других документах он возвращает в основном случайные буквы. Возможно, это связано с кодировкой текста?
Кто-то указал, что текстовые блоки (отмеченные операторами BT/ET) должны обрабатываться вместо этого, но мне все еще не удалось это сделать. Любому удалось извлечь текст из любого PDF?
После этого поиск должен быть простым, сохраняя весь текст в NSMutableString
и используя rangeOfString
(если есть лучший способ, сообщите мне).
Но тогда как выделить результат? Я знаю, что есть несколько операторов, чтобы найти размеры глифов, поэтому я мог рассчитать результирующий прямоугольник, основанный на этих значениях, но я читал спецификацию в течение нескольких часов... это раздутый беспорядок, и я схожу с ума. Кто-нибудь с практическим объяснением?
Update
Пользователь Naveen Thunga нашел PDFKitten, "рамки для извлечения данных из PDF файлов в iOS". Я просто попробовал демонстрацию и, похоже, работал как рекламируемый. Я проведу его с большим количеством PDF файлов и опубликую результаты в ближайшее время. В качестве побочного примечания, код кажется мне очень хорошим - если вас интересует, как этот материал работает, это довольно удивительно.
Ответы
Ответ 1
Это непростая задача для реализации, но это просто.
Для любой данной страницы вам нужно отсканировать страницу с помощью API-интерфейса CGPDF. Вам необходимо зарегистрировать обратные вызовы для операторов PDF, которые влияют на текст на странице - не только TJ/Tj, но также и те, которые устанавливают шрифт, влияют на матрицу рисования текста и т.д. Вам нужно создать конечный автомат, который обновляется с каждым встреченным тегом + параметры. Вам нужно изучить текстовую отчетность для текущей кодировки шрифтов. Когда вы найдете текст, который хотите выделить, вам нужно будет изучить текущую матрицу рисования текста, которую вы обновляете, чтобы определить координаты чертежа. Прочитайте спецификацию PDF (версия 1.7 загружается из Adobe), чтобы понять, к какому оператору нужно обращать внимание.
Кодирование шрифтов, пожалуй, самая сложная часть, так как существует несколько способов кодирования, и некоторые из них являются собственностью шрифта. В основном вы можете обманывать и возвращаться к подмножеству кодировки ANSI - но это WILL ломает некоторые PDF файлы, имеющие странные шрифты.
По существу, вы обрабатываете страницу так, как если бы вы ее отображали.
Ответ 2
Я создал в objective-c с помощью PDF.js
Это позволит отображать, а также искать файл PDF.
Класс полезности позволяет осуществлять поиск с использованием опций Highlight all search result
и "case sensitive".
Посмотрите PDF-поиск в действии Ссылка