2012-09-23 7 views
7

Ich möchte ein gut aussehendes PDF in meiner iOS 6 App erstellen.Wie kann ich ein PDF mit "echtem" Textinhalt auf iOS generieren?

Ich habe versucht:

  • UIView in Zusammenhang machen
  • Mit Core
  • Mit NSString drawInRect
  • Mit UILabel drawRect

Hier ein Codebeispiel ist:

-(CGContextRef) createPDFContext:(CGRect)inMediaBox path:(NSString *) path 
{ 
    CGContextRef myOutContext = NULL; 
    NSURL * url; 

    url = [NSURL fileURLWithPath:path]; 
    if (url != NULL) { 
     myOutContext = CGPDFContextCreateWithURL ((__bridge CFURLRef) url, 
                &inMediaBox, 
                NULL); 
    } 


    return myOutContext; 
} 

-(void)savePdf:(NSString *)outputPath 
{ 
    if (!pageViews.count) 
     return; 

    UIView * first = [pageViews objectAtIndex:0]; 

    CGContextRef pdfContext = [self createPDFContext:CGRectMake(0, 0, first.frame.size.width, first.frame.size.height) path:outputPath]; 

    for(UIView * v in pageViews) 
    { 
     CGContextBeginPage (pdfContext,nil); 
     CGAffineTransform transform = CGAffineTransformIdentity; 
     transform = CGAffineTransformMakeTranslation(0, (int)(v.frame.size.height)); 
     transform = CGAffineTransformScale(transform, 1, -1); 
     CGContextConcatCTM(pdfContext, transform); 

     CGContextSetFillColorWithColor(pdfContext, [UIColor whiteColor].CGColor); 
     CGContextFillRect(pdfContext, v.frame); 

     [v.layer renderInContext:pdfContext]; 

     CGContextEndPage (pdfContext); 
    } 

    CGContextRelease (pdfContext); 
} 

Die UIViews, die gerendert werden, enthalten nur eine UIImageView + eine Reihe von UILabels (einige mit und einige ohne Rahmen).

Ich versuchte auch, einen Vorschlag auf Stackoverflow gefunden: Subklassen UILabel und dies zu tun:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    BOOL isPDF = !CGRectIsEmpty(UIGraphicsGetPDFContextBounds()); 
    if (!layer.shouldRasterize && isPDF) 
     [self drawRect:self.bounds]; // draw unrasterized 
    else 
     [super drawLayer:layer inContext:ctx]; 
} 

Aber das änderte nichts entweder.

Egal, was ich tue, beim Öffnen der PDF in Vorschau die Textteile sind als Block auswählbar, aber nicht Zeichen für Zeichen, und das Zoomen der pdf zeigt, dass es tatsächlich ein Bitmap-Bild ist.

Irgendwelche Vorschläge?

+0

Können Sie ein Beispielcodefragment und die PDF-Ausgabedatei posten, damit ich sie mir ansehen kann? – iPDFdev

+0

Haben Sie das jemals herausgefunden? Das Problem "Blockauswahl" erleben. – JeremyDay

+0

Scheint jetzt nicht zu passieren mit: 'UIGraphicsBeginPDFContextToFile (outputPath, view.bounds, nil); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); [view.layer renderInContext: pdfContext]; UIGraphicsEndPDFContext(); ' – JeremyDay

Antwort

2
+1

Ich mache etwas ähnliches, und das PDF sieht gut aus, aber der Text ist kein echter Text, sondern ein gerendertes Bild. Ich möchte ein PDF mit auswählbarem Text erstellen –

+0

Aber ich habe das gleiche Tutorial verwendet und es funktioniert auch perfekt für mich beim Zoomen. –

+0

Er bedeutet auswählbar - wie mit dem Cursor auf einem Mac (Kopieren, Einfügen usw.) –

1

Meine Erfahrung, als ich das letzte Jahr gemacht habe, war, dass Apple keine Bibliothek zur Verfügung gestellt hat. Ich habe schließlich eine Open-Source-C-Bibliothek (libHaru) importiert. Dann fügte ich eine Funktion für die Ausgabe in jeder Klasse in meiner Ansichtshierarchie hinzu. Jede Ansicht mit Unteransichten würde das Rendern der Unteransichten aufrufen. Meine UILabels, UITextFields, UIImageViews, UISwitches usw. würden ihren Inhalt entweder als Text oder Grafik ausgeben, dementsprechend habe ich auch Hintergrundfarben für einige Ansichten gerendert.

Es war nicht sehr entmutigend, aber LibHaru gab mir ein paar Probleme mit den Schriften, so dass ich am Ende nur die Standardschriftart und Schriftgröße verwendet.

+0

Ich werde mir das ansehen. Vielen Dank –