【问题标题】:MacOS / appkit NSPrint logic for printing long, complex reportsMacOS / appkit NSPrint 逻辑,用于打印长而复杂的报告
【发布时间】:2020-04-17 01:13:56
【问题描述】:

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

过去(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 中调用上述方法,导致我正在绘制的页面变得更短,从而将材料推到下一页。

文档没有详细说明此类调整将如何传播到数十(或数百)页。

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

【问题讨论】:

    标签: cocoa printing appkit nsprintoperation


    【解决方案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;
    

    这要求报表预先分页。

    Selecting the Page Bounds for Content That Exceed a Single Page

    Printing Programming Guide for Mac.

    【讨论】:

    • 奇怪的是:当文档说“此方法由 print: 调用。视图可以提升底部边缘并在 newBottom 中返回新值”时,这并没有说明如何adjustPageHeightNew 会在它询问的页面中传递吗?
    • 页码无关紧要。 adjustPageHeightNew 询问“这个底部边缘是否在方便的位置?”。
    • 这就是分页的重点,“[特定页面]的底部边缘是否在方便的位置”。否则,“方便的位置”没有任何意义......
    • 如果特定的 y 位置必须在特定页面上,则不能使用自动分页。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多