objective-c – 创建自动调整打印输出

我的应用程序需要打印一些东西布局应该有点动态(有时特定字段可能包含更多数据,这可能要求它们包含文字或其他类似的东西),但打印输出应该永远不会超过单个页面.如果数据太多,我想稍微减小字体大小并再试一次,然后重复一遍,直到所有内容都适合单个页面(数据永远不会太多,以至于字体不会太小).

我需要在同一页面上打印文本和图像.

布局应如下所示:

+------------------------------------------------------------------+
| +------+                                               +-------+ |
| | seal |                   text field 1                | photo | |
| |      |                   text field 2                |       | |
| +------+                                               +-------+ |
| ---------------------------------------------------------------- |
|  text header 1:                 text data                        |
|  text header 2:                 longer text data                 |
|  text header 3 with long title: very long text data which does   |
|                                 not fit on a single line         |
| ---------------------------------------------------------------- |
|  text header 4:                 text data                        |
.                                                                  .
.     (...)                          (...)                         .
.                                                                  .
|                                                                  |
+------------------------------------------------------------------+

文本字段1的数据略有变化,但不重要.文本字段2的数据可以相当短,但也可以非常长,并且应该适合两个图像元素之间,必要时进行文字包装.这两个字段应该(大致)在两个图像之间垂直居中.

页面其余部分的数据字段按其间的垂直线分组,但所有数据字段应从页面左侧的相同偏移量开始,该偏移量由最长标题的长度定义.

我已经在我的XIB文件中使用独立的NSView(独立式,不是窗口的一部分)来部分管理.我创建了NSTextField元素来保存标题和数据.对齐要求被定义为NSTextField元素的约束,如果一切都适合(即,不需要自动换行,并且不需要减小字体大小),它看起来就像它应该的样式.

但是,还有一些问题:

>我无法弄清楚如何使NSTextField包装其文本,但保持尽可能小,垂直,以适应一切.看起来我需要使它超过一行高(这会导致行之间不需要的空白空间),或者自动换行会遮挡第二行.
>在我知道页面上的可打印区域之前,打印API要求我传递NSView.因此,我没有看到我调整NSView大小的选项,因此它最适合页面.目前,这会导致页面边缘过大或顶部/底部边缘过大,具体取决于所使用的打印机及其设置.

我是以正确的方式来做这件事的吗?如果是这样,我该如何解决上述两个问题?如果没有,我应该做什么呢?

我确实看过Core Printing API,但这似乎有点太低了.

谢谢,

最佳答案 如果将“行为”设置为“无”或“可选”,则NSTextField将换行并且将足够高.

要调整打印视图的大小,可以创建NSView的子类并实现knowsPageRange:和rectForPage:.在knowsPageRange中:您计算页数(1)并返回YES.在rectForPage中:您设置高度和宽度约束,以便视图与页面大小相同,调用[self layoutSubtreeIfNeeded]并返回self.bounds. [[NSPrintOperation currentOperation] printInfo]会给你printinfo.

点赞