2015-12-30 3 views
7

Ich arbeite an einem Zusatz zu meiner TV-App, die das Anzeigen von in der App gespeicherten PDFs ermöglichen würde. Ohne UIWebView weiß ich jedoch nicht, wie das geht. Ich habe an anderen Stellen Fragen gestellt und werde mit einem Link zu einem wortreichen und hilflosen Dokument von Apple über die verwendbaren APIs begrüßt, und auch hier wurde darauf verwiesen (CGPDFPage), aber keine wirkliche Anleitung, wie dies zu implementieren ist . Hat jemand dies erfolgreich auf tvOS getan, und wenn ja, würden Sie mir dabei helfen?Rendern von PDF in Apple TV tvOS

+0

An welchen Link werden Sie gesendet? CGPDFPage wird normalerweise nicht helfen, da es nur "Metadaten" -Informationen über die Seite enthält, aber selbst den Inhalt nicht darstellen kann. Normalerweise ist CGContext in der Lage, eine solche Seite zu übernehmen und zu rendern. aber das könnte sehr gut eine der APIs nicht verfügbar sein (siehe hier, wenn es ist: http://stackoverflow.com/questions/4639781/rendering-a-cgpdfpage-into-a-uiimage) –

Antwort

5

Nachfolgend finden Sie einige Code, den ich schrieb und in tvOS getestet. Beachten Sie, dass dies in Objective-c ist.

Ich habe zwei Funktionen erstellt, um den Job zu erledigen, und eine Hilfsfunktion, um die PDF-Bilder in einem UIScrollView anzuzeigen. Der erste öffnet das PDF-Dokument von einer URL. Eine Web-URL wurde verwendet. In diesem Beispiel könnte auch eine lokale Datei verwendet werden.

Es gibt auch eine Hilfsfunktion, um ein Dokument aus einer lokalen Datei zu öffnen.

Die zweite Funktion rendert das PDF-Dokument in einen Kontext. Ich habe gewählt, um den Kontext anzuzeigen, indem ich ein Bild von ihm erstelle. Es gibt andere Möglichkeiten, mit dem Kontext umzugehen.

Das Öffnen des Dokuments ist ziemlich einfach, daher gibt es keine Kommentare im Code dafür. Das Rendern des Dokuments ist etwas komplizierter, und daher gibt es Kommentare, die diese Funktion erklären.

Die vollständige Anwendung ist unten.

- (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; 
    } 
} 

Und das alles zusammen zu binden, können Sie dies tun:

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

Bitte beachte, dass ich eine zufällige PDF bin mit, die kostenlos im Internet verfügbar war. Ich habe einige Probleme mit https-URLs festgestellt, aber ich bin mir sicher, dass dies gelöst werden kann, und es hängt nicht wirklich mit der PDF-Eröffnungsfrage zusammen.

+0

Danke. Ich werde es versuchen, wenn ich zurück bin. Die meisten PDFs sollten in der App gespeichert werden (denke, ich kann es bekommen und immer noch unter 200 MB Limit sein) – user717452

+0

Schnelle Frage ... Ich habe die App jetzt im Laden mit nur Video-Funktionen und als TVML-App verfügbar. Um es so auszuführen, müsste es eine benutzerdefinierte App sein? – user717452

+0

Leider funktioniert das nicht wirklich, da fast jedes PDF in diesem Projekt mehrere Seiten hat. – user717452

0

Die tvOS-Dokumentation enthält einen Abschnitt über creating, viewing and transforming PDF documents, also denke ich, dass es die Funktionalität enthält, die Sie benötigen.

Es gibt eine Menge Beispielcode auf dieser Seite, aber hier ist ein Code, den ich für den gleichen Zweck auf iOS verwende. Es sollte auf tvOS arbeiten, aber ich habe nicht einen Weg, es zu testen:

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 
} 
Verwandte Themen