Продукты Р7
Корпоративный сервер 2024
Корпоративный сервер 2024
Сервер документов
Сервер документов
Редакторы документов
Редакторы документов
Корпоративный сервер 2019
Корпоративный сервер 2019
Графика
Графика
ВКС и мессенджер
ВКС и мессенджер
Мобильные редакторы
Мобильные редакторы
Почтовый сервер
Почтовый сервер
Органайзер
Органайзер
Сервер лицензирования
Сервер лицензирования
Файл-Экспресс
Файл-Экспресс
Аналитика
Аналитика
Дополнительно
Часто задаваемые вопросы
Разработчикам
Интеграции
Новые возможности

Conversion API

Обновлено: 23.10.26

Инструкция актуальна для версии продукта: 2025.4.1.1604

1. Назначение и схема работы

Conversion API конвертирует документы, таблицы и презентации из одного формата в другой средствами Сервера документов Р7. Типичная задача — получить PDF или архивный PDF/A из файлов DOCX, XLSX или PPTX.

Актуально для версии r7-office-documentserver-ee 2025.4.1-1604.

Как проходит конвертация:

  1. Ваше приложение размещает исходный файл по URL, доступному Серверу документов;
  2. Приложение отправляет POST-запрос с параметрами в формате JSON на адрес https://documentserver/ConvertService.ashx;
  3. Сервер документов сам скачивает файл по URL, конвертирует его и возвращает ссылку fileUrl на результат;
  4. Приложение скачивает результат по fileUrl. Ссылка временная и подписанная, поэтому скачивайте файл сразу.

Подробнее о взаимодействии клиента и сервера — в разделе Как это работает ↗.

Вызывайте Conversion API со стороны сервера (бэкенда). Сервер документов не отдаёт CORS-заголовки для ConvertService.ashx, поэтому запрос из браузера со страницы на другом домене будет заблокирован. Кроме того, для подписи запроса нужен секретный ключ JWT, который нельзя размещать в коде страницы.

2. Адрес и формат запроса

ЧтоЗначение
МетодPOST
Адресhttps://documentserver/ConvertService.ashx, где documentserver — адрес Сервера документов Р7. Если Сервер документов опубликован под префиксом (например, /ds-vpath/), добавьте его в путь.
Тело запросаJSON с параметрами из раздела 4
Заголовок Content-Typeapplication/json
Заголовок Acceptapplication/json — ответ придёт в JSON. Без этого заголовка ответ приходит в XML.
АвторизацияJWT-токен в теле запроса или в заголовке (раздел 3)

Ошибки конвертации возвращаются с HTTP-статусом 200. Признак ошибки — поле error в ответе (раздел 9). Проверяйте это поле, а не только HTTP-статус.

3. Авторизация (JWT)

Если на Сервере документов включена проверка токенов (по умолчанию включена), каждый запрос должен содержать JWT, подписанный секретным ключом. Без токена или с неверной подписью сервер вернёт {"error": -8}.

3.1. Где посмотреть настройки

Настройки находятся в файле /etc/r7-office/documentserver/local.json:

Параметр в local.jsonНазначение
services.CoAuthoring.token.enable.request.inboxtrue — входящие запросы проверяются
services.CoAuthoring.secret.inbox.stringСекретный ключ для подписи токена
services.CoAuthoring.token.inbox.headerИмя HTTP-заголовка для токена. По умолчанию Authorization; в поставке Р7 часто задано AuthorizationJWT
"token": {
"enable": { "request": { "inbox": true, "outbox": true },
"browser": true },
"inbox": { "header": "AuthorizationJWT" },
"outbox": { "header": "AuthorizationJWT" }
},
"secret": {
"inbox": { "string": "secret" },
...
}

3.2. Способ 1: токен в теле запроса (рекомендуется)

Подпишите алгоритмом HS256 объект с параметрами запроса и передайте результат в поле token. Те же параметры можно продублировать в теле открыто — сервер использует данные из токена.

{
"async": false,
"filetype": "docx",
"key": "a7c3e9f01b2d",
"outputtype": "pdf",
"title": "report.docx",
"url": "https://storage.example.com/files/report.docx",
"token": "<JWT, подписанный HS256, payload = параметры выше без token>"
}

