1

我们有一个包含许多报告的应用程序,其中一些报告具有复杂的打印循环。

回到过去(IE PowerPlant、Carbon、Core Printing),我们曾经创建具有某种 BeginPage() / EndPage() 对的打印循环。通常,这些对嵌入在报告打印循环逻辑中。

最终结果是许多报告在打印之前没有分页,而是在打印时分页。这些报告遍历数千个对象并尽可能多地填满页面,然后调用 EndPage(),然后通过调用 BeginPage() 继续下一页,同时保持 in- 的复杂“状态”。进度打印报告。

随着大多数核心打印被弃用,似乎使用 NSPrint 的逻辑,打印报告驱动分页的方法是不可能的。NSPrintOperation 非常希望能够为自定义 NSView 的 drawRect 请求一个完整的页面来绘制,并且该自定义 NSView 最好能够从任何页面开始。这是否意味着每个报告都必须预先分页?

似乎有一种不同的方法是“自动”分页的一部分:

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

如果我正确阅读了文档,假设我有一份 10 页的报告,我需要在其中找到合适的划分位置。看起来我可以将该报告视为一个长视图,然后在我的 drawRect 中调用上述方法,导致我正在绘制的页面变得更短,从而将材料推到下一页。

该文档没有提供有关此类调整如何在数十(或数百)页上传播的详细信息。

除了上面描述的被动方法,还有其他方法可以从报告生成代码中驱动打印和分页吗?

4

1 回答 1

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 打印编程指南中

于 2020-04-17T12:35:22.713 回答