Поиск PDF на iPhone
После двух дней попыток прочитать аннотации из PDF-файла с помощью Quartz мне удалось это сделать и опубликовать свой код.
Теперь я хотел бы сделать то же самое для другого часто задаваемого вопроса: поиск документов PDF с помощью Quartz. Та же ситуация, что и раньше, этот вопрос задавался много раз, практически без практических ответов. Поэтому сначала мне нужно несколько указателей, так как я до сих пор не реализовал это сам.
Что я пробовал:
Я пытался с помощью CGPDFScannerScan
обработка TJ
а также Tj
Операторы - возвращает правильный текст в некоторых PDF, тогда как в других документах он возвращает в основном случайные буквы. Может быть, это связано с кодировкой текста? Кто-то указал, что текстовые блоки (отмеченные операторами BT/ET) должны обрабатываться вместо этого, но мне все еще не удалось это сделать. Кому-нибудь удалось извлечь текст из любого PDF?
После этого поиск должен быть легким, сохраняя весь текст в NSMutableString
и используя rangeOfString
(если есть лучший способ, пожалуйста, дайте мне знать).
Но тогда как выделить результат? Я знаю, что есть несколько операторов, чтобы найти размеры глифов, так что я мог вычислить результирующий прямоугольник на основе этих значений, но я часами читал спецификацию... это раздутый беспорядок, и я схожу с ума. Кто-нибудь с практическим объяснением?
Обновить
Пользователь Naveen Thunga нашел PDFKitten, "фреймворк для извлечения данных из PDF-файлов в iOS". Я только что попробовал демоверсию, и она, кажется, работает как рекламируется. Я протестирую его с большим количеством PDF-файлов и скоро опубликую результаты. В качестве примечания, код кажется мне очень хорошим - если вам интересно, как это работает, это довольно здорово.
3 ответа
Это не простая проблема для реализации, но она проста.
Для любой данной страницы вам необходимо отсканировать страницу, используя API сканера CGPDF. Вам необходимо зарегистрировать обратные вызовы для операторов PDF, которые влияют на текст на странице - не только на TJ/Tj, но и на те, которые задают шрифт, влияют на матрицу рисования текста и т. Д. Вам необходимо создать конечный автомат, который обновляется с каждым встреченным тегом + параметры. Вам необходимо проверить учет текста для кодировки текущего шрифта. Когда вы найдете текст, который хотите выделить, вам нужно изучить текущую текстовую матрицу рисования, которую вы обновляли, чтобы определить координаты чертежа. Прочитайте спецификацию PDF (версию 1.7 можно загрузить из Adobe), чтобы понять, на каких операторов вам следует обратить внимание.
Кодирование шрифтов, пожалуй, самая сложная часть, поскольку существует несколько способов кодирования, и некоторые из них являются собственностью шрифта. В основном вы можете обмануть и использовать подмножество кодировки ANSI, но это БУДЕТ сломаться на некоторых PDF-файлах, имеющих странные шрифты.
По сути, вы обрабатываете страницу так, как будто вы ее визуализируете.
Я создал служебный класс в target-c, используя PDF.js
Что позволит отображать, а также искать PDF-файл.
Утилита класса позволяет искать с помощью Highlight all search result
и варианты с учетом регистра.
посмотреть PDF поиск в действии Ссылка
Так что теперь в 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
}