Печать без NSView - PullRequest
       7

Печать без NSView

2 голосов
/ 03 февраля 2011

В настоящее время я пишу приложение для OSX, которое в конечном итоге нужно будет портировать на iOS.

Данные, которые должны быть напечатаны, переносятся с помощью CoreGraphics в контекст PDF - это прекрасно работает.

Я читал документацию Apple dev по печати как на iOS, так и на OSX, и, как ни странно, на самом деле кажется, что печать с iOS будет проще.

В iOS свойство UIPrintInteractionController *1008* может взять объект NSData, содержащий данные PDF, и распечатать его. Похоже, это должно быть довольно просто.

OSX, с другой стороны, (выглядит так) требует использования класса NSPrintOperation - но, похоже, единственный способ получить данные в экземпляре - через NSView. (+printOperationWithView: или +printOperationWithView:printInfo:).

Поскольку содержимое уже отформатировано и разбито на страницы, кажется, что бессмысленно перерисовывать данные PDF в нечто вроде NSView.

Может ли быть другой способ достижения этого, который я пропустил?

1 Ответ

3 голосов
/ 04 февраля 2011

Этот код ни в коем случае не является полным, но для тех, кто сталкивается с этим позже, это в основном то, как вы можете печатать напрямую из потока NSData:

#define kMimeType @"application/pdf"
#define kPaperType @"A4"
- (void)printData:(NSData *)incomingPrintData {
    CFArrayRef printerList; //will soon be an array of PMPrinter objects
    PMServerCreatePrinterList(kPMServerLocal, &printerList);
    PMPrinter myPrinter;
    //iterate over printerList and determine which one you want, assign to myPrinter

    PMPrintSession printSession;
    PMPrintSettings printSettings;
    PMCreateSession(&printSession);
    PMCreatePrintSettings(&printSettings);
    PMSessionDefaultPrintSettings(printSession, printSettings);

    CFArrayRef paperList;
    PMPrinterGetPaperList(myPrinter, &paperList);
    PMPaper usingPaper;
    //iterate over paperList and to set usingPaper to the paper desired

    PMPageFormat pageFormat;
    PMCreatePageFormatWithPMPaper(&pageFormat, usingPaper);

    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)incomingPrintData);
    PMPrinterPrintWithProvider(myPrinter, printSettings, pageFormat, (CFStringRef)kMimeType, dataProvider);
}

(через Справочник по базовой печати )
Помните, что в этом коде отсутствует управление памятью, поэтому вам нужно будет использовать функции PMRetain() и PMRelease(), а также функции управления памятью CoreFoundation.

Если кто-нибудь может сказать мне, как я могу получить данные из диалога печати OSX в данные, которые я могу использовать в этом методе, я приму их ответ вместо этого. То есть без использования функций Carbon.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...