2011-02-03 11 views
2

現在、私は最終的にiOSに移植する必要があるOSX用のアプリケーションを作成しています。NSViewなしで印刷

印刷する必要があるデータは、CoreGraphicsを介してPDFコンテキストに描画されています。これは完全に動作しています。

iOSとOSXの両方でApple Devのドキュメントを読んでいて、皮肉なことに実際にはiOSからの印刷がより簡単になるようです。

iOSでは、UIPrintInteractionControllerprintingItemプロパティはPDFデータを含むNSDataオブジェクトを取得して印刷できます。かなり直進的でなければならないように見えます。

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のストリームから直接印刷することができますどのように基本的である:(Core Printing Reference経由)

#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関数を使用しないでください。

関連する問題