2011-02-03 3 views
2

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

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

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

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

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

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

Возможно ли быть другим способом достижения этого, что я пропустил?

+0

Обнаружили полезную информацию: [Ссылка на основную печать] (http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CorePrintRef/Reference/reference.html) - 'PMPrinterPrintWithProvider' выглядит он может выполнить эту работу, но если у кого-то есть другое или, надеюсь, лучшее предложение, пожалуйста, опубликуйте его! – arrtchiu

+0

Я предлагаю опубликовать это как ответ. –

+0

@PeterHosey: Я бы это сделал, поэтому для этого требуется много кода и не позволяет пользователю изменять какие-либо настройки с помощью встроенных диалоговых окон OSX. Кроме того, такие вещи, как установка размера бумаги, не документируются. Будет продолжать искать альтернативное решение. – arrtchiu

ответ

3

Этот код далеко не полный, но для тех, кто приходит через это позже, это в основном, как можно печатать непосредственно из потока 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); 
} 

(через Core Printing Reference)
Берегись этот код не хватает управления памятью, поэтому вам понадобятся функции PMRetain() и PMRelease(), а также функции управления памятью CoreFoundation.

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

Смежные вопросы