创建自动调整打印输出

时间:2015-09-15 09:08:16

标签: objective-c macos cocoa printing

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

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

布局应如下所示:

+------------------------------------------------------------------+
| +------+                                               +-------+ |
| | 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                        |
.                                                                  .
.     (...)                          (...)                         .
.                                                                  .
|                                                                  |
+------------------------------------------------------------------+

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

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

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

但是,还有一些问题:

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

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

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

谢谢,

1 个答案:

答案 0 :(得分:2)

如果将“行为”设置为“无”或“可选”,则NSTextField将换行并且将足够高。

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