2015-12-30 22 views
7

Sto lavorando a un'aggiunta alla mia app TVOS che consentirebbe la visualizzazione dei PDF memorizzati nell'app. Tuttavia, senza UIWebView, sono in perdita su come farlo. Ho fatto domande in altri posti, e mi hanno accolto con un link a un documento prolisso e indifeso di Apple sulle API che possono essere utilizzate, e anche qui è stato fatto riferimento (CGPDFPage) ma non una vera guida su come implementare questo . Qualcuno l'ha fatto con successo su tvOS, e se sì, mi aiuterebbe a iniziare in questo processo?Rendering PDF in Apple TV tvOS

+0

Qual è il link che ti viene inviato? Normalmente CGPDFPage non ti aiuterà poiché contiene solo informazioni "metadata" sulla pagina, ma di per sé non può renderne il contenuto. Di solito è CGContext che ha la capacità di prendere una tale pagina e renderla; ma potrebbe benissimo essere una delle API non disponibili (vedi qui se lo è: http://stackoverflow.com/questions/4639781/rendering-a-cgpdfpage-into-a-uiimage) –

risposta

5

Di seguito è riportato un codice che ho scritto e testato in TVOS. Si noti che questo è in Objective-c.

Ho creato due funzioni per eseguire il lavoro e una funzione di supporto per visualizzare le immagini PDF in un UIScrollView. Il primo aprirà il documento PDF da un URL. È stato utilizzato un URL Web. In questo esempio è possibile utilizzare anche un file locale.

C'è anche una funzione di supporto per aprire un documento da un file locale.

La seconda funzione esegue il rendering del documento PDF in un contesto. Ho scelto di visualizzare il contesto creando un'immagine da esso. Ci sono anche altri modi per gestire il contesto.

L'apertura del documento è abbastanza semplice, quindi non ci sono commenti nel codice per questo. Il rendering del documento è leggermente più complicato e quindi ci sono commenti che spiegano tale funzione.

L'applicazione completa è di seguito.

- (CGPDFDocumentRef)openPDFLocal:(NSString *)pdfURL { 
    NSURL* NSUrl = [NSURL fileURLWithPath:pdfURL]; 

    return [self openPDF:NSUrl]; 
} 

- (CGPDFDocumentRef)openPDFURL:(NSString *)pdfURL { 
    NSURL* NSUrl= [NSURL URLWithString:pdfURL]; 

    return [self openPDF:NSUrl]; 
} 

- (CGPDFDocumentRef)openPDF:(NSURL*)NSUrl { 
    CFURLRef url = (CFURLRef)CFBridgingRetain(NSUrl); 

    CGPDFDocumentRef myDocument; 
    myDocument = CGPDFDocumentCreateWithURL(url); 
    if (myDocument == NULL) { 
     NSLog(@"can't open %@", NSUrl); 
     CFRelease (url); 
     return nil; 
    } 
    CFRelease (url); 

    if (CGPDFDocumentGetNumberOfPages(myDocument) == 0) { 
     CGPDFDocumentRelease(myDocument); 
     return nil; 
    } 

    return myDocument; 
} 
- (void)drawDocument:(CGPDFDocumentRef)pdfDocument 
{ 
    // Get the total number of pages for the whole PDF document 
    int totalPages= (int)CGPDFDocumentGetNumberOfPages(pdfDocument); 
    NSMutableArray *pageImages = [[NSMutableArray alloc] init]; 

    // Iterate through the pages and add each page image to an array 
    for (int i = 1; i <= totalPages; i++) { 
     // Get the first page of the PDF document 
     CGPDFPageRef page = CGPDFDocumentGetPage(pdfDocument, i); 
     CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 

     // Begin the image context with the page size 
     // Also get the grapgics context that we will draw to 
     UIGraphicsBeginImageContext(pageRect.size); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     // Rotate the page, so it displays correctly 
     CGContextTranslateCTM(context, 0.0, pageRect.size.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 
     CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, pageRect, 0, true)); 

     // Draw to the graphics context 
     CGContextDrawPDFPage(context, page); 

     // Get an image of the graphics context 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     [pageImages addObject:image]; 
    } 
    // Set the image of the PDF to the current view 
    [self addImagesToScrollView:pageImages]; 
} 

-(void)addImagesToScrollView:(NSMutableArray*)imageArray { 
    int heigth = 0; 
    for (UIImage *image in imageArray) { 
     UIImageView *imgView = [[UIImageView alloc] initWithImage:image]; 
     imgView.frame=CGRectMake(0, heigth, imgView.frame.size.width, imgView.frame.size.height); 
     [_scrollView addSubview:imgView]; 
     heigth += imgView.frame.size.height; 
    } 
} 

E per legare tutto insieme, si può fare questo:

CGPDFDocumentRef pdfDocument = [self openPDFURL:@"http://www.guardiansuk.com/uploads/accreditation/10testing.pdf"]; 
[self drawDocument:pdfDocument]; 

Nota che sto usando un PDF casuale che era disponibile gratuitamente sul web. Ho riscontrato alcuni problemi con gli URL https, ma sono sicuro che questo può essere risolto e non è in realtà correlato alla domanda di apertura del PDF.

+0

Grazie. Darò questo andare quando torno. La maggior parte dei PDF deve essere archiviata nell'app (penso di poterla inserire e rimanere al di sotto del limite di 200 Mb) – user717452

+0

Domanda veloce ... Ora l'app è disponibile nello store con solo le funzioni Video e come app TVML. Per eseguirlo in questo modo, dovrebbe essere un'app personalizzata? – user717452

+0

Sfortunatamente, questo non funzionerà, poiché quasi tutti i PDF coinvolti in questo progetto hanno più pagine. – user717452

0

La documentazione tvOS contiene una sezione su creating, viewing and transforming PDF documents quindi penso che contenga la funzionalità di cui hai bisogno.

C'è un sacco di codice di esempio su quella pagina, ma ecco un codice che uso su iOS per lo stesso scopo. Dovrebbe funzionare su TVOS, ma non ho un modo per provarlo:

func imageForPDF(URL: NSURL, pageNumber: Int, imageWidth: CGFloat) -> UIImage { 
    let document = CGPDFDocumentCreateWithURL(URL) 
    let page = CGPDFDocumentGetPage(document, pageNumber) 
    var pageRect = CGPDFPageGetBoxRect(page, .MediaBox) 
    let scale = imageWidth/pageRect.size.width 
    pageRect.size = CGSizeMake(pageRect.size.width * scale, pageRect.size.height * scale) 
    pageRect.origin = CGPointZero 

    UIGraphicsBeginImageContext(pageRect.size) 
    let ctx = UIGraphicsGetCurrentContext() 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0) // White background 
    CGContextFillRect(ctx, pageRect) 
    CGContextSaveGState(ctx) 

    // Rotate the PDF so that it’s the right way around 
    CGContextTranslateCTM(ctx, 0.0, pageRect.size.height) 
    CGContextScaleCTM(ctx, 1.0, -1.0) 
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(page, .MediaBox, pageRect, 0, true)) 

    CGContextDrawPDFPage(ctx, page) 
    CGContextRestoreGState(ctx) 

    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return image 
}