Достаточно передать и одно поле token — параметры сервер возьмёт из него. Пример ниже подписан ключом secret, в payload — параметры filetype, key, outputtype, title, url из примера 7.1:

{
"token":
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmaWxldHlwZSI6ImRvY3giLCJrZXkiOiJLaGlyejZ6VFBkZmQ3Iiwib3V0cHV0dHlwZSI6InBkZiIsInRpdGxlIjoiRXhhbXBsZSBEb2N1bWVudCBUaXRsZS5kb2N4IiwidXJsIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS91cmwtdG8tZXhhbXBsZS1kb2N1bWVudC5kb2N4In0.52WfoJ8nvJZcg9sUQfiWPe4lqw324vZ2vIvs_nJdfZQ"
}

3.3. Способ 2: токен в заголовке

Передайте токен в заголовке с именем из token.inbox.header, с префиксом Bearer. В этом случае параметры запроса вкладываются в поле payload токена:

AuthorizationJWT: Bearer <JWT>

payload токена:

{
"payload": {
"filetype": "docx", "key": "a7c3e9f01b2d", "outputtype":
"pdf",
"title": "report.docx", "url":
"https://storage.example.com/files/report.docx"
}
}

3.4. Требования к токену

  • Алгоритм подписи — HS256, ключ — значение secret.inbox.string;
  • Все три части токена кодируются в base64url: символы «+» и «/» заменяются на «-» и «_», завершающие «=» удаляются. Это относится и к подписи;
  • Токен подписывается, а не шифруется: его содержимое может прочитать любой, у кого он есть. Не передавайте в нём секретные данные.

Частая ошибка — кодировать подпись обычным base64 (например, CryptoJS.enc.Base64.stringify(hash)) и обрезать только последний символ «=». Такой токен проходит проверку лишь тогда, когда в подписи случайно нет символов «+» и «/». Используйте готовую JWT-библиотеку или замените символы, как показано в разделе 10.3.

4. Параметры запроса

ПараметрТипОбязательныйОписание
asyncbooleanнетtrue — асинхронный режим: ответ приходит сразу, результат нужно запрашивать повторно (раздел 8.3). По умолчанию false.
codePageintegerнетКодировка при конвертации из CSV и TXT. Основные значения: 932 — японский (Shift-JIS), 950 — китайский (Big5), 1250 — центральноевропейская (Windows), 1251 — кириллица (Windows), 65001 — Юникод (UTF-8).
delimiterintegerнетРазделитель при конвертации из CSV: 0 — нет, 1 — табуляция, 2 — точка с запятой, 3 — двоеточие, 4 — запятая, 5 — пробел.
documentLayoutobjectнетПараметры печати форм в PDF или изображения (раздел 4.1).
documentRenderer.textAssociationstringнетРежим распознавания текста при конвертации из PDF, XPS, OXPS (раздел 4.2). По умолчанию plainLine.
filetypestringдаРасширение исходного файла: DOCX, XLSX, PDF и т. д. (раздел 6).
keystringдаИдентификатор конвертации. Сервер кеширует результат по key и outputtype — см. предупреждение ниже. Рекомендуется до 128 символов из набора 0-9 a-z A-Z - _.
outputtypestringдаФормат результата: расширение из раздела 6, pdfa для PDF/A (раздел 5) или обобщённые форматы ooxml и odf (ниже). Регистр не важен.
passwordstringнетПароль, если исходный файл защищён паролем.
regionstringнетРегиональный формат валюты, даты и времени при конвертации таблиц в PDF, например ru-RU, en-US, fr-FR. По умолчанию en-US.
spreadsheetLayoutobjectнетПараметры печати таблиц в PDF (раздел 4.3).
thumbnailobjectнетПараметры изображения при outputtype = BMP, GIF, JPG, PNG (раздел 4.4).
titlestringнетИмя исходного файла. Из него формируется имя файла результата: report.docx → report.pdf.
tokenstringпри включённом JWTJWT с параметрами запроса (раздел 3). Обязателен, если на сервере включена проверка токенов.
urlstringдаАбсолютный URL исходного файла. Сервер документов скачивает файл сам, поэтому адрес должен быть доступен с сервера. По умолчанию размер файла ограничен 100 МБ (FileConverter.converter.maxDownloadBytes), время загрузки — 2 минутами.

