Я создаю отчеты с использованием HTML, и я использую CSS для управления разрывом страницы с использованием page-break-after и т. д. Я дал пользователю возможность распечатать сразу несколько отчетов, которые я создаю как разделы одного динамически сгенерированного HTML-документа. Создание одного документа позволяет выполнять одно задание на печать, чтобы избежать проблем с буферизацией печати.
Моя проблема заключается в следующем: я хотел бы пронумеровать страницы раздела более крупного динамического HTML в формате «страница x из n». Однако, если я позволю принтеру сделать это, он увидит документ (правильно) как единый документ и пронумерует весь документ.
Можно ли каким-либо образом определить, когда произойдет разрыв страницы CSS, чтобы я мог подсчитать их для раздела перед печатью и ввести свою собственную нумерацию (например, элемент HTML) для разделов в длинном сингле документ?
Похоже, у меня должен быть способ сделать это, но за последние несколько дней решение ускользнуло от меня, поэтому я подумал, что пингую Stackoverflow.
ОБНОВЛЕНИЕ: Что я в итоге сделал:
Я принял ответ Кристофера, потому что, хотя я не использовал его в точности, он указал мне правильное направление.
В итоге я провел вычисления с содержимым с помощью jQuery, исходя из размера бумаги, на которой печатается, полей, размера шрифта и т. Д. а затем добавление элементов для разрывов страниц с CSS для разрыва страниц. Я отслеживаю, сколько div'ов разрыва страницы добавлено, а затем обновляю html-информацию «страница x из n» в каждом div разрыва страницы после обработки всего содержимого. Это позволило мне избежать необходимости знать, сколько страниц будет в начале (спасибо jQuery .each).
Очевидно, с этим решением есть некоторые проблемы:
Элементы "page x of n" не отображаются как настоящие нижние колонтитулы, а скорее внизу контента на каждой странице. В моей ситуации это приемлемый компромисс.
Разделение элементов контента, которые сами по себе были больше страницы, особенно учитывая, что большая часть контента генерируется php, стало немного сложнее. Я заставил это работать, но опять же, это требует допущений, которые могут нарушиться из-за вариантов печати.
Расчеты зависят от предположений о размере отпечатанной бумаги, полях, размере шрифта и т. Д. В моей ситуации, когда я работаю во внутренней сети, это снова приемлемый компромисс, потому что я могу контролировать эти параметры. Дополнительный код может быть добавлен для обработки некоторых изменений в будущем (например, размер бумаги).
Это решение, хотя и не идеальное и немного «хрупкое», решает мою проблему, позволяет мне печатать несколько отчетов одновременно, избегая использования принтера спулинг тайм-аутов, отслеживает и перезапускает нумерацию страниц и избегает создания PDF-файлов в качестве промежуточного шага для печати.
Я нашел это странно крепким орешком, поэтому я все равно буду признателен за мнения и комментарии по решению.
Спасибо!
ОБНОВЛЕНИЕ 2: Окончательное решение ... Избегайте головной боли самостоятельно:
Хотя я, возможно, пошел дальше, чем следовало бы, с этим подходом, с некоторыми небольшими успехами, в конце концов решение действительно оказалось не таким, потому что оно оказалось слишком «хрупким» для изменений. Любое изменение формата отчета, добавление нового содержания к существующим отчетам, размера бумаги и т. Д. Нарушало вычисления и просто приводило к невероятному количеству дополнительной работы!
Итак, окончательное решение? «Сопротивление бесполезно!» Просто делайте отчеты в формате PDF . Если хотите, можете начать припев «мы вам это сказали», я могу принять это ;-)
Я выбрал библиотеку TCPDF , которая оказалась превосходной, если немного сложно получить начал. Примеры очень полезны. Теперь у меня есть полная настройка отчета, и все создается так, как должно. Несколько отчетов легко создаются в виде одного PDF-файла (предотвращая проблему спулинга печати) с группами страниц, что позволяет нумерации работать именно так, как мне нужно.
Итак, если вы пытаетесь сделать что-то подобное, я бы порекомендовал вам перейти к делу, не беспокоиться о отчетах типа HTML / CSS и создавать PDF-файлы.