Pointer Casten

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

  • Pointer Casten

    Hallo,
    ich möchte in Swift ein PDF erstellen. Aber jetzt hänge ich an einer Stelle an der ich nicht weiterkomme.

    Quellcode

    1. var pageRect = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 300.0)
    2. ​var boxData = CFDataCreate(nil,&pageRect, sizeof (CGRect))


    Die Funktion verlangt an der Stelle &pageRect einen Pointer vom Typ: CConstPointer<UInt8>
    Ich hab schon alle Konstellationen durch um den Pointer des CGRect in den entsprechenden Typ umzuwandeln.
    In C klappt das problemlos mit:

    Quellcode

    1. ​boxData = CFDataCreate(NULL,(const UInt8 *)&pageRect, sizeof (CGRect));
    Manchmal schleiche ich mich mitten in der Nacht an meinen Wecker heran und brülle: "NA, WIE FÜHLT SICH DAS AN!!!"
  • Ich versuche das Beispiel developer.apple.com/library/pr…P30001066-CH214-TPXREF101 (Abschnitt: "Listing 13-4 Creating a PDF file") zu portieren.
    Die Funktion die Aufgerufen wird ist:

    Quellcode

    1. func CFDataCreate(allocator: CFAllocator!, bytes: CConstPointer<UInt8>, length: CFIndex) -> CFData!

    wenn du das meinst.
    Manchmal schleiche ich mich mitten in der Nacht an meinen Wecker heran und brülle: "NA, WIE FÜHLT SICH DAS AN!!!"
  • Über so was bin ich auch schon mal gestolpert. Wie war des??? - Die Lösung war ziemlich einfach, hab aber lange dazu gebraucht, das ich es checke. Ich glaub, ich hab's mittlerweile wieder vergessen, aber probier mal:

    Quellcode

    1. ​let pageRect = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 300.0)
    2. var boxData = CFDataCreate(nil, &pageRect, sizeof (CGRect))
  • Ich verstehe genauso wenig wie gritsch, wie Du darauf kommst, dass CGRect eine würdige Ansammlung von Bytes darstellt, die diese Funktion/Methode verlangt.
    Klar, das Beispiel macht es so. Trotzdem. Übergib für den Test einfach mal nil, so wie es auch in dem Guide steht.
    (nil als Default bedeutet eben, dass ein Standardrechteck genutzt wird.)

    Übersieh vor Allem nicht, dass das Rect zuvor der Funktion CGPDFContextCreateWithURL() als Zeiger auf Zeiger übergeben wurde.
    Du weißt also nicht, was diese Funktion mit den Werten gemacht hat.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    Ich verstehe genauso wenig wie gritsch, wie Du darauf kommst, dass CGRect eine würdige Ansammlung von Bytes darstellt, die diese Funktion/Methode verlangt.
    Klar, das Beispiel macht es so. Trotzdem. Übergib für den Test einfach mal nil, so wie es auch in dem Guide steht.
    (nil als Default bedeutet eben, dass ein Standardrechteck genutzt wird.)

    Übersieh vor Allem nicht, dass das Rect zuvor der Funktion CGPDFContextCreateWithURL() als Zeiger auf Zeiger übergeben wurde.
    Du weißt also nicht, was diese Funktion mit den Werten gemacht hat.

    Mein Problem ist, das ich (noch) gar nicht verstehe wie eine PDF erzeugt wird, deswegen halte ich mich ja auch erst einmal an das Beispiel.

    Übergebe ich nil kommt schon der nächste Fehler in der Zeile

    Quellcode

    1. CFDictionarySetValue(pageDictionary, kCGPDFContextMediaBox, boxData)
    2. 'NSData' is not a subtype of 'CConstVoidPointer'


    Ich poste mal den ganzen Code. Ziel ist es, einfach nur eine leere PDF zu erstellen. Der Inhalt ist dann erst das nächste Problem...

    Quellcode

    1. var file = "/Users/MA/Desktop/TestPDF.pdf"
    2. let url = NSURL.fileURLWithPath(file, isDirectory:false)
    3. var pageRect = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 300.0)
    4. var myDictionary = CFDictionaryCreateMutable(nil, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)
    5. var pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary)
    6. var pageDictionary = CFDictionaryCreateMutable(nil, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)
    7. var boxData = CFDataCreate(nil, nil, sizeof (CGRect))
    8. CFDictionarySetValue(pageDictionary, kCGPDFContextMediaBox, boxData);
    9. CGPDFContextBeginPage (pdfContext, pageDictionary);
    10. // PDF Content
    11. CGPDFContextEndPage (pdfContext)
    12. CGContextRelease (pdfContext)
    13. CFRelease(pageDictionary)
    14. CFRelease(boxData)
    Alles anzeigen
    Manchmal schleiche ich mich mitten in der Nacht an meinen Wecker heran und brülle: "NA, WIE FÜHLT SICH DAS AN!!!"
  • Ich hab einfach mal alles weg gelassen was Fehler verursacht hat, hab eh nicht verstanden wozu das gut war. So geht's jetzt. PDF wird erzeugt.
    Danke für eure Hilfe!

    Quellcode

    1. var file = "/Users/MA/Desktop/TestPDF.pdf"
    2. let url = NSURL.fileURLWithPath(file, isDirectory:false)
    3. var pageRect = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 300.0)
    4. var myDictionary = CFDictionaryCreateMutable(nil, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)
    5. var pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary)
    6. CGPDFContextBeginPage (pdfContext, nil);
    7. // content
    8. CGPDFContextEndPage (pdfContext)
    Manchmal schleiche ich mich mitten in der Nacht an meinen Wecker heran und brülle: "NA, WIE FÜHLT SICH DAS AN!!!"
  • hättest du die dokumentation gelsen wüsstest du auch dass die media-box nur optional ist:

    ​kCGPDFContextMediaBox
    The media box for the document or for a given page. This key is optional. If present, the value of this key must be a CFData object that contains a CGRect(stored by value, not by reference).