在Objective-C中打印多页 [英] Printing multiple pages in Objective-C
问题描述
我具有如下打印功能:
- (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
.这很好.
This prints a representation of a page preview called sheet, which is an NSBox
. This works fine.
有时候我有更多的信息适合页面,因此我有下一页"按钮,通过重新加载 sheet 以及相关数据.效果很好.
Sometimes I have more information that can fit on a page and so I have 'next page' buttons that fill sheet with a representation of Page2, Page3, etc. by reloading sheet with the relevant data. This works fine.
现在,如果我想打印出适合2或3页而不是1页的信息,我希望能够在打印前手动输入NSPrintInfo
或NSPrintOperation
其他页面,而不是分页.像这样:
Now, if I want to print out information that will fit on 2 or 3 pages rather than 1, I want to be able to feed NSPrintInfo
or NSPrintOperation
additional pages manually before it goes to print, rather than pagination. Something like:
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];
有解决方案吗?预先感谢.
Any solutions? Thanks in advance.
推荐答案
您无法避免使用Cocoa打印系统进行分页.正如您的评论所提到的,您需要转到较低级别.
You can't avoid pagination with the Cocoa printing system; as your comment mentions, you'll need to go to something lower-level.
但是,我认为将您正在做的事情适应分页应该并不难.看看提供自定义分页方案和
However I don't think it should be too hard to adapt what you're doing to pagination. Take a look at Providing a Custom Pagination Scheme and Customizing a View's Drawing for Printing. Just subclass NSBox
, provide rects that are the size of each page and adjust your coordinate system in beginPageInRect:atPlacement:
so the box draws into the rect. You can get the current page number with [[NSPrintOperation currentOperation] currentPage]
so you know what to draw.
更新:事实证明,如果您的视图尺寸正确,您甚至都不需要弄乱坐标系.这是一个非常简单的NSBox子类的示例,该子类仅更改每个页面的标题:
Update: Turns out you don't even need to mess with your coordinate system if your view is already the right size. Here's an example of a very simple NSBox subclass that just changes its title for every page:
@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
方法的作用.
One thing that may not have been obvious is the need to invoke the superclass's implementation of beginPageInRect:atPlacement:
. Also, do not draw in rectForPage:
, it won't work properly—that's the role of the beginPage…
/endPage
methods.
这篇关于在Objective-C中打印多页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!