我有这样的打印功能:
- (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页的信息,我希望能够在打印之前手动输入NSPrintInfo
或NSPrintOperation
个其他页面而不是分页。类似的东西:
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];
任何解决方案?提前谢谢。
答案 0 :(得分:1)
你无法避免与Cocoa印刷系统的分页;正如你的评论所提到的,你需要去更低级别的东西。
但是我不认为应该对你正在做的分页进行调整太难。请查看Providing a Custom Pagination Scheme和Customizing 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
方法的作用。