Sonntag, Dezember 8, 2019

So erstellen Sie eine PDF-Datei in iOS programmgesteuert?

Möchte ich eine PDF-Datei erstellen in iOS ,es sollte in einer Tabelle in der PDF, die gefüllt ist von einem array. Ich habe bereits in Google gesucht, aber war nicht erfolgreich. Jede Hilfe ist willkommen

1 Kommentar

  1. 1

    Etwas wie routine zum Rendern der text:

    - (CFRange)renderTextRange:(CFRange)currentRange andFrameSetter:(CTFramesetterRef)frameSetter intoRect:(CGRect)frameRect {
    CGMutablePathRef framePath = CGPathCreateMutable();
    CGPathAddRect(framePath, NULL, frameRect);
    CTFrameRef frameRef = CTFramesetterCreateFrame(frameSetter, currentRange, framePath, NULL);
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(currentContext);
    CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);  
    CGContextTranslateCTM(currentContext, 0, 792); 
    CGContextScaleCTM(currentContext, 1.0, -1.0);
    CTFrameDraw(frameRef, currentContext);
    CGContextRestoreGState(currentContext);
    CGPathRelease(framePath);
    currentRange = CTFrameGetVisibleStringRange(frameRef);
    currentRange.location += currentRange.length;
    currentRange.length = 0;
    CFRelease(frameRef);
    return currentRange;
    }

    Und den folgenden code-snippet, welches es nennt, vorausgesetzt, Sie haben den Zusammenhang und die Schriften etc erstellt und in die entsprechenden Variablen. Die folgende Schleife einfach baut sich der text Zeile für Zeile in eine NSMutableAttributedString das kannst du dann Rendern:

    CTFontRef splainFont = CTFontCreateWithName(CFSTR("Helvetica"), 10.0f, NULL);
    CGFloat margin = 32.0f;
    CGFloat sink = 8.0f;
    
    NSMutableAttributedString *mainAttributedString = [[NSMutableAttributedString alloc] init];
    NSMutableString *mainString = [[NSMutableString alloc] init];
    
    //Ingredients is an NSArray of NSDictionaries
    //But yours could be anything, or just an array of text.
    for (Ingredient *ingredient in ingredients) {
        NSString *ingredientText = [NSString stringWithFormat:@"%@\t%@
            \n",ingredient.amount,ingredient.name];
        [mainString appendString:ingredientText];
        NSMutableAttributedString *ingredientAttributedText =
            [[NSMutableAttributedString alloc] initWithString:ingredientText];
        [ingredientAttributedText addAttribute:(NSString *)(kCTFontAttributeName)
            value:(id)splainFont
            range:NSMakeRange(0, [ingredientText length])];
        [mainAttributedString appendAttributedString:ingredientAttributedText];
        [ingredientAttributedText release];
    }

    Nun hast du dein array geschrieben mit newlines zu einem NSMutableAttributedString Sie machen kann es, je nach text, den Sie möchten, könnte es Rendern in einer Schleife, bis die gerendert Standort passt Ihr text Länge. So etwas wie:

    //Render Main text.
    CTFramesetterRef mainSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mainAttributedString);
    currentRange = [KookaDIS renderTextRange:currentRange 
        andFrameSetter:mainSetter 
        intoRect:pageRect];
    
    //If not finished create new page and loop until we are.
    while (!done) {
        UIGraphicsBeginPDFPageWithInfo(pageRect, nil);
    
        currentRange = [self renderTextRange:currentRange 
            andFrameSetter:mainSetter 
            intoRect:pageRect];
    
        if (currentRange.location >= [mainString length]) {
            done = TRUE;
        }
    }

    Den obigen code benötigen einiges an Anpassung, ich bin mir sicher, dass es gehackt, aus der ein Projekt meiner eigenen, so dass einige Variablen (wie der frame setter) nicht vorhanden sein und Sie müssen schließen Sie die PDF-Datei Kontext-und release-Variablen usw. Beachten Sie, wie mainString wird verwendet, um zu bestimmen, Wann wurde der text gerendert.

    Sollte es geben, klar genug, und die Angabe, wie eine Schleife um ein array oder eine andere Gruppe zu Rendern eine beliebige Länge von text in einem Dokument.

    Geringfügige änderungen an der while-Schleife und der render vor der Eingabe können Sie die Darstellung von text in mehreren Spalten zu.

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...