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

Плагин Docscript [бесплатно] [версия 1.0]

Обновлено: 08.05.26

Скачать плагин ↗


О плагине

docscript — модуль интеграции для внешних приложений (генерация документов, конвертация документов, проверка орфографии).

Плагин работает на базе R7-Office DocBuilder SDK и позволяет создавать документы без ручного редактирования: структура документа, стили, таблицы, списки, изображения, колонтитулы и специальные поля описываются в JSON-файле, после чего автоматически формируется готовый офисный документ.

Разработчик: АО Р7

Особенности плагина

Макрос

Плагин поддерживает выполнение .docbuilder-скриптов для прямой работы с DocBuilder API.

Плагин

Плагин позволяет создавать документы Word и другие офисные файлы на основе JSON-описания, использовать DOCX-шаблоны с плейсхолдерами, выполнять конвертацию форматов и проверять орфографию.

Модификация интерфейса

Плагин не изменяет интерфейс редактора и работает как инструмент командной строки.

Плагин поддерживает

Десктоп-редакторы Р7-Офис на macOS и Linux с установленным DocBuilder SDK.

Функциональные возможности:

  • генерация DOCX-документов из JSON;
  • поддержка параграфов, заголовков, списков, таблиц и изображений;
  • настройка форматирования текста, стилей, выравнивания и отступов;
  • добавление колонтитулов, номеров страниц и специальных полей;
  • работа с DOCX-шаблонами через плейсхолдеры;
  • конвертация документов, таблиц и презентаций в другие форматы;
  • проверка орфографии для русского и английского языков;
  • выполнение .docbuilder-скриптов;
  • поддержка выходных форматов DOCX, ODT, RTF, TXT, XLSX, PPTX, HTML и PDF.

История версий

Версия 1.0

Добавлены основные возможности:

  • генерация документов из JSON;
  • поддержка структуры документа: параграфы, списки, таблицы, изображения, стили и колонтитулы;
  • работа с DOCX-шаблонами и плейсхолдерами;
  • конвертация офисных форматов;
  • проверка орфографии;
  • выполнение .docbuilder-скриптов.

FAQ

Какие документы можно создавать с помощью плагина?

Плагин позволяет создавать документы на основе JSON-описания. Основной сценарий — генерация DOCX, но также поддерживаются другие выходные форматы, включая ODT, RTF, TXT, XLSX, PPTX и HTML.

Можно ли использовать готовый DOCX-шаблон?

Да. В шаблоне можно добавить плейсхолдеры вида {{имяКлюча}}, а затем заменить их содержимым из JSON-файла.

Какие элементы документа поддерживаются?

Поддерживаются параграфы, заголовки, форматированные фрагменты текста, маркированные и нумерованные списки, таблицы, изображения, разрывы страниц, колонтитулы, стили, номера страниц, поля слияния, закладки и перекрёстные ссылки.

Можно ли конвертировать документы в PDF?

Да. Плагин поддерживает конвертацию DOCX, XLSX, PPTX и других офисных форматов в PDF.

Можно ли проверять орфографию?

Да. Плагин поддерживает проверку орфографии для русского и английского языков. Результат проверки выводится в формате JSON.

Нужно ли открывать редактор вручную?

Нет. Плагин работает из командной строки и использует R7-Office DocBuilder SDK для автоматической обработки документов.

На каких системах работает плагин?

В руководстве указана поддержка macOS и Linux при установленной десктопной версии Р7-Офис.


Подробное описание

Ниже приведено подробное руководство по работе с docscript: требования, быстрый старт, режимы работы, структура JSON-документа, поддерживаемые форматы, аргументы командной строки и типичные проблемы.

1. Требования

Для работы необходимы:

  • установленный R7-Office, десктопная версия;
  • скомпилированный бинарник docscript.

Стандартные пути установки R7-Office:

  • macOS: /Applications/R7-Office.app
  • Linux: /opt/r7-office/desktopeditors

Если R7-Office установлен в нестандартное место, путь можно передавать через аргумент -editor_path при каждом запуске или задать переменную R7DIR перед сборкой.

