Печать нескольких страниц в Objective-C - PullRequest
4 голосов
/ 23 апреля 2011

У меня есть такая функция печати:

- (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. Это отлично работает.

Иногда у меня есть больше информации, которая может поместиться на странице, и поэтому у меня есть кнопки «Следующая страница», которые заполняют sheet представлением Page2, Page3 и т. Д. Путем перезагрузки sheet с соответствующими данными. Это отлично работает.

Теперь, если я хочу распечатать информацию, которая уместится на 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];

Есть какие-нибудь решения? Заранее спасибо.

1 Ответ

1 голос
/ 24 апреля 2011

Вы не можете избежать нумерации страниц с системой печати Какао; как упоминается в вашем комментарии, вам нужно перейти на что-то более низкое.

Однако я не думаю, что должно быть слишком сложно адаптировать то, что вы делаете, к нумерации страниц. Взгляните на Предоставление пользовательской схемы нумерации страниц и Настройка чертежа вида для печати . Просто создайте подкласс NSBox, укажите размеры, равные размеру каждой страницы, и настройте свою систему координат в beginPageInRect:atPlacement:, чтобы прямоугольник отображался в прямоугольнике. Вы можете получить номер текущей страницы с помощью [[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.

...