Как в библиотеке docs.js сделать так, чтобы при переносе таблицы на следующую страницу отрисовывались границы (бордеры)?

Использую библиотеку <a href="https://github.com/dolanmiu/docx" rel="nofollow">docx </a>. В строке таблицы несколько ячеек без нижней границы — я выделил их жёлтым. При переносе строки на следующую страницу библиотека должна проставить границы: внизу на предыдущей странице и вверху на следующей (я отметил их стрелками), но наследует бордеры переносимых ячеек и тоже не рисует нижнюю границу. Как обойти это и заставить при переносе рисовать границу другим цветом (чёрным)? Решения от дипсика и GPT пробовал — не помогло (устанавливали прозрачный бордер, нулевую толщину или белый). <br/> <br/>
  • 10 июля 2026 г. 10:00
Ответы на вопрос 2
Коротко — это поведение не «баг» docx, а поведение Word при разрыве строки/ячейки: когда строка/ячейка переносится на следующую страницу, продолжение наследует границы ячейки, и Word не «додумывает» и не дорисовывает снизу/сверху новую линию. Поэтому простые трюки с прозрачным/нулевым/белым бордером не сработают — Word просто рисует то, что задано в свойствах ячейки/строки.

Варианты обхода (практические решения)

1) Запретить разрыв строки (самое простое, если вас устраивает, что строка уйдёт целиком на следующую страницу)
- В docx есть опция cantSplit у TableRow — установите её в true. Тогда строка не будет разбиваться по страницам и граница останется целой.
Пример:
```js
const row = new TableRow({
  cantSplit: true,
  children: [ /* TableCell ... */ ],
});
```
(Имя опции может незначительно отличаться в разных версиях, но в основе — запись <w:cantSplit/> в trPr.)

2) Сделать границу таблицы «между строками» (table-level inside horizontal)
- Если вы хотите, чтобы при переносе «между» страницами появлялась линия, задайте внутри таблицы горизонтальную границу (insideHorizontal / insideH). Табличная внутренняя граница рисуется между строками и сохраняется при переносе страниц.
Пример (docx):
```js
const table = new Table({
  rows: [...],
  borders: {
    top: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    bottom: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    left: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    right: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    insideHorizontal: { style: BorderStyle.SINGLE, size: 6, color: "000000" }, // <-- важная часть
    insideVertical: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
  },
});
```
Минус: insideHorizontal будет применяться ко всем межстрочным разделителям таблицы, не только к тем, где раньше были «пустые» границы.

3) Разбивать содержимое «вручную»
- Если вы заранее знаете, какие строки потенциально будут переливаться, создавайте их как две строки (верхняя с нижней границей, нижняя с верхней). Это даёт полный контроль, но требует логики деления содержимого и не работает для непредсказуемых переносов.

4) Постобработка (XML) — сложнее и ненадёжно
- Теоретически можно генерировать docx и править его XML, но это сложный путь и не гарантирует корректного поведения Word при пагинации.

Резюме и рекомендация
- Если можно — используйте cantSplit на строках, которые не должны расщепляться.
- Если нужно, чтобы разделительная линия всегда была, используйте table-level insideHorizontal (возможно с дополнительной корректировкой отдельных ячеек).
- Если нужен тонкий контроль только для некоторых мест — придётся заранее структурировать/разбивать строки вручную.

Если пришлёте фрагмент кода, где вы строите таблицу (версия docx тоже укажите), я подскажу точный синтаксис для вашей версии и предложу наилучшее место, где применить cantSplit или задать insideHorizontal.
Попробуй хак через пустую строку. Добавь невидимую 1-пиксельную строку под таблицей, задай ей толстую черную нижнюю границу. При разрыве страницы либа будет вынуждена дорисовать визуальный разделитель для этого элемента.
Похожие вопросы