Печать NSDocument

Я пытаюсь распечатать документ. Документ представляет собой массив NSImageReps или один NSPDFImageRep, который имеет несколько страниц. У меня возникают проблемы с выяснением, как использовать класс NSPrintOperation для печати этого.

NSPrintOperation, кажется, нужен NSView для печати. Нужно ли вручную добавлять каждое изображение в представление в рассчитанной позиции, а затем разрешить разбиение на страницы? кажется, что это не в духе какао ... есть какая-то техника, которую я пропускаю?

4 голоса | спросил Brian Postow 18 MarpmThu, 18 Mar 2010 22:47:04 +03002010-03-18T22:47:04+03:0010 2010, 22:47:04

4 ответа


0

Для справки в будущем я считаю, что ответ PDFViews. вы можете сразу добавить PDFPage в PDFView (через PDFDocument), а затем распечатать с помощью printWithInfo: autoRotate:

По крайней мере, теоретически я создал вид, и открывается диалоговое окно печати, но когда я нажимаю «печать», диалоговое окно не исчезает ...

Но это другой вопрос.

ответил Brian Postow 19 MaramFri, 19 Mar 2010 00:53:55 +03002010-03-19T00:53:55+03:0012 2010, 00:53:55
0

Несмотря на принятый ответ, он не отвечает на основной вопрос, а лишь дает обходной путь.

У меня была похожая проблема (у меня есть массив объектов, каждый из которых представлен одним и тем же подклассом NSView, по одному на страницу). Вот как я решил это, без всякой барочной чепухи создания одного гигантского представления, которое содержит все страницы ...

1) У нас есть подкласс NSView, с которым связана модель (NSImage в вашем случае, ModelData в моем случае)

class BaseView: NSView {
    var modelData: ModelData /* Whatever your view needs to draw */
    //...
}

2) У нас в контроллере документов есть массив var models: [ModelData].

3) Создайте новый подкласс, который будет представлением принтера.

class PrinterView: BaseView {
    var pageIndex: Int = 1
    var modelArray: [ModelData]

    init(frame: NSRect, models: [ModelData]) {
        self.modelArray = models
        super.init(frame: frame)
    }

    required init?(coder: NSCoder) {
        fatalError("invalid initializer")
    }

    override func knowsPageRange(_ range: NSRangePointer) -> Bool {
        range.pointee.location = 1
        range.pointee.length = self.modelArray.count
        return true
    }

    override func rectForPage(_ page: Int) -> NSRect {
        self.pageIndex = page
        return self.bounds
    }

    override func draw(_ dirtyRect: NSRect) {
        self.model = self.modelArray[self.page - 1] // Pages are 1, not 0, based
        super.draw(dirtyRect)
    }
} // That's it! That's all...

4) Сделайте это в вашем контроллере документов:

override func printOperation(withSettings printSettings: [String : Any]) throws -> NSPrintOperation {
    self.printInfo.horizontalPagination = .fitPagination
    self.printInfo.verticalPagination = .clipPagination
    let printView = PrinterView(size: self.printInfo.paperSize, models: self.models)

    return NSPrintOperation(view: printView, printInfo: self.printInfo)
}
ответил Grimxn 13 PMpThu, 13 Apr 2017 17:36:14 +030036Thursday 2017, 17:36:14
0

Вы не можете напечатать что-то, что нельзя нарисовать. NSView - это то, как вы рисуете то, что хотите напечатать. Вы можете создать подкласс NSView только для печати, который решает, как вы хотите, чтобы печать работала (например, хотите ли вы один NSImageRep для страницы - ЛЮБОГО размера страницы?), Используя методы разбиения на страницы NSView. Просто переопределите knowsPageRange:, чтобы вернуть YES.

ответил Chuck 18 MarpmThu, 18 Mar 2010 23:00:33 +03002010-03-18T23:00:33+03:0011 2010, 23:00:33
0

Вы можете создать вид, отображающий то, что вы хотите напечатать. Затем вы используете его для создания операции печати. ​​

Обычно вы создаете представление, отображающее ваше изображение. Вы реализуете алгоритм, чтобы выяснить, какое изображение вы хотите отобразить на какой странице. Затем вы возвращаете количество страниц, доступных для печати, и реализуете метод для печати конкретной страницы.

  • Если у вас есть 10 изображений и вы хотите распечатать по одной на странице, это просто.
  • Если вы хотите распечатать записи на странице и у вас есть 100 записей, то вы посчитайте, сколько записей вы можете поместиться на странице (используя текущий шрифт размер и количество строк в записи).
  • Затем вы выясните из записей в страница, сколько страниц вам нужно показать все записи - это ваше количество страниц (диапазон страниц).
  • При запросе на печать диапазон страниц, которые вы выбираете записи это должно быть показано на данной странице и показать их.
  • См. ссылки ниже о том, как реализовать эти шаги. См. пользовательская нумерация страниц информация для Пример того, как реализовать эти шаги, это не сложно.

См. Печать тем программирования , или полный пример, на который я ссылаюсь ниже из книги, имеет нумерацию страниц, которую я здесь не включил. Посмотрите на пользовательская нумерация страниц для дополнительных подсказок.

Если у вас есть приложение на основе документов и представление, которое вы хотите выгрузить на принтер, то в нашем MyDocument (или как вы там звоните это) который расширяет NSDocument, который вы бы реализовали:

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps
                                           error:(NSError **)e

Затем представление использует стандартное drawRect: для рисования.

Например, здесь PeopleView просто рисует table информации о людях, требуется NSDictonary людей employees здесь:

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps
                                           error:(NSError **)e
{
    PeopleView * view = [[PeopleView alloc] initWithPeople:employees];
    NSPrintInfo * printInfo = [self printInfo];
    NSPrintOperation * printOp
        = [NSPrintOperation printOperationWithView:view
                                         printInfo:printInfo];
    [view release];
    return printOp;
}

Дополнительную информацию можно найти в главе 27 «Печать» в «Программирование какао для Mac OS X от Hillegass».

ответил stefanB 19 MaramFri, 19 Mar 2010 02:38:06 +03002010-03-19T02:38:06+03:0002 2010, 02:38:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132