Thumbnail aus PDF Datei

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Thumbnail aus PDF Datei

    Hallo,

    ich würde sehr gerne mit folgendem Code ein Thumbnail meiner Pdf-Dabei erzeugen, leider stürzt der Code dabei ab und ich weiß nicht wirklich weshalb.

    Quellcode

    1. NSString *path = [[NSBundle mainBundle] pathForResource:@"document" ofType:@"pdf"];
    2. NSData *pdfdata = [NSData dataWithContentsOfFile:path];
    3. UIGraphicsBeginImageContext(CGSizeMake(134, 134));
    4. CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithProvider( (CGDataProviderRef)pdfdata);
    5. CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdfRef, 1); // get the first page
    6. CGContextRef contextRef = UIGraphicsGetCurrentContext();
    7. CGContextDrawPDFPage(contextRef, pageRef);
    8. UIImage *imageToReturn = UIGraphicsGetImageFromCurrentImageContext();
    9. // clean up
    10. UIGraphicsEndImageContext();
    11. CGPDFDocumentRelease(pdfRef);
    12. return imageToReturn;
    Alles anzeigen


    document.pdf

    Kann mir jemand sagen, was ich falsch mache? Die Datei liegt dort wo der Pfad hinzeigt, NSData ist auch initialisiert und ich weiß echt nicht, was ich daran tun soll.

    Nachtrag:
    Der Absturz ist behoben. Thumbnail wird aber dennoch nicht erstellt sondern ich erhalte folgende Ausgaben:

    Quellcode

    1. failed to read 64 bytes at offset 0.
    2. failed to read 64 bytes at offset 0.
    3. failed to find PDF header: `%PDF' not found.


    Folgender test ist auch erfolgreich:

    Quellcode

    1. ​- (void)testThumbnailCreation
    2. {
    3. UIImage *thumbnail = [WWMenuDataManager getImageForItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    4. XCTAssert(thumbnail, @"Pass");
    5. }


    Aber das Bild scheint vollständig weis zu sein...

    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DBocksteger ()

  • t-no schrieb:

    DanielBocksteger95 schrieb:

    [[NSBundle mainBundle] pathForResource:@"document" ofType:@"pdf"];

    Das Thumbnail würde ich gar nicht von der App generieren lassen...
    Ansonsten:
    Bist du sicher, dass sich NSData einfach auf CGDataProviderRef casten lässt?


    Da hatte ich Stackoverflow jetzt einfach mal vertraut, ja...

    Nachtrag:
    Der folgende Code macht was ich will :)

    Quellcode

    1. ​NSString *path = [[NSBundle mainBundle] pathForResource:@"document" ofType:@"pdf"];
    2. NSURL* pdfFileUrl = [NSURL fileURLWithPath:path];
    3. CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfFileUrl);
    4. CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);//for the first page
    5. CGRect aRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
    6. UIGraphicsBeginImageContext(aRect.size);
    7. CGContextRef context = UIGraphicsGetCurrentContext();
    8. CGContextSaveGState(context);
    9. CGContextTranslateCTM(context, 0.0, aRect.size.height);
    10. CGContextScaleCTM(context, 1.0, -1.0);
    11. CGContextTranslateCTM(context, -(aRect.origin.x), -(aRect.origin.y));
    12. CGContextSetGrayFillColor(context, 1.0, 1.0);
    13. CGContextFillRect(context, aRect);
    14. CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, aRect, 0, false);
    15. CGContextConcatCTM(context, pdfTransform);
    16. CGContextDrawPDFPage(context, page);
    17. UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext();
    18. CGContextRestoreGState(context);
    19. UIGraphicsEndImageContext();
    20. CGPDFDocumentRelease(pdf);
    21. return thumbnail;
    Alles anzeigen

    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Hallo,

    so allgemein geklugscheißert und als Tipp für die Zukunft…

    Ich habe nur die ersten Zeilen angesehen, aber Du prüfst nicht, ob der String oder die URL nil ist bzw. CGPDFDocumentCreateWithURL NULL etc..

    Du solltest nicht einfach nur Kopieren und auch schon was in der Doku steht.
    Nämlich viele Sachen krachen, wenn etwas nil oder NULL ist. Deshalb löse "Probleme" bevor sie passieren.
    Das solltest Du Dir allgemein angewöhnen, denn damit wird die Software "hochwertiger".

    Viele Grüße
  • little_pixel schrieb:

    Hallo,

    so allgemein geklugscheißert und als Tipp für die Zukunft…

    Ich habe nur die ersten Zeilen angesehen, aber Du prüfst nicht, ob der String oder die URL nil ist bzw. CGPDFDocumentCreateWithURL NULL etc..

    Du solltest nicht einfach nur Kopieren und auch schon was in der Doku steht.
    Nämlich viele Sachen krachen, wenn etwas nil oder NULL ist. Deshalb löse "Probleme" bevor sie passieren.
    Das solltest Du Dir allgemein angewöhnen, denn damit wird die Software "hochwertiger".

    Viele Grüße


    Danke für den Tipp, werde ich mir zu Herzen nehmen. Allerdings - muss ich ehrlich zugeben - hielt ich das ind em Testfall nicht für nötig, da die app einfach nur dazu da war, eben dieses Thumbnail zu erzeugen, um das mal zu testen :) Danke trotzdem!
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • DanielBocksteger95 schrieb:

    Da hatte ich Stackoverflow jetzt einfach mal vertraut, ja...

    Halte ich für eine gewagte These. ;)

    Besser ist es sicherlich, das entsprechende Objekt über CGDataProviderCreateWithCFData zu erzeugen. Das NSData-Objekt kannst du dabei auf CFData casten. Das ist dokumentiert. Oder du öffnest den Provider direkt über die URL bzw. den Pfad.
    „Meine Komplikation hatte eine Komplikation.“