1. Назначение и схема работы
Conversion API конвертирует документы, таблицы и презентации из одного формата в другой средствами Сервера документов Р7. Типичная задача — получить PDF или архивный PDF/A из файлов DOCX, XLSX или PPTX.
Актуально для версии r7-office-documentserver-ee 2025.4.1-1604.
Как проходит конвертация:
- Ваше приложение размещает исходный файл по URL, доступному Серверу документов;
- Приложение отправляет POST-запрос с параметрами в формате JSON на адрес
https://documentserver/ConvertService.ashx; - Сервер документов сам скачивает файл по URL, конвертирует его и возвращает ссылку
fileUrlна результат; - Приложение скачивает результат по
fileUrl. Ссылка временная и подписанная, поэтому скачивайте файл сразу.
Подробнее о взаимодействии клиента и сервера — в разделе Как это работает ↗.
Вызывайте Conversion API со стороны сервера (бэкенда). Сервер документов не отдаёт CORS-заголовки для ConvertService.ashx, поэтому запрос из браузера со страницы на другом домене будет заблокирован. Кроме того, для подписи запроса нужен секретный ключ JWT, который нельзя размещать в коде страницы.
2. Адрес и формат запроса
| Что | Значение |
|---|---|
| Метод | POST |
| Адрес | https://documentserver/ConvertService.ashx, где documentserver — адрес Сервера документов Р7. Если Сервер документов опубликован под префиксом (например, /ds-vpath/), добавьте его в путь. |
| Тело запроса | JSON с параметрами из раздела 4 |
| Заголовок Content-Type | application/json |
| Заголовок Accept | application/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.inbox | true — входящие запросы проверяются |
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. Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
async | boolean | нет | true — асинхронный режим: ответ приходит сразу, результат нужно запрашивать повторно (раздел 8.3). По умолчанию false. |
codePage | integer | нет | Кодировка при конвертации из CSV и TXT. Основные значения: 932 — японский (Shift-JIS), 950 — китайский (Big5), 1250 — центральноевропейская (Windows), 1251 — кириллица (Windows), 65001 — Юникод (UTF-8). |
delimiter | integer | нет | Разделитель при конвертации из CSV: 0 — нет, 1 — табуляция, 2 — точка с запятой, 3 — двоеточие, 4 — запятая, 5 — пробел. |
documentLayout | object | нет | Параметры печати форм в PDF или изображения (раздел 4.1). |
documentRenderer.textAssociation | string | нет | Режим распознавания текста при конвертации из PDF, XPS, OXPS (раздел 4.2). По умолчанию plainLine. |
filetype | string | да | Расширение исходного файла: DOCX, XLSX, PDF и т. д. (раздел 6). |
key | string | да | Идентификатор конвертации. Сервер кеширует результат по key и outputtype — см. предупреждение ниже. Рекомендуется до 128 символов из набора 0-9 a-z A-Z - _. |
outputtype | string | да | Формат результата: расширение из раздела 6, pdfa для PDF/A (раздел 5) или обобщённые форматы ooxml и odf (ниже). Регистр не важен. |
password | string | нет | Пароль, если исходный файл защищён паролем. |
region | string | нет | Региональный формат валюты, даты и времени при конвертации таблиц в PDF, например ru-RU, en-US, fr-FR. По умолчанию en-US. |
spreadsheetLayout | object | нет | Параметры печати таблиц в PDF (раздел 4.3). |
thumbnail | object | нет | Параметры изображения при outputtype = BMP, GIF, JPG, PNG (раздел 4.4). |
title | string | нет | Имя исходного файла. Из него формируется имя файла результата: report.docx → report.pdf. |
token | string | при включённом JWT | JWT с параметрами запроса (раздел 3). Обязателен, если на сервере включена проверка токенов. |
url | string | да | Абсолютный 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 — печать форм
| Параметр | Тип | Описание |
|---|---|---|
drawPlaceHolders | boolean | Показывать заполнители полей. |
drawFormHighlight | boolean | Подсвечивать поля форм. |
isPrint | boolean | Режим печати, только для DOCX/DOCXF → PDF. При true флаги drawPlaceHolders и drawFormHighlight работают, как описано выше. При false drawFormHighlight не действует, а drawPlaceHolders позволяет сохранить формы в PDF. По умолчанию false. |
4.2. documentRenderer.textAssociation — распознавание текста из PDF
| Значение | Результат |
|---|---|
blockChar | Каждый символ в отдельном фрейме, как в текстовом поле. |
blockLine | Каждая строка в отдельном фрейме; строки могут объединяться в блоки. |
plainLine | Обычный текст, каждая строка — отдельный абзац. Значение по умолчанию. |
plainParagraph | Обычный текст, строки объединяются в абзацы. |
4.3. spreadsheetLayout — печать таблиц в PDF
| Параметр | Тип | Описание |
|---|---|---|
ignorePrintArea | boolean | Игнорировать заданную в файле область печати. По умолчанию true. |
orientation | string | portrait (книжная, по умолчанию) или landscape (альбомная). |
fitToWidth, fitToHeight | integer | Вписать в N страниц по ширине и высоте. 0 — не ограничивать (по умолчанию). |
scale | integer | Масштаб в процентах. По умолчанию 100. |
gridLines, headings | boolean | Печатать линии сетки и заголовки строк и столбцов. По умолчанию false. |
pageSize.width, pageSize.height | string | Размер страницы с единицами измерения, например "210mm" и "297mm" (A4, по умолчанию). |
margins.left, margins.right, margins.top, margins.bottom | string | Поля с единицами измерения. По умолчанию слева и справа "17.8mm", сверху и снизу "19.1mm". |
4.4. thumbnail — получение изображений
| Параметр | Тип | Описание |
|---|---|---|
aspect | integer | 0 — растянуть до width × height; 1 — сохранить пропорции; 2 (по умолчанию) — размер страницы при 96 dpi, width и height не используются (A4 → 794 × 1123 пикселей). |
first | boolean | true (по умолчанию) — только первая страница; false — zip-архив с изображениями всех страниц. |
width, height | integer | Размер в пикселях. По умолчанию 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.7 | PDF/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. Поля ответа
| Поле | Тип | Описание | Пример |
|---|---|---|---|
endConvert | boolean | Завершена ли конвертация | true |
error | integer | Код ошибки (раздел 9). Присутствует только при ошибке | -3 |
fileType | string | Расширение файла результата. Для PDFA — PDF | "pdf" |
fileUrl | string | Временная ссылка на результат. Есть только при endConvert = true | "https://documentserver/cache/files/..." |
percent | integer | Процент выполнения. При завершении — 100 | 100 |
Ссылка 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 на сервере.