Кеширование по key. Повторный запрос с тем же key и тем же outputtype возвращает ранее сконвертированный файл, даже если url указывает на другой документ. Для каждой новой версии файла генерируйте новый key, например хеш содержимого или пару «идентификатор файла + версия».

Обобщённые форматы в outputtype. Их используют, когда заранее неизвестно, какое расширение нужно:

  • ooxml — результат будет DOCX, DOCM, XLSX, XLSM, PPTX или PPTM. Например, DOC с макросами станет DOCM, без макросов — DOCX (так же для XLS и PPT). При конвертации XML тип (DOCX, XLSX или PPTX) выбирается по содержимому;
  • odf — результат будет ODT, ODS или ODP, например при конвертации XML в ODF по содержимому.

Если тип содержимого XML определить не удалось, сервер вернёт ошибку -9 — укажите формат явно.

4.1. documentLayout — печать форм

ПараметрТипОписание
drawPlaceHoldersbooleanПоказывать заполнители полей.
drawFormHighlightbooleanПодсвечивать поля форм.
isPrintbooleanРежим печати, только для DOCX/DOCXF → PDF. При true флаги drawPlaceHolders и drawFormHighlight работают, как описано выше. При false drawFormHighlight не действует, а drawPlaceHolders позволяет сохранить формы в PDF. По умолчанию false.

4.2. documentRenderer.textAssociation — распознавание текста из PDF

ЗначениеРезультат
blockCharКаждый символ в отдельном фрейме, как в текстовом поле.
blockLineКаждая строка в отдельном фрейме; строки могут объединяться в блоки.
plainLineОбычный текст, каждая строка — отдельный абзац. Значение по умолчанию.
plainParagraphОбычный текст, строки объединяются в абзацы.

4.3. spreadsheetLayout — печать таблиц в PDF

ПараметрТипОписание
ignorePrintAreabooleanИгнорировать заданную в файле область печати. По умолчанию true.
orientationstringportrait (книжная, по умолчанию) или landscape (альбомная).
fitToWidth, fitToHeightintegerВписать в N страниц по ширине и высоте. 0 — не ограничивать (по умолчанию).
scaleintegerМасштаб в процентах. По умолчанию 100.
gridLines, headingsbooleanПечатать линии сетки и заголовки строк и столбцов. По умолчанию false.
pageSize.width, pageSize.heightstringРазмер страницы с единицами измерения, например "210mm" и "297mm" (A4, по умолчанию).
margins.left, margins.right, margins.top, margins.bottomstringПоля с единицами измерения. По умолчанию слева и справа "17.8mm", сверху и снизу "19.1mm".

4.4. thumbnail — получение изображений

ПараметрТипОписание
aspectinteger0 — растянуть до width × height; 1 — сохранить пропорции; 2 (по умолчанию) — размер страницы при 96 dpi, width и height не используются (A4 → 794 × 1123 пикселей).
firstbooleantrue (по умолчанию) — только первая страница; false — zip-архив с изображениями всех страниц.
width, heightintegerРазмер в пикселях. По умолчанию 100.

5. Конвертация в PDF и PDF/A

Значение pdf даёт PDF 1.7, значение pdfa — PDF/A-2a. Других вариантов PDF и PDF/A нет.

5.1. Допустимые значения outputtype

Для получения PDF поддерживаются только два значения outputtype:

  • pdf — обычный PDF;
  • pdfa — PDF/A (архивный PDF).

Значения проверяются без учёта регистра (PDF и PDFA тоже работают). Любые другие варианты — pdfa1b, pdfa-1b, pdfa2a, pdfa1, pdfa2, pdfa3, pdf/a, PDF/A-1b, pdfua — возвращают ошибку -7. Отдельного параметра для выбора версии PDF или уровня PDF/A нет.

В обоих случаях в ответе fileType равен pdf, а файл результата имеет расширение .pdf.

5.2. Характеристики результата

