4

複数ページのPDFを印刷したいという状況があります。PDFKitユーティリティクラスやクォーツ関数を使用して、NSViewサブクラスの描画/ページネーションコードを手動で記述するための情報を取得することはできますが、より迅速な代替策は、画面外のPDFViewを作成し、それ自体を印刷するように指示することだと考えていました。 。この解決策を試したところ、印刷ダイアログが消えず、印刷ダイアログの右半分にあるすべての印刷設定コントロールが消え、アプリケーションがフリーズしました。

次に、問題を説明する次の方法で小さなテストアプリケーションを作成しました。USE_PDF_VIEWプリプロセッサマクロを定義せずにテストプログラムをコンパイルすると、空白のビューが正常に表示されます。USE_PDF_VIEWが定義されている場合、ドキュメントは印刷されず、ほとんどの印刷ダイアログコントロールが消え、アプリがフリーズします。目標を達成する方法は他にもありますが、なぜこのショートカットが機能しないのか興味があります。ココアの絵について、まだわからないことがありますか?PDFViewを他のNSViewとはまったく異なる方法で動作させる舞台裏でAppleVoodooMagic(tm)を叩いていますか?

- (void)printMyStuff:(id)sender {

NSPrintInfo *currInfo = [NSPrintInfo sharedPrintInfo];

#ifdef USE_PDF_VIEW


    PDFView *pdfView = [[PDFView alloc] init];
    PDFDocument *pdfDoc = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:@"/Users/wls/Documents/my_document.pdf"]];
    [pdfView setDocument: pdfDoc];
    [pdfView printWithInfo:currInfo autoRotate:YES];


#else

    NSView *myView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 500, 500)];
    NSPrintOperation *myop = [NSPrintOperation printOperationWithView:myView printInfo:currInfo];
    [myop runOperation];


#endif

}
4

4 に答える 4

5

まったく同じ問題がありました。を機能させるには(少なくとも私の場合)PDFViewに追加する必要があります。そうしないと、印刷コントロールが空白になるか、機能しません。NSWindowprintWithInfo:autoRotate:

完全なコードは次のとおりです。

    PDFView *vDoc = [[PDFView alloc] init];
    [vDoc setDocument:pdfDoc];
    [vDoc setAutoScales: YES];
    [vDoc setDisplaysPageBreaks: NO];
    NSWindow *wnd = [[NSWindow alloc] init];
    [wnd setContentSize:vDoc.frame.size];
    [wnd setContentView:vDoc];
    [vDoc printWithInfo:printInfo autoRotate:YES];
    [wnd release];
    [vDoc release];
于 2011-06-01T06:17:42.993 に答える
2

alex-i の優れた回答に基づいて、次の行を追加して、印刷ダイアログがユーザーフレンドリーな場所に表示されるようにしました。

NSRect windowRect = self.window.frame;
NSPoint printTopLeftPoint = NSMakePoint(CGRectGetMidX(windowRect), CGRectGetMaxY(windowRect));
[wnd setFrameTopLeftPoint:printTopLeftPoint];

self.windowは、一時ウィンドウではなく、現在のウィンドウコントローラー用です。

于 2014-03-18T20:08:50.080 に答える
1

PDFViewはNSViewのサブクラスです。NSViewの指定された初期化子は-initWithFrame:...使用しないと、-initWithFrame:奇妙なことが起こる可能性があります。PDFViewには他に指定された初期化子がないので、-initWithFrame:そうです。それは少なくともあなたの問題の一部だと思います。

別の部分は、メモリに関連している可能性があります。ガベージコレクションを使用していますか?もしそうなら、あなたはどこにもあなたのPDFViewへの参照を保持していないので、割り当てが解除されているかもしれません。ガベージコレクションを使用していない場合は、PDFViewがリークしていることになります(これは、ガベージコレクションへの参照がないため、完了したら解放できます)。myView NSViewインスタンスと同じです...GCを使用していない場合は、リークしています。

于 2010-01-13T18:34:42.387 に答える