PDF-отчёт режет таблицу: как задать правила страниц
Чтобы PDF-отчёт не разрезал таблицу непонятным образом, задайте правила страниц до выбора отдельного CSS-свойства: что переносится целиком, где повторяется шапка и как выглядит строка выше доступной высоты страницы. Затем проверьте эти правила на конечном файле выбранного генератора. Универсальное уменьшение шрифта скрывает симптом, но не определяет правильное поведение документа.
Читатель должен понимать каждую страницу отдельно
Представим учебный отчёт по выдаче оборудования: список записей, комментарии к отдельным строкам и общий итог. Когда таблица продолжается на следующей странице без заголовков, читатель вынужден возвращаться назад, чтобы понять значение столбцов. Если перенос отрывает комментарий от записи, он может отнести его к другому объекту. Это уже ошибка смысла, даже если ни один символ не обрезан.
Начните с макета короткого и длинного документа. Укажите формат страницы, рабочую область, заголовки, колонтитулы и место итогов. Ширина экрана приложения не равна ширине печатного листа. Если отчёт нужен именно как документ для передачи, правила его чтения стоит включить в задание на разработку веб-приложения, а не оставлять как побочный эффект кнопки печати.
Соглашение о переносах
Для обычной строки можно предпочесть перенос целиком на следующую страницу. Для группы — сохранять рядом заголовок и хотя бы начало данных. Для общего итога — ясно обозначать, относится он ко всему отчёту или к части. Но пожелания могут конфликтовать: одна запись с большим примечанием иногда выше всей полезной области листа.
Выберите правило для такого случая заранее. Можно разрешить продолжение записи с повторным идентификатором, вынести длинное примечание в связанное приложение или изменить форму отчёта. Нельзя одновременно требовать неразрывную строку любой высоты, неизменный формат листа и полную сохранность её содержания. Разработчик должен показать согласованное решение, а не молча обрезать остаток.
Набор данных, который проверяет макет
Таблица ниже — собственный приёмочный набор. Объёмы условные: точная граница зависит от шрифта, полей, генератора и содержания. Важны классы ситуаций, а не единственное красивое число строк.
| Учебный набор | Шапка | Допустимый разрыв | Итоги | Что проверить |
|---|---|---|---|---|
| Нет записей | Понятный контекст отчёта | Не требуется | Не подставлять вымышленные данные | Сообщение об отсутствии результата и применённые условия |
| Короткая таблица | На первой странице | Не нужен внутри записи | По выбранному правилу под таблицей | Отсутствие лишнего пустого листа |
| Обычная запись на нижней границе | На следующем листе при продолжении | Перенос целиком, если это согласовано | Не повторять общий итог | Нет обрезанного текста и потерянной записи |
| Примечание выше одной страницы | С контекстом продолжения | По специальному правилу длинной записи | После завершения соответствующих данных | Ясная принадлежность фрагментов одной записи |
| Группа переходит на другой лист | Повторяемый контекст группы и столбцов | По принятой структуре группы | Отличать подытог группы от общего | Нет пустого заголовка внизу без данных |
| Широкая таблица | Все нужные названия различимы | Решение по ширине отдельно от высоты | В пределах читаемого макета | Не потеряны правые столбцы и единицы измерения |
Почему break-inside: avoid не является всей настройкой
В MDN break-inside описывает управление разрывами внутри блока и взаимодействует с break-before и break-after. Принудительный разрыв имеет свой приоритет. Поэтому добавление avoid к одному контейнеру нельзя считать проверкой всех правил отчёта, особенно когда другие стили требуют начала новой страницы.
Спецификация CSS Fragmentation предусматривает ослабление ограничений разрыва, когда иначе содержимое не помещается. Следовательно, запрет не делает произвольный объём текста физически помещающимся на листе. Поддержку свойств и поведение сложной таблицы нужно подтверждать в выбранном движке и его версии, а не по результату другого браузера.
Если отчёт формируется не через HTML и CSS, механизмы будут другими. Не переносите советы о браузерной печати в библиотеку с собственной моделью таблиц как готовое исправление. Сначала согласуйте наблюдаемое поведение документа, затем реализуйте его средствами используемого генератора. Смена движка тоже требует повторной проверки крайних данных.
Шапка, итог и примечание не должны менять смысл
Повтор заголовков
Задайте, какая информация повторяется при продолжении: названия колонок, единицы и обозначение группы. Если генератор умеет повторять строку заголовка, проверьте его реальное поведение на многостраничной таблице. Не обещайте одинаковую поддержку во всех реализациях. Повторяемый декоративный логотип не заменяет обозначения столбцов.
Итоговые значения
Общий итог должен встречаться там и столько раз, сколько определено макетом. Если нужен промежуточный итог страницы, подпишите его так, чтобы его нельзя было сложить с общим как отдельную сумму. Пагинация не должна пересчитывать бизнес-результат по случайно оставшимся на листе строкам, если отчёт обещает итог всей выборки.
Примечания и ссылки
Свяжите примечание с записью устойчивым обозначением. Если его переносят в приложение, читатель должен найти соответствие в обе стороны. Для длинной ссылки решите, нужен ли полный адрес на бумаге и как он переносится. Не позволяйте одной неразрывной строке вытолкнуть таблицу за край, но и не подменяйте адрес при сокращении.
Как принять экспорт, а не скриншот
- Сохраните учебные входные данные и ожидаемые результаты расчёта. Макет должен проверяться на воспроизводимом наборе.
- Сформируйте конечный PDF тем же способом, который будет использовать приложение. Зафиксируйте генератор, его конфигурацию и параметры документа.
- Просмотрите первые, промежуточные и последние страницы. Отдельно проверьте переходы групп и продолжение самой длинной записи.
- Сверьте количество записей и итоги с исходным набором. Визуально ровная таблица ещё может терять данные.
- Проверьте чтение на другом согласованном просмотрщике и печатный сценарий, если он нужен заказчику. Снимок одной страницы не заменяет файл.
- Повторите проверку после изменения шаблона или генератора. Сохраните проблемный пример как часть приёмочного комплекта.
Если формирование PDF является самостоятельной функцией программы, требования можно включить в автоматизацию документов или разработку обработки документов. Передайте подрядчику не только образец страницы, но и наборы, на которых макет обязан сохранить смысл. Именно на них видно, выполнено ли правило переносов.
Вопросы и ответы
Как задать разрывы таблицы при HTML to PDF?
Сначала определите, какие части переносятся целиком и как оформляется продолжение. Затем настройте средства конкретного генератора и проверьте крайние данные в конечном PDF.
Как повторять заголовок таблицы в PDF?
Используйте предусмотренный выбранным движком механизм и задайте состав повторяемой шапки. Подтвердите результат на документе с несколькими страницами: одинаковое поведение всех генераторов не гарантируется.
Почему break-inside: avoid не работает как ожидалось?
Проверьте поддержку свойства, другие правила разрыва и размер блока относительно страницы. Запрет разрыва не гарантирует целостность произвольно высокого содержимого; нужен заранее выбранный сценарий продолжения.
Читайте также
При печати таблицы с сайта пропадают строки: проверка
РазработкаДолгий отчёт в веб-приложении: очередь, статус и скачивание
РазработкаВыбрать всё в CRM: страницу или все записи по фильтру
РазработкаКак сделать страницу 404 полезной и проверить её ответ
РазработкаСайт типографии: калькулятор брошюры должен различать страницы и листы
SaaSТемпературный отчёт по рейсу: к какому грузу относятся данные