#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. Основные шаги из статьи:
- Возьмите изображение
- Распознать текст на изображении
- Создайте страницу PDF с размерами изображения
- Используйте распознанный текст для рисования текста
- Нарисуйте изображение над текстом в PDF
VNRecognizedText содержит информацию о местоположении распознанного текста, которая позволяет определить, где рисовать текст. Я смог успешно использовать код из этого поста в своем приложении; хотя он не на 100% идеален при работе с рукописным текстом, он работает достаточно хорошо.
Комментарии:
1. Как вы справляетесь с блокировкой в основном потоке. Я не мог понять, как запустить его из основной очереди, потому что нет асинхронного кода…