Характеристикаoutputtype = «pdf»outputtype = «pdfa»
Заголовок файла%PDF-1.7%PDF-1.4
СтандартPDF 1.7PDF/A-2a (ISO 19005-2, уровень A)
Идентификация PDF/A в XMPнетpdfaid:part = 2, pdfaid:conformance = A
OutputIntent (цветовой профиль)нетsRGB IEC61966-2.1
Теги структуры (Tagged PDF)нетда
Шрифты—встроены (подмножества)

Результаты одинаковы для всех проверенных исходных форматов: DOCX, XLSX, CSV, PPTX и PDF.

Заголовок %PDF-1.4 в файле PDF/A-2 не ошибка. Стандарт ISO 19005-2 допускает заголовок от %PDF-1.0 до %PDF-1.7. Соответствие PDF/A определяется содержимым файла и XMP-идентификацией, а не номером в заголовке.

5.3. PDF/A-1b и PDF/A-1a не поддерживаются

Получить средствами Сервера документов файл, соответствующий PDF/A-1 (1a или 1b), нельзя.

5.4. Что означает уровень A

Уровень A (accessible) требует логической структуры документа (тегов) и соответствия текста Юникоду. Конвертер строит теги автоматически по структуре исходного документа. Качество тегов зависит от исходного файла, поэтому для лучшего результата:

  • оформляйте заголовки стилями «Заголовок 1», «Заголовок 2» и т. д., а не ручным форматированием;
  • задавайте замещающий текст (alt text) для рисунков;
  • указывайте язык документа.

5.5. Пример запроса PDF/A

POST https://documentserver/ConvertService.ashx
Content-Type: application/json
Accept: application/json

{
"async": false,
"filetype": "docx",
"key": "8f14e45fceea167a",
"outputtype": "pdfa",
"title": "contract.docx",
"url": "https://storage.example.com/files/contract.docx",
"token": "<JWT>"
}

Ответ:

{
"fileUrl":
"https://documentserver/cache/files/data/conv_8f14e45fceea167a_pdfa/output.pdf/contract.pdf?md5=...&expires=...&filename=contract.pdf",
"fileType": "pdf",
"percent": 100,
"endConvert": true
}

6. Поддерживаемые форматы

Значение filetype — формат исходного файла, outputtype — формат результата. Конвертация в тот же формат, что и исходный, не выполняется. Для неподдерживаемого направления сервер возвращает ошибку -7 или -3. Проверено на версии 2025.4.1-1604.

6.1. Текстовые документы

СвойстваФорматы
Входные (filetype)DJVU, DOC, DOCM, DOCX, DOCXF, DOT, DOTM, DOTX, EPUB, FB2, FODT, HTM, HTML, MHT, MHTML, ODT, OTT, OXPS, PDF, RTF, STW, SXW, TXT, WPS, WPT, XML, XPS
Выходные (outputtype)BMP, DOCM, DOCX, DOCXF, DOTM, DOTX, EPUB, FB2, GIF, HTML, JPG, ODT, OFORM, OTT, PDF, PDFA, PNG, RTF, TXT
ИсключениеDJVU → только BMP, GIF, JPG, PNG, PDF, PDFA
Не поддерживаются как выходныеDOC, FODT, XPS, MD
ПровереноDOCX → все выходные форматы из списка, а также ooxml (→ DOCX) и odf (→ ODT); PDF → DOCX, ODT, TXT, PDFA; XML → PDF

6.2. Электронные таблицы

СвойстваФорматы
Входные (filetype)CSV, ET, ETT, FODS, ODS, OTS, SXC, XLS, XLSB, XLSM, XLSX, XLT, XLTM, XLTX, XML
Выходные (outputtype)BMP, CSV, GIF, JPG, ODS, OTS, PDF, PDFA, PNG, XLSM, XLSX, XLTM, XLTX
Не поддерживаются как выходныеXLS, XLSB, FODS
ПровереноXLSX → XLSX, XLSM, XLTX, ODS, OTS, CSV, PDF, PDFA, PNG, JPG; CSV → XLSX, PDFA

6.3. Презентации

