在Objective-C中打印多个页面

时间:2011-04-23 11:45:13

标签: objective-c xcode macos nsprintoperation

我有这样的打印功能:

- (void)sendToPrinter:(int)code {
    NSPrintInfo *printInfo;
    NSPrintInfo *sharedInfo;
    NSPrintOperation *printOp;
    NSMutableDictionary *printInfoDict;
    NSMutableDictionary *sharedDict;

    sharedInfo = [NSPrintInfo sharedPrintInfo];
    sharedDict = [sharedInfo dictionary];
    printInfoDict = [NSMutableDictionary dictionaryWithDictionary:
                     sharedDict];
    [printInfoDict setObject:NSPrintSpoolJob 
                      forKey:NSPrintJobDisposition];
    printInfo = [[NSPrintInfo alloc] initWithDictionary: printInfoDict];
    [printInfo setHorizontalPagination: NSAutoPagination];
    [printInfo setVerticalPagination: NSAutoPagination];
    [printInfo setVerticallyCentered:NO];
    [printInfo setLeftMargin:10];
    [printInfo setRightMargin:10];
    [printInfo setTopMargin:10];
    [printInfo setBottomMargin:10];
    [printInfo setScalingFactor:1.1];
    printOp = [NSPrintOperation printOperationWithView:sheet 
                                             printInfo:printInfo];
    [printOp setShowsPrintPanel:YES];
    [printOp runOperation];
}

这将打印一个名为 sheet 的页面预览的表示,它是NSBox。这很好用。

有时我有更多可以放在页面上的信息,所以我有'下一页'按钮,通过重新加载表<填充表示Page2,Page3等/ em>与相关数据。这很好。

现在,如果我想要打印出适合2或3页而不是1页的信息,我希望能够在打印之前手动输入NSPrintInfoNSPrintOperation个其他页面而不是分页。类似的东西:

printOp = [NSPrintOperation printOperationWithView:sheet 
                                             printInfo:printInfo];
[self nextPage];
printOp = [NSPrintOperation printOperationWithView:sheet 
                                             printInfo:printInfo];
[self nextPage];
printOp = [NSPrintOperation printOperationWithView:sheet 
                                             printInfo:printInfo];
// run this in loop until all the pages are accounted for
[printOp setShowsPrintPanel:YES];
[printOp runOperation];

任何解决方案?提前谢谢。

1 个答案:

答案 0 :(得分:1)

你无法避免与Cocoa印刷系统的分页;正如你的评论所提到的,你需要去更低级别的东西。

但是我不认为应该对你正在做的分页进行调整太难。请查看Providing a Custom Pagination SchemeCustomizing a View's Drawing for Printing。只需子类NSBox,提供每个页面大小的rects并在beginPageInRect:atPlacement:中调整坐标系,以便框插入rect。您可以使用[[NSPrintOperation currentOperation] currentPage]获取当前页码,以便了解要绘制的内容。

更新:如果您的视图尺寸合适,您甚至不需要弄乱坐标系。这是一个非常简单的NSBox子类的例子,它只是改变了每个页面的标题:

@implementation NumberBox

- (BOOL)knowsPageRange:(NSRangePointer)aRange;
{
    *aRange = NSMakeRange(1, 10);
    return YES;
}

- (void)beginPageInRect:(NSRect)aRect atPlacement:(NSPoint)location;
{
    [self setTitle:[NSString stringWithFormat:@"Page %d", [[NSPrintOperation currentOperation] currentPage]]];
    [super beginPageInRect:aRect atPlacement:location];
}

- (NSRect)rectForPage:(NSInteger)page;
{
    return [self bounds];
}

@end

可能不太明显的一件事是需要调用超类的beginPageInRect:atPlacement:实现。另外,不要在rectForPage:中绘制,它将无法正常工作 - 这是beginPage… / endPage方法的作用。