Логика MacOS/appkit NSPrint для печати длинных и сложных отчетов

У нас есть приложение со множеством отчетов, и некоторые из этих отчетов имеют сложные циклы печати.

Когда-то (IE PowerPlant, Carbon, Core Printing) мы использовали для создания циклов печати, которые имели какую-то пару BeginPage() / EndPage(). Часто эти пары были встроены в логику цикла печати отчета.

В результате многие отчеты не разбивались на страницы перед печатью, а разбивались на страницы по мере их печати. Эти отчеты итерировали по тысячам объектов и заполняли как можно большую часть страницы, затем вызывали EndPage(), а затем переходили к следующей странице, вызывая BeginPage(), сохраняя при этом сложное «состояние» исходных данных. печатный отчет о проделанной работе.

Поскольку большая часть Core Printing устарела, КАЖЕТСЯ, что с логикой NSPrint подход печатного отчета, управляющего разбиением на страницы, невозможен. NSPrintOperation в значительной степени хочет иметь возможность запрашивать полную страницу для рисования drawRect пользовательского NSView, и этот пользовательский NSView лучше иметь возможность начинать с ЛЮБОЙ страницы. Означает ли это, что КАЖДЫЙ отчет должен быть предварительно разбит на страницы?

Кажется, есть другой метод, который является частью «автоматической» нумерации страниц:

 - (void)adjustPageHeightNew:(CGFloat *)newBottom top:(CGFloat)oldTop bottom:(CGFloat)oldBottom limit:(CGFloat)bottomLimit;

Если я правильно читаю документацию, скажем, у меня был 10-страничный отчет, в котором мне нужно было найти подходящие места для разделения. ВЫГЛЯДИТ, что я могу рассматривать этот отчет как один длинный просмотр, а затем вызывать описанный выше метод, пока я нахожусь в своем drawRect, в результате чего страница, которую я рисую, становится КОРОЧЕ, и, таким образом, отодвигая материал на следующую страницу.

В документации мало подробностей о том, как такие корректировки будут распространяться на десятки (или сотни) страниц.

Существуют ли какие-либо другие методы управления печатью и разбиением на страницы из кода генерации отчетов, кроме пассивных подходов, описанных выше?


person SMGreenfield    schedule 17.04.2020    source источник


Ответы (1)


Если я правильно читаю документацию, скажем, у меня был 10-страничный отчет, в котором мне нужно было найти подходящие места для разделения. ВЫГЛЯДИТ, что я могу относиться к этому отчету как к одному длинному взгляду,

Да,

 - (void)adjustPageHeightNew:(CGFloat *)newBottom top:(CGFloat)oldTop bottom:(CGFloat)oldBottom limit:(CGFloat)bottomLimit;

затем вызовите вышеуказанный метод, пока я нахожусь в своем drawRect

Нет, в документации написано:

Переопределено подклассами для настройки высоты страницы во время автоматической разбивки на страницы. Этот метод вызывается print:. Представление может поднимать нижний край и возвращать новое значение в newBottom, что позволяет предотвратить разделение таких элементов, как строки текста, между страницами.

 

В документации мало подробностей о том, как такие корректировки будут распространяться на десятки (или сотни) страниц.

Я предполагаю, что следующие страницы сдвигаются вверх.

Существуют ли какие-либо другие методы управления печатью и разбиением на страницы из кода генерации отчетов, кроме пассивных подходов, описанных выше?

Да, переопределить

- (BOOL)knowsPageRange:(NSRangePointer)range;

а также

- (NSRect)rectForPage:(NSInteger)page;

Для этого необходимо, чтобы отчет был предварительно разбит на страницы.

См. Выбор границ страницы для содержимого, превышающего одну страницу

в Печать руководства по программированию для Mac.

person Willeke    schedule 17.04.2020
comment
Вот что странно: когда в документах говорится, что этот метод вызывается print:. Представление может поднять нижний край и вернуть новое значение в newBottom, о чем это не говорит, так это о том, КАК будет проходить AdjustPageHeightNew на КАКОЙ странице, о которой он спрашивает? - person SMGreenfield; 18.04.2020
comment
Номер страницы не имеет значения. adjustPageHeightNew спрашивает Этот нижний край находится в удобном месте?. - person Willeke; 18.04.2020
comment
Итак, в этом весь смысл нумерации страниц. Это нижний край [КОНКРЕТНОЙ СТРАНИЦЫ] в удобном месте. В противном случае удобное положение не имеет никакого значения... - person SMGreenfield; 18.04.2020
comment
Если определенное y-местоположение должно быть на определенной странице, автоматическое разбиение на страницы использовать нельзя. - person Willeke; 18.04.2020