СвойстваФорматы
Входные (filetype)DPS, DPT, FODP, ODP, OTP, POT, POTM, POTX, PPS, PPSM, PPSX, PPT, PPTM, PPTX, SXI
Выходные (outputtype)BMP, GIF, JPG, ODP, OTP, PDF, PDFA, PNG, POTM, POTX, PPSM, PPSX, PPTM, PPTX
Не поддерживаются как выходныеPPT, FODP
ПровереноPPTX → PPTX, PPTM, POTX, PPSX, ODP, OTP, PDF, PDFA, PNG

7. Примеры запросов

Во всех примерах example.com — сервер, на котором установлены менеджер документов и служба хранения документов. Поле token опущено: при включённой проверке JWT добавьте его, как описано в разделе 3.

7.1. DOCX → PDF

{
"async": false,
"filetype": "docx",
"key": "Khirz6zTPdfd7",
"outputtype": "pdf",
"title": "Example Document Title.docx",
"url": "https://example.com/url-to-example-document.docx"
}

7.2. Защищённый паролем DOCX → PDF

{
"async": false,
"filetype": "docx",
"key": "Khirz6zTPdfd7",
"outputtype": "pdf",
"password": "123456",
"title": "Example Document Title.docx",
"url": "https://example.com/url-to-example-document.docx"
}

7.3. PNG-миниатюра DOCX-файла

{
"filetype": "docx",
"key": "Khirz6zTPdfd7",
"outputtype": "png",
"thumbnail": {
"aspect": 0,
"first": true,
"height": 150,
"width": 100
},
"title": "Example Document Title.docx",
"url": "https://example.com/url-to-example-document.docx"
}

7.4. Таблица XLSX → PDF

{
"filetype": "xlsx",
"key": "Khirz6zTPdfd7",
"outputtype": "pdf",
"region": "en-US",
"spreadsheetLayout": {
"ignorePrintArea": true,
"orientation": "portrait",
"fitToWidth": 0,
"fitToHeight": 0,
"scale": 100,
"headings": false,
"gridLines": false,
"pageSize": {
"width": "210mm",
"height": "297mm"
},
"margins": {
"left": "17.8mm",
"right": "17.8mm",
"top": "19.1mm",
"bottom": "19.1mm"
}
},
"title": "Example Spreadsheet Title.xlsx",
"url": "https://example.com/url-to-example-spreadsheet.xlsx"
}

Напоминание: в этих примерах везде один key. В реальной работе задавайте новый key для каждого файла и каждой его версии, иначе сервер вернёт закешированный результат (раздел 4).

8. Ответ сервера

По умолчанию ответ приходит в XML; с заголовком Accept: application/json — в JSON.

8.1. Поля ответа

ПолеТипОписаниеПример
endConvertbooleanЗавершена ли конвертацияtrue
errorintegerКод ошибки (раздел 9). Присутствует только при ошибке-3
fileTypestringРасширение файла результата. Для PDFA — PDF"pdf"
fileUrlstringВременная ссылка на результат. Есть только при endConvert = true"https://documentserver/cache/files/..."
percentintegerПроцент выполнения. При завершении — 100100

Ссылка fileUrl строится по тому имени сервера, на которое пришёл запрос, и содержит подпись и срок действия (md5, expires). Скачивайте результат сразу после получения ответа.

8.2. Примеры ответов

Успешный ответ в формате JSON (с заголовком Accept: application/json):

{
"fileUrl":
"https://documentserver/cache/files/data/conv_a7c3e9f01b2d_pdf/output.pdf/report.pdf?md5=...&expires=...&filename=report.pdf",
"fileType": "pdf",
"percent": 100,
"endConvert": true
}

Успешный ответ в формате XML (без заголовка Accept):

<?xml version="1.0" encoding="utf-8"?>
<FileResult>
<FileUrl>https://documentserver/cache/files/data/conv_a7c3e9f01b2d_pdf/output.pdf/report.pdf?md5=...&expires=...&filename=report.pdf</FileUrl>
<FileType>pdf</FileType>
<Percent>100</Percent>
<EndConvert>True</EndConvert>
</FileResult>

Ошибка в формате JSON:

{ "error": -8 }

Ошибка в формате XML:

<?xml version="1.0" encoding="utf-8"?>
<FileResult><Error>-8</Error></FileResult>

8.3. Асинхронный режим

