2015-05-06 75 views
3

在我的Mac應用程序中,我有一個顯示一些html內容的webview。我從該webview創建一個PDFDocument,然後我想打印該文檔。所以我從文檔創建一個PDFView,然後我調用NSPrintOperation printOperationWithView。當顯示打印面板時,除頁面預覽顯示爲空白外,所有顯示都正確,但如果按下詳細信息按鈕,則會刷新面板並正確顯示頁面預覽。Cocoa osx PDFView NSPrintOperation PrintPanel不顯示頁面預覽

我該如何解決這個問題? 需要幫助。提前致謝。

這是我的問題的一個例子:

1的打印面板顯示空白頁面預覽。接下來我按展示細節。

enter image description here

2-刷新頁面預覽顯示正確後面板。

enter image description here

這是我的代碼:

NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo]; 
[printInfo setTopMargin:0.0]; 
[printInfo setBottomMargin:0.0]; 
[printInfo setLeftMargin:0.0]; 
[printInfo setRightMargin:0.0]; 
[printInfo setHorizontalPagination:NSFitPagination]; 
[printInfo setVerticalPagination:NSAutoPagination]; 
[printInfo setVerticallyCentered:NO]; 
[printInfo setHorizontallyCentered:YES]; 

NSData *pdfFinal = [[[[webView mainFrame] frameView] documentView] dataWithPDFInsideRect:[[[webView mainFrame] frameView] documentView].frame]; 

PDFDocument *doc = [[PDFDocument alloc] initWithData:pdfFinal]; 
PDFView *pdfView = [[PDFView alloc] init]; 
[pdfView setDocument:doc]; 

NSPrintOperation *op; 
op = [NSPrintOperation printOperationWithView:pdfView.documentView printInfo:printInfo]; 

[op setShowsProgressPanel:YES]; 
[op setShowsPrintPanel:YES]; 
[op runOperation]; 

回答

1

在猜測,因爲PDFViewNSView一個子類,它指定初始化爲-initWithFrame:,不-init,你要PDFView *pdfView = [[PDFView alloc] init]呼叫可能不被允許PDFView來設置它的初始狀態,雖然隨後調用它的機器可能會奇蹟般地爲你解決這個狀態,但是NSView和子類往往表現奇怪(特別是關於繪圖),當你d不要使用合適的指定初始值設定項(這意味着它的框架和邊界等於NSZeroRect)。

嘗試使用-initWithFrame:與一些合理的,非零的矩形。

更新

好了,只是胡亂瞎猜,但NSPrintOperation的文件說,-runOperation塊主線程和建議使用-runOperationModalForWindow:delegate:didRunSelector:contextInfo:完全避免阻塞主線程。是否有可能通過阻止主線程阻止其他人進行其初始工作(我會將這種情況稱爲無證行爲或API錯誤,但是......)?嘗試實施模式版本,看看是否有幫助。如果沒有,我實際上會向Apple提交一份錯誤報告。

+0

謝謝你的答案。我嘗試使用initWithFrame,但問題仍然存在:S – user3065901

+1

runOperationModalForWindow do not't help – Borzh

+0

很高興看到您找到了一個工作解決方案 - upvote for your answer。 :-) –

2

this鏈接:

PDFDocument *doc = ...; 

// Invoke private method. 
// NOTE: Use NSInvocation because one argument is a BOOL type. Alternately, you could declare the method in a category and just call it. 
BOOL autoRotate = NO; // Set accordingly. 
NSMethodSignature *signature = [PDFDocument instanceMethodSignatureForSelector:@selector(getPrintOperationForPrintInfo:autoRotate:)]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setSelector:@selector(getPrintOperationForPrintInfo:autoRotate:)]; 
[invocation setArgument:&printInfo atIndex:2]; 
[invocation setArgument:&autoRotate atIndex:3]; 
[invocation invokeWithTarget:doc]; 

// Grab the returned print operation. 
void *result; 
[invocation getReturnValue:&result]; 

NSPrintOperation *op = (__bridge NSPrintOperation *)result; 
[op setShowsPrintPanel:YES]; 
[op setShowsProgressPanel:YES]; 
[op runOperation]; 

這部作品OSX從10.4到10.10(優勝美地)。

編輯:你也可以看到this答案是類似的,但用較少的代碼行。