2011-12-23 11 views
5

W aplikacji tworzę, załadować długą stronę HTML w Webview a następnie wydrukować go do formatu PDF przy użyciu następujących:Cocoa strona PDF dzielenie

-(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame 
{ 
    if ([frame isEqual:[[self doc] mainFrame]]) 
    { 
     NSMutableData *newData = [[NSMutableData alloc] init]; 
     NSPrintInfo *newInfo = [NSPrintInfo sharedPrintInfo]; 
     NSView *docView = [[[[self doc] mainFrame] frameView] documentView]; 

     NSPrintOperation *newPrintOp = [NSPrintOperation PDFOperationWithView:docView insideRect:docView.bounds toData:newData printInfo:newInfo]; 

     BOOL runPrint = [newPrintOp runOperation]; 
     if (!runPrint) 
     { 
      NSLog(@"Print Failed"); 
     } 
     PDFDocument *newDoc = [[PDFDocument alloc] initWithData:newData]; 
     [newData release]; 
     [self setPdf:newDoc]; 

     //Other code here 
     } 
    } 

Problemem jest to, że kiedy patrzę pod numerem newDoc jest to ogromny plik PDF z jedną stroną. Wolałbym, aby druk działał tak samo, jak w oknie "zapisz jako plik PDF ...", czyli dzieli plik PDF na wiele stron o rozsądnej wielkości.

Czy ktoś wie, jak to osiągnąć?

I próbował wstawienie następujących po NSPrintInfo *newInfo = [NSPrintInfo sharedPrintInfo];

[newInfo setVerticalPagination:NSAutoPagination]; 
[newInfo setHorizontalPagination:NSAutoPagination]; 

NSAutoPagination opisano w Dokumentach jak:

NSAutoPagination Obraz dzieli się na równe wielkości prostokątów i umieszcza w kolumnie stron. Dostępne w systemie Mac OS X 10.0 i nowszych. Zadeklarowane w NSPrintInfo.h.

Nie miało to żadnego wpływu na drukowany plik PDF.

Odpowiedz

10

Otrzymujesz plik z jedną dużą stroną, ponieważ metoda + PDFOperationWithView: w ogóle nie obsługuje stronicowania. Z tego powodu wywoływanie - setVerticalPagination: lub - setHoriziontalPagination: niczego nie zmienia.

Możesz spróbować użyć metody "klasycznej" + printOperationWithView:printInfo:, skonfigurować ją, aby zapisać plik PDF w tymczasowej lokalizacji, a następnie utworzyć PDFDocument z zawartością uzyskanego pliku. Mam nadzieję, że pomoże nam poniższy fragment kodu.

NSMutableDictionary *dict = [[NSPrintInfo sharedPrintInfo] dictionary]; 
[dict setObject:NSPrintSaveJob forKey:NSPrintJobDisposition]; 
[dict setObject:temporaryFilePath forKey:NSPrintSavePath]; 
NSPrintInfo *pi = [[NSPrintInfo alloc] initWithDictionary:dict]; 
[pi setHorizontalPagination:NSAutoPagination]; 
[pi setVerticalPagination:NSAutoPagination]; 

NSPrintOperation *op = [NSPrintOperation printOperationWithView:[[[webView mainFrame] frameView] documentView] printInfo:pi]; 
[pi release]; 
[op setShowsPrintPanel:NO]; 
[op setShowsProgressPanel:NO]; 

if ([op runOperation]){ 
    PDFDocument *doc = [[[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath: temporaryFilePath]] autorelease]; 
    // do with doc what you want, remove file, etc. 
} 
+0

Doskonała odpowiedź! Jeśli nikt inny nie wymyśli lepszej odpowiedzi w następnym dniu, przyznam ci nagrodę. Dzięki za pomoc. – Daniel

+0

Cóż, nie będę się budzić przy końcu nagrody, więc wygrywasz! – Daniel

+0

To mi pomogło. Niezła odpowiedź. –