При "async": true сервер отвечает сразу. Пока конвертация не завершена, ответ выглядит так.

В формате JSON:

{ "percent": 95, "endConvert": false }

В формате XML:

<?xml version="1.0" encoding="utf-8"?>
<FileResult>
<EndConvert>False</EndConvert>
<FileType></FileType>
<FileUrl></FileUrl>
<Percent>95</Percent>
</FileResult>

Повторяйте тот же запрос с тем же key с интервалом около 1 секунды, пока не получите "endConvert": true и fileUrl (или error).

9. Коды ошибок

Все ошибки возвращаются с HTTP-статусом 200 — проверяйте поле error в ответе.

КодОписаниеТипичная причина
-1Неизвестная ошибка—
-2Превышено время конвертацииБольшой или сложный файл
-3Ошибка конвертацииПовреждённый файл, неподдерживаемое направление, превышен лимит размера
-4Ошибка загрузки исходного файлаURL недоступен с Сервера документов, ответ 404, превышен размер или время загрузки
-5Неверный парольФайл защищён, а password не указан или неверен
-6Ошибка доступа к базе результатов конвертацииПроблемы с БД Сервера документов
-7Ошибка входных данныхНеизвестное значение outputtype (например, pdfa1b), неподдерживаемое направление
-8Недействительный токенНет токена, неверный ключ, подпись в base64 вместо base64url
-9Не удалось определить формат результатаКонвертация XML с outputtype = ooxml/odf, когда тип содержимого неизвестен; укажите формат явно

10. Примеры кода

10.1. Python (серверная сторона)

# pip install pyjwt
import secrets, jwt, requests

DS = "https://documentserver/ConvertService.ashx"
SECRET = "secret" # services.CoAuthoring.secret.inbox.string

params = {
"async": False,
"filetype": "docx",
"key": secrets.token_hex(8), # новый key для каждой версии файла
"outputtype": "pdfa", # или "pdf"
"title": "report.docx",
"url": "https://storage.example.com/files/report.docx",
}
params["token"] = jwt.encode(params, SECRET, algorithm="HS256")

r = requests.post(DS, json=params, headers={"Accept":
"application/json"}, timeout=300)
res = r.json()
if "error" in res:
raise RuntimeError(f"Conversion error {res['error']}")
pdf = requests.get(res["fileUrl"], timeout=60).content
open("report.pdf", "wb").write(pdf)

10.2. Node.js

// npm install jsonwebtoken
const jwt = require("jsonwebtoken");
const crypto = require("crypto");

const params = {
async: false,
filetype: "xlsx",
key: crypto.randomBytes(8).toString("hex"),
outputtype: "pdf",
title: "budget.xlsx",
url: "https://storage.example.com/files/budget.xlsx",
region: "ru-RU",
spreadsheetLayout: { orientation: "landscape", fitToWidth: 1,
fitToHeight: 0 },
};
params.token = jwt.sign(params, "secret", { algorithm: "HS256" });

const res = await fetch("https://documentserver/ConvertService.ashx",
{
method: "POST",
headers: { "Content-Type": "application/json", Accept:
"application/json" },
body: JSON.stringify(params),
}).then((r) => r.json());

10.3. Подпись токена без библиотеки JWT (CryptoJS)

Если токен формируется вручную, все части, включая подпись, должны быть в base64url:

function b64url(str) {
return str.replace(/\+/g, "-").replace(/\//g,
"_").replace(/=+$/, "");
}
const header64 = b64url(btoa(JSON.stringify({ alg: "HS256", typ:
"JWT" })));
const payload64 =
b64url(btoa(unescape(encodeURIComponent(JSON.stringify(payload)))));
const signature = b64url(CryptoJS.enc.Base64.stringify(
CryptoJS.HmacSHA256(header64 + "." + payload64, secret)));
const token = header64 + "." + payload64 + "." + signature;

Этот фрагмент — только для тестовых стендов. В рабочей системе секретный ключ не должен попадать в браузер: формируйте токен и вызывайте Conversion API на сервере.

Была ли эта статья полезной?

Поделитесь пожалуйста своим мнением

      В статье есть ошибкиРекомендации не помоглиТекст трудно понятьСодержание статьи не соответствует заголовкуДругое