Распознавание текста из PDF-файла
Чтобы распознать текст из PDF-файла, вы можете использовать OCR API. OCR API — это обновленный и переработанный интерфейс, который предоставляет больше возможностей, в т.ч. распознавание многоколоночного текста.
Перед началом работы
Чтобы воспользоваться примерами, установите cURL
Получите данные вашего аккаунта для аутентификации:
-
Получите IAM-токен для аккаунта на Яндексе или федеративного аккаунта.
-
Получите идентификатор каталога, на который у вашего аккаунта есть роль
ai.vision.user
или выше. -
При обращении к Vision OCR через API в каждом запросе передавайте полученные параметры:
-
Для Vision API и Classifier API:
Указывайте IAM-токен в заголовке
Authorization
в следующем формате:Authorization: Bearer <IAM-токен>
Идентификатор каталога указывайте в теле запроса в параметре
folderId
. -
Для OCR API:
- в заголовке
Authorization
указывайте IAM-токен; - в заголовке
x-folder-id
указывайте идентификатор каталога.
Authorization: Bearer <IAM-токен> x-folder-id <идентификатор_каталога>
- в заголовке
-
Vision OCR поддерживает два способа аутентификации с сервисным аккаунтом:
-
С помощью IAM-токена:
-
Полученный IAM-токен передавайте в заголовке
Authorization
в следующем формате:Authorization: Bearer <IAM-токен>
-
С помощью API-ключей.
Используйте API-ключи, если у вас нет возможности автоматически запрашивать IAM-токен.
-
Полученный API-ключ передавайте в заголовке
Authorization
в следующем формате:Authorization: Api-Key <API-ключ>
Не указывайте в запросах идентификатор каталога — сервис использует каталог, в котором был создан сервисный аккаунт.
Распознать текст из PDF-файла с помощью OCR API
Распознавание текста из PDF-файла реализовано в методах OCR API TextRecognition.recognize для одностраничных PDF-файлов и TextRecognitionAsync.recognize — для многостраничных.
-
Подготовьте PDF-файл для распознавания. Размер файла не должен превышать 10 МБ, в одном файле должно быть не более 200 страниц.
-
Кодируйте PDF-файл в формат Base64.
UNIXWindowsPowerShellPythonNode.jsJavaGobase64 -i input.pdf > output.txt
C:> Base64.exe -e input.pdf > output.txt
[Convert]::ToBase64String([IO.File]::ReadAllBytes("./input.pdf")) > output.txt
# Импортируйте библиотеку для кодирования в Base64 import base64 # Создайте функцию, которая кодирует файл и возвращает результат. def encode_file(file): file_content = file.read() return base64.b64encode(file_content)
// Считайте содержимое файла в память. var fs = require('fs'); var file = fs.readFileSync('/path/to/file'); // Получите содержимое файла в формате Base64. var encoded = Buffer.from(file).toString('base64');
// Импортируйте библиотеку для кодирования в Base64. import org.apache.commons.codec.binary.Base64; // Получите содержимое файла в формате Base64. byte[] fileData = Base64.encodeBase64(yourFile.getBytes());
import ( "bufio" "encoding/base64" "io/ioutil" "os" ) // Откройте файл f, _ := os.Open("/path/to/file") // Прочитайте содержимое файла. reader := bufio.NewReader(f) content, _ := ioutil.ReadAll(reader) // Получите содержимое файла в формате Base64. base64.StdEncoding.EncodeToString(content)
-
Создайте файл с телом запроса, например
body.json
.body.json:
{ "mimeType": "application/pdf", "languageCodes": ["*"], "model": "page", "content": "<PDF-файл_в_кодировке_base64>" }
В свойстве
content
укажите содержимое файла, полученное при переводе PDF-файла в формат Base64.Чтобы сервис автоматически определил язык текста, укажите в конфигурации свойство
"languageCodes": ["*"]
. -
Отправьте запрос:
Одностраничный PDFМногостраничный PDFUNIXPythonexport IAM_TOKEN=<IAM-токен> curl \ --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --header "x-folder-id: <идентификатор_каталога>" \ --header "x-data-logging-enabled: true" \ --data "@body.json" \ https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText \ --output output.json
Где:
<IAM-токен>
— полученный ранее IAM-токен.<идентификатор_каталога>
— полученный ранее идентификатор каталога.
data = {"mimeType": <mime_type>, "languageCodes": ["*"], "content": content} url = "https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText" headers= {"Content-Type": "application/json", "Authorization": "Bearer {:s}".format(<IAM-токен>), "x-folder-id": "<идентификатор_каталога>", "x-data-logging-enabled": "true"} w = requests.post(url=url, headers=headers, data=json.dumps(data))
Результат будет состоять из распознанных блоков текста, строк и слов с указанием их местоположения на странице PDF-файла.
Результат
{ "result": { "text_annotation": { "width": "3312", "height": "4683", "blocks": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "371" }, { "x": "373", "y": "580" }, { "x": "1836", "y": "580" }, { "x": "1836", "y": "371" } ] }, "lines": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "371" }, { "x": "373", "y": "430" }, { "x": "1836", "y": "430" }, { "x": "1836", "y": "371" } ] }, "alternatives": [ { "text": "Страница №1, строка 1", "words": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "358" }, { "x": "373", "y": "444" }, { "x": "967", "y": "444" }, { "x": "967", "y": "358" } ] }, "text": "Страница", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1014", "y": "358" }, { "x": "1014", "y": "444" }, { "x": "1278", "y": "444" }, { "x": "1278", "y": "358" } ] }, "text": "№1,", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1303", "y": "358" }, { "x": "1303", "y": "444" }, { "x": "1718", "y": "444" }, { "x": "1718", "y": "358" } ] }, "text": "строка", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1765", "y": "358" }, { "x": "1765", "y": "444" }, { "x": "1836", "y": "444" }, { "x": "1836", "y": "358" } ] }, "text": "1", "entity_index": "-1" } ] } ] }, { "bounding_box": { "vertices": [ { "x": "373", "y": "520" }, { "x": "373", "y": "580" }, { "x": "1836", "y": "580" }, { "x": "1836", "y": "520" } ] }, "alternatives": [ { "text": "Страница №1, строка 2", "words": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "508" }, { "x": "373", "y": "594" }, { "x": "967", "y": "594" }, { "x": "967", "y": "508" } ] }, "text": "Страница", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1014", "y": "507" }, { "x": "1014", "y": "593" }, { "x": "1277", "y": "593" }, { "x": "1277", "y": "507" } ] }, "text": "№1,", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1302", "y": "507" }, { "x": "1302", "y": "593" }, { "x": "1718", "y": "593" }, { "x": "1718", "y": "507" } ] }, "text": "строка", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1765", "y": "507" }, { "x": "1765", "y": "593" }, { "x": "1836", "y": "593" }, { "x": "1836", "y": "507" } ] }, "text": "2", "entity_index": "-1" } ] } ] } ], "languages": [ { "language_code": "ru" } ] } ], "entities": [] }, "page": "0" } }
-
Отправьте запрос с помощью метода recognize:
export IAM_TOKEN=<IAM-токен> curl \ --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --header "x-folder-id: <идентификатор_каталога>" \ --header "x-data-logging-enabled: true" \ --data "@body.json" \ https://ocr.api.cloud.yandex.net/ocr/v1/recognizeTextAsync
Где:
<IAM-токен>
— полученный ранее IAM-токен.<идентификатор_каталога>
— полученный ранее идентификатор каталога.
Результат:
{ "id": "cfrtr5q0hdhl********", "description": "OCR async recognition", "created_at": "2023-10-24T09:12:48Z", "created_by": "ajeol2afu1js********", "modified_at": "2023-10-24T09:12:48Z", "done": false, "metadata": null }
Сохраните идентификатор (
id
) операции распознавания, полученный в ответе. -
Отправьте запрос на получение результата распознавания с помощью метода getRecognition:
export IAM_TOKEN=<IAM-токен> curl \ --request GET \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --header "x-folder-id: <идентификатор_каталога>" \ --header "x-data-logging-enabled: true" \ https://ocr.api.cloud.yandex.net/ocr/v1/getRecognition?operationId=<идентификатор_операции> \ --output output.json
Где:
<IAM-токен>
— полученный ранее IAM-токен.<идентификатор_каталога>
— полученный ранее идентификатор каталога.<идентификатор_операции>
— полученный ранее идентификатор операции распознавания.
Результат будет состоять из распознанных блоков текста, строк и слов с указанием их местоположения на странице PDF-файла. Результат распознавания каждой страницы приводится в отдельной секции
result
.Результат
{ "result": { "text_annotation": { "width": "3312", "height": "4683", "blocks": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "371" }, { "x": "373", "y": "580" }, { "x": "1836", "y": "580" }, { "x": "1836", "y": "371" } ] }, "lines": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "371" }, { "x": "373", "y": "430" }, { "x": "1836", "y": "430" }, { "x": "1836", "y": "371" } ] }, "alternatives": [ { "text": "Страница №1, строка 1", "words": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "358" }, { "x": "373", "y": "444" }, { "x": "967", "y": "444" }, { "x": "967", "y": "358" } ] }, "text": "Страница", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1014", "y": "358" }, { "x": "1014", "y": "444" }, { "x": "1278", "y": "444" }, { "x": "1278", "y": "358" } ] }, "text": "№1,", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1303", "y": "358" }, { "x": "1303", "y": "444" }, { "x": "1718", "y": "444" }, { "x": "1718", "y": "358" } ] }, "text": "строка", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1765", "y": "358" }, { "x": "1765", "y": "444" }, { "x": "1836", "y": "444" }, { "x": "1836", "y": "358" } ] }, "text": "1", "entity_index": "-1" } ] } ] }, { "bounding_box": { "vertices": [ { "x": "373", "y": "520" }, { "x": "373", "y": "580" }, { "x": "1836", "y": "580" }, { "x": "1836", "y": "520" } ] }, "alternatives": [ { "text": "Страница №1, строка 2", "words": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "508" }, { "x": "373", "y": "594" }, { "x": "967", "y": "594" }, { "x": "967", "y": "508" } ] }, "text": "Страница", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1014", "y": "507" }, { "x": "1014", "y": "593" }, { "x": "1277", "y": "593" }, { "x": "1277", "y": "507" } ] }, "text": "№1,", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1302", "y": "507" }, { "x": "1302", "y": "593" }, { "x": "1718", "y": "593" }, { "x": "1718", "y": "507" } ] }, "text": "строка", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1765", "y": "507" }, { "x": "1765", "y": "593" }, { "x": "1836", "y": "593" }, { "x": "1836", "y": "507" } ] }, "text": "2", "entity_index": "-1" } ] } ] } ], "languages": [ { "language_code": "ru" } ] } ], "entities": [] }, "page": "0" } } { "result": { "text_annotation": { "width": "3312", "height": "4683", "blocks": [ { "bounding_box": { "vertices": [ { "x": "371", "y": "371" }, { "x": "371", "y": "580" }, { "x": "1836", "y": "580" }, { "x": "1836", "y": "371" } ] }, "lines": [ { "bounding_box": { "vertices": [ { "x": "371", "y": "371" }, { "x": "371", "y": "430" }, { "x": "1820", "y": "430" }, { "x": "1820", "y": "371" } ] }, "alternatives": [ { "text": "Страница №2, строка 1", "words": [ { "bounding_box": { "vertices": [ { "x": "371", "y": "357" }, { "x": "371", "y": "444" }, { "x": "964", "y": "444" }, { "x": "964", "y": "357" } ] }, "text": "Страница", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "993", "y": "357" }, { "x": "993", "y": "444" }, { "x": "1292", "y": "444" }, { "x": "1292", "y": "357" } ] }, "text": "№2,", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1317", "y": "357" }, { "x": "1317", "y": "444" }, { "x": "1701", "y": "444" }, { "x": "1701", "y": "357" } ] }, "text": "строка", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1748", "y": "357" }, { "x": "1748", "y": "444" }, { "x": "1820", "y": "444" }, { "x": "1820", "y": "357" } ] }, "text": "1", "entity_index": "-1" } ] } ] }, { "bounding_box": { "vertices": [ { "x": "373", "y": "520" }, { "x": "373", "y": "580" }, { "x": "1836", "y": "580" }, { "x": "1836", "y": "520" } ] }, "alternatives": [ { "text": "Страница №2, строка 2", "words": [ { "bounding_box": { "vertices": [ { "x": "373", "y": "507" }, { "x": "373", "y": "594" }, { "x": "967", "y": "594" }, { "x": "967", "y": "507" } ] }, "text": "Страница", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1014", "y": "507" }, { "x": "1014", "y": "594" }, { "x": "1277", "y": "594" }, { "x": "1277", "y": "507" } ] }, "text": "№2,", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1302", "y": "507" }, { "x": "1302", "y": "594" }, { "x": "1718", "y": "594" }, { "x": "1718", "y": "507" } ] }, "text": "строка", "entity_index": "-1" }, { "bounding_box": { "vertices": [ { "x": "1765", "y": "506" }, { "x": "1765", "y": "593" }, { "x": "1836", "y": "593" }, { "x": "1836", "y": "506" } ] }, "text": "2", "entity_index": "-1" } ] } ] } ], "languages": [ { "language_code": "ru" } ] } ], "entities": [] }, "page": "1" } }
-
Чтобы получить распознанные слова из PDF-файла, найдите все значения со свойством
text
.
Примечание
Если полученные координаты не соответствуют отображаемому положению элементов, настройте в вашем средстве просмотра изображений поддержку метаданных exif
, либо при передаче в сервис удаляйте из секции exif
изображения атрибут Orientation
.