VNDocumentCameraScan в PDF с возможностью поиска

#ios #swift #ios-pdfkit #visionkit

#iOS #swift #ios-pdfkit #visionkit

Вопрос:

В настоящее время я пытаюсь создать файл с возможностью поиска PDFDocument после того, как я получил VNDocumentCameraScan с помощью VNDocumentCameraViewController .

В настоящее время я беру только изображения сканирования и помещаю их в PDFDocument экземпляр.

 
func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
   let pdf = createPDF(from: scan)
} 

fileprivate func createPDF(from scan: VNDocumentCameraScan) -> PDFDocument {
    let pdfDocument = PDFDocument()
    for i in 0 ..< scan.pageCount {
        let pdfPage = PDFPage(image: scan.imageOfPage(at: i))
            pdfDocument.insert(pdfPage!, at: i)
        }
    return pdfDocument
}
  

Я также знаю, как бы я извлек текст из VNDocumentCameraScan . Чего мне не хватает, так это того, как я включаю текстовую информацию в PDFDocument экземпляр. Мне это нужно, потому что я хочу сканировать документы, сохранять их как .pdf в файловой системе и выполнять поиск в них впоследствии.

Я много искал, но не нашел способа сделать это.

Кто-нибудь знает, как я мог бы это сделать?

Ответ №1:

В этом сообщении в блоге подробно рассматривается тема. Я ссылаюсь на часть 3 серии, поскольку в ней рассматривается часть процесса, на которой вы застряли.

https://alexanderweiss.dev/blog/2021-03-29-from-uiimage-to-searchable-pdf-part-3

Основная идея заключается в том, чтобы нарисовать распознанный текст под изображением в вашем PDF. Основные шаги из статьи:

  1. Возьмите изображение
  2. Распознать текст на изображении
  3. Создайте страницу PDF с размерами изображения
  4. Используйте распознанный текст для рисования текста
  5. Нарисуйте изображение над текстом в PDF

VNRecognizedText содержит информацию о местоположении распознанного текста, которая позволяет определить, где рисовать текст. Я смог успешно использовать код из этого поста в своем приложении; хотя он не на 100% идеален при работе с рукописным текстом, он работает достаточно хорошо.

Комментарии:

1. Как вы справляетесь с блокировкой в основном потоке. Я не мог понять, как запустить его из основной очереди, потому что нет асинхронного кода…