2. Быстрый старт

Примеры базовых команд:

# Создать документ из JSON
./docscript -i my_document.json -o result.docx

# Конвертировать DOCX в PDF
./docscript -conv -i result.docx -o result.pdf

# Проверить орфографию
./docscript -grammar_check -i result.docx

3. Режим 1 — Генерация документа из JSON

Основной режим работы — создание документа из JSON-файла:

./docscript -i <файл.json> -o <результат.docx>

Инструмент читает JSON-файл с описанием документа и создаёт DOCX. Также поддерживаются другие выходные форматы: .odt, .rtf, .txt, .xlsx, .pptx. Формат результата определяется по расширению выходного файла.

Пример:

./docscript -i report.json -o report.docx
./docscript -i report.json -o report.odt

4. Структура JSON-документа

Файл JSON верхнего уровня может содержать несколько необязательных разделов:

{
  "styles":          [ ... ],
  "header":          { ... },
  "footer":          { ... },
  "firstPageHeader": { ... },
  "firstPageFooter": { ... },
  "content":         [ ... ]
}

Единственный обязательный раздел — content. Остальные можно опускать.

Параграфы

Простейший элемент документа — параграф с текстом:

{ "type": "paragraph", "text": "Привет, мир!" }

Именованные стили, соответствующие встроенным стилям Word/R7-Office:

{ "type": "paragraph", "style": "Heading 1", "text": "Заголовок первого уровня" }
{ "type": "paragraph", "style": "Heading 2", "text": "Заголовок второго уровня" }
{ "type": "paragraph", "style": "Heading 3", "text": "Заголовок третьего уровня" }
{ "type": "paragraph", "text": "Обычный текст" }

Выравнивание:

{ "type": "paragraph", "align": "left",    "text": "По левому краю (по умолчанию)" }
{ "type": "paragraph", "align": "center",  "text": "По центру" }
{ "type": "paragraph", "align": "right",   "text": "По правому краю" }
{ "type": "paragraph", "align": "justify", "text": "По ширине" }

Форматирование на уровне параграфа применяется ко всему тексту:

{
  "type": "paragraph",
  "text": "Жирный красный текст 14pt",
  "bold": true,
  "color": "#CC0000",
  "fontSize": 14
}

Отступы между параграфами задаются в твипах. 1 твип = 1/20 пт.

{
  "type": "paragraph",
  "text": "Параграф с отступами",
  "spacingBefore": 240,
  "spacingAfter": 120
}

Форматирование текста — runs

Если в одном параграфе нужно смешать разное форматирование, используется массив runs — набор текстовых фрагментов:

{
  "type": "paragraph",
  "runs": [
    { "text": "Обычный текст, " },
    { "text": "жирный", "bold": true },
    { "text": ", " },
    { "text": "курсив", "italic": true },
    { "text": ", " },
    { "text": "подчёркнутый", "underline": true },
    { "text": " и " },
    { "text": "цветной", "color": "#0070C0", "fontSize": 16 }
  ]
}
ПолеТипОписание
textstringТекст фрагмента
boldbooleanЖирный
italicbooleanКурсив
underlinebooleanПодчёркивание
fontSizenumberРазмер шрифта в пунктах
colorstringЦвет текста в формате #RRGGBB

Списки

Маркированный список:

{ "type": "paragraph", "listType": "bullet", "text": "Первый пункт" },
{ "type": "paragraph", "listType": "bullet", "text": "Второй пункт" },
{ "type": "paragraph", "listType": "bullet", "text": "Третий пункт" }

Нумерованный список:

{ "type": "paragraph", "listType": "numbered", "text": "Шаг первый" },
{ "type": "paragraph", "listType": "numbered", "text": "Шаг второй" },
{ "type": "paragraph", "listType": "numbered", "text": "Шаг третий" }

Вложенный список задаётся через listLevel: 0 — верхний уровень, 1 — вложенный и так далее.

{ "type": "paragraph", "listType": "bullet", "listLevel": 0, "text": "Пункт верхнего уровня" },
{ "type": "paragraph", "listType": "bullet", "listLevel": 1, "text": "Вложенный пункт" },
{ "type": "paragraph", "listType": "bullet", "listLevel": 2, "text": "Ещё глубже" }

Таблицы

{
  "type": "table",
  "rows": [
    [ "Имя",    "Должность",  "Отдел"   ],
    [ "Иванов", "Менеджер",   "Продажи" ],
    [ "Петров", "Разработчик","IT"       ]
  ]
}

Форматирование ячеек — вместо строки можно передать объект:

{
  "type": "table",
  "rows": [
    [
      { "text": "Заголовок", "bold": true, "background": "#4472C4", "color": "#FFFFFF" },
      { "text": "Значение",  "bold": true, "background": "#4472C4", "color": "#FFFFFF" }
    ],
    [
      { "text": "Строка 1", "background": "#DDEEFF" },
      "Данные"
    ]
  ]
}
ПолеОписание
textТекст ячейки
bold, italic, underlineФорматирование текста
fontSize, colorРазмер и цвет шрифта
backgroundЦвет фона ячейки в формате #RRGGBB
alignВыравнивание текста в ячейке
runsМассив прогонов, как в параграфе

Изображения

{
  "type": "image",
  "src": "/Users/user/pictures/logo.png",
  "width": 5.0,
  "height": 3.0
}
  • src — абсолютный путь к файлу на диске. Поддерживаются PNG, JPG, GIF, BMP, WebP, SVG.
  • width и height — размеры в дюймах, например 6.0 × 4.0.
  • Также принимаются интернет-URL и data-URL.

Разрыв страницы

{ "type": "pageBreak" }

Колонтитулы

Обычный колонтитул отображается на всех страницах:

{
  "header": {
    "content": [
      { "type": "paragraph", "text": "Название организации", "align": "center" }
    ]
  },
  "footer": {
    "content": [
      {
        "type": "paragraph",
        "align": "center",
        "runs": [
          { "text": "Страница " },
          { "type": "pageNumber" },
          { "text": " из " },
          { "type": "pagesCount" }
        ]
      }
    ]
  }
}

Разные колонтитулы для первой страницы:

{
  "firstPageHeader": {
    "content": [
      { "type": "paragraph", "text": "Титульный лист — без колонтитула" }
    ]
  },
  "header": {
    "content": [
      { "type": "paragraph", "text": "Обычный заголовок (страницы 2+)" }
    ]
  },
  "firstPageFooter": {
    "content": []
  },
  "footer": {
    "content": [
      { "type": "paragraph", "align": "right",
        "runs": [ { "type": "pageNumber" } ] }
    ]
  }
}

Наличие firstPageHeader или firstPageFooter автоматически включает режим «разная первая страница».

Стили

Раздел styles позволяет переопределить внешний вид встроенных стилей документа. Изменения применяются до создания контента, поэтому все параграфы с указанным стилем унаследуют их автоматически.

{
  "styles": [
    {
      "name": "Heading 1",
      "fontSize": 16,
      "bold": true,
      "color": "#1F3864",
      "spacingBefore": 240,
      "spacingAfter": 120
    },
    {
      "name": "Normal",
      "fontSize": 12,
      "fontName": "Times New Roman",
      "align": "justify"
    }
  ]
}
ПолеОписание
nameИмя стиля, строго как в Word: Heading 1, Normal и т.д.
fontSizeРазмер шрифта в пунктах
bold, italicНачертание
colorЦвет текста в формате #RRGGBB
fontNameНазвание гарнитуры, например Arial или Times New Roman
alignВыравнивание
spacingBefore, spacingAfterОтступы в твипах
indLeft, indRightОтступы слева и справа в твипах

Специальные поля

Специальные поля используются внутри массива runs параграфа.

Номер текущей страницы:

{ "type": "pageNumber" }

Общее количество страниц:

{ "type": "pagesCount" }

Нумерация последовательностей — аналог SEQ-поля в Word для подписей рисунков и таблиц:

{
  "type": "paragraph",
  "runs": [
    { "text": "Таблица " },
    { "type": "seq", "id": "Table" },
    { "text": ". Сводные данные" }
  ]
}

Счётчик id ведётся независимо для каждого идентификатора. Первый вызов даёт 1, второй — 2 и так далее.

Поле слияния:

{ "type": "mergeField", "name": "ФамилияПолучателя" }

Закладка и перекрёстная ссылка:

Сначала на параграф ставится закладка:

{ "type": "paragraph", "text": "Таблица 1. Показатели", "bookmark": "tbl1" }

Затем в другом месте на неё можно сослаться:

{
  "type": "paragraph",
  "runs": [
    { "text": "Подробнее см. " },
    { "type": "ref", "bookmark": "tbl1", "refType": "text", "link": true }
  ]
}

Значения refType:

  • text — текст параграфа;
  • pageNum — номер страницы;
  • paraNum — номер абзаца.
Обратите внимание

Ссылка может указывать только назад — закладка должна быть объявлена раньше ссылки в документе.

5. Режим 2 — Шаблоны с плейсхолдерами

Если есть готовый DOCX-файл с оформлением и нужно только заполнить его содержимым, используется шаблонный режим.

Подготовка шаблона

В любом месте шаблонного DOCX-документа нужно добавить параграфы-плейсхолдеры в формате {{имяКлюча}}. Каждый плейсхолдер должен занимать весь параграф целиком, а не быть частью текста.

Пример JSON для шаблона:

{
  "template": "template.docx",

  "mainContent": [
    { "type": "paragraph", "style": "Heading 1", "text": "Отчёт за квартал" },
    { "type": "paragraph", "text": "Данный отчёт подготовлен автоматически." }
  ],

  "summaryTable": [
    {
      "type": "table",
      "rows": [
        [ "Показатель", "Значение" ],
        [ "Выручка",    "1 200 000 ₽" ],
        [ "Расходы",    "800 000 ₽"   ]
      ]
    }
  ]
}

В файле template.docx должны быть параграфы {{mainContent}} и {{summaryTable}}. Они будут заменены соответствующим содержимым.

Запуск:

./docscript -i data.json -o filled_report.docx

Путь к шаблону в поле template может быть:

  • абсолютным: /Users/user/templates/template.docx;
  • относительным — относительно папки JSON-файла: template.docx, ../templates/base.docx.
Важно

Ключи JSON нечувствительны к регистру при поиске плейсхолдера. {{MainContent}}, {{maincontent}} и {{MAINCONTENT}} — одно и то же.

6. Режим 3 — Конвертация форматов

Конвертация выполняется через x2t — встроенный конвертер R7-Office. Формат определяется по расширению файла.

./docscript -conv -i <входной_файл> -o <выходной_файл>

Примеры:

# DOCX → PDF
./docscript -conv -i report.docx -o report.pdf

# DOCX → ODT
./docscript -conv -i report.docx -o report.odt

# XLSX → PDF
./docscript -conv -i table.xlsx -o table.pdf

# PPTX → PDF
./docscript -conv -i slides.pptx -o slides.pdf

# DOCX → HTML
./docscript -conv -i report.docx -o report.html

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

ТипФорматы
Документы.docx, .doc, .odt, .rtf, .txt, .html
Таблицы.xlsx, .xls, .ods, .csv
Презентации.pptx, .odp
Универсальный.pdf

Формат HTML в качестве вывода при генерации из JSON также поддерживается — промежуточный DOCX создаётся автоматически и затем конвертируется.

7. Режим 4 — Проверка орфографии

./docscript -grammar_check -i <файл> [-grammar_lang <язык>]

Примеры:

# Автоматическое определение языка — en_US + ru_RU
./docscript -grammar_check -i document.docx

# Только русский
./docscript -grammar_check -i document.docx -grammar_lang ru_RU

# Только английский
./docscript -grammar_check -i document.docx -grammar_lang en_US

# Проверить plain-text файл
./docscript -grammar_check -i notes.txt

Входные форматы: .docx, .doc, .odt, .html, .htm, а также .txt напрямую.

Файлы .docx, .doc, .odt, .html и .htm автоматически конвертируются во временный TXT перед проверкой.

Результат выводится в stdout в формате JSON:

[
  { "line": 3, "col": 12, "word": "привеет",  "suggestions": ["привет", "приветет"] },
  { "line": 7, "col": 5,  "word": "recieve",  "suggestions": ["receive", "relieve"] }
]

Если ошибок нет, выводится пустой массив:

[]

Автоматический режим языка работает без аргумента -grammar_lang: латинские слова проверяются по en_US, кириллические — по ru_RU. Если словарь ru_RU не найден, кириллические слова пропускаются с предупреждением в stderr.

8. Режим 5 — Выполнение .docbuilder-скриптов

Для прямой работы с DocBuilder API можно передать .docbuilder-файл как аргумент. Скрипт сам управляет созданием, заполнением и сохранением документа.

./docscript <script.docbuilder>

Пример .docbuilder-скрипта:

// hello.docbuilder
builder.CreateFile("docx");
var oDoc = Api.GetDocument();
var oPara = Api.CreateParagraph();
oPara.AddText("Hello from DocBuilder!");
oDoc.Push(oPara);
builder.SaveFile("docx", "/tmp/hello.docx");
builder.CloseFile();

Также можно выполнить произвольный JS-файл с входным и выходным документом:

./docscript transform.js -i input.docx -o output.docx

9. Справочник аргументов командной строки

АргументОписание
-i <файл>Входной файл — JSON, DOCX, TXT и др.
-o <файл>Выходной файл, формат определяется по расширению
-convРежим прямой конвертации через x2t
-grammar_checkРежим проверки орфографии
-grammar_lang <lang>Язык проверки: en_US, ru_RU
-editor_path <path>Путь к установке R7-Office, если он нестандартный
-w <dir>Рабочая директория для DocBuilder SDK, используется редко

Пути по умолчанию для -editor_path:

  • macOS: /Applications/R7-Office.app/Contents/Resources
  • Linux: /opt/r7-office/desktopeditors

10. Коды возврата и диагностика

Коды возврата

КодЗначение
0Успех
1Ошибка аргументов или невозможно открыть файл
2Ошибка выполнения скрипта или сохранения

Диагностические сообщения

Диагностические сообщения выводятся в stderr.

  • [patch] cannot write ... — нет прав на запись в native.js. Решение: sudo chmod a+w "<путь>/native.js"
  • [image] cannot read '...' — файл изображения не найден, путь оставлен как есть.
  • [image] inlined '...' — изображение успешно закодировано в base64.
  • SaveFile(...) -> 88 — ошибка сохранения SDK: неверный путь, нет прав на запись или RunTextA вернул ошибку ранее.
  • RunTextA(...) -> 0 — скрипт вернул ошибку; нужно проверить синтаксис JSON и логику fromjson.js.
  • Warning: ru_RU dictionary not found — словарь для русского языка не найден в dictionaries/ru_RU/.

Типичные проблемы

ПроблемаПричинаРешение
Пустой или повреждённый DOCXRunTextA вернул 0Проверить синтаксис JSON; убедиться, что native.js пропатчен
cannot open JSONНеверный путь к файлуУказать абсолютный путь или перейти в нужную директорию
Изображение не отображаетсяНеверный путь к файлу изображенияИспользовать абсолютный путь; убедиться, что файл читаем
SaveFile -> 88Нет прав на запись или неверный выходной путьПроверить путь и права записи в выходной директории
Плейсхолдер не заменилсяКлюч JSON не совпадает с {{ключ}} в шаблонеПроверить совпадение имён; регистр не важен; плейсхолдер должен быть единственным текстом параграфа

Примеры для генерации документов из JSON

Уточнение

Внутри архива находятся примеры генерации параграфов, списков, таблиц, изображений, колонтитулов, стилей, нумерации страниц, полей, ссылок, шаблонов DOCX, а также готовые результаты в формате DOCX и скрипты для запуска тестов:

Скачать архив с JSON-файлами для проверки работы docscript ↗

 

 

 

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

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

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