2012-04-12 21 views
8

Ich habe eine lange HTML-Seite und wollte es in eine mehrseitige PDF-Datei konvertieren.iOS - Erstellen mehrseitiger PDF aus HTML-Inhalt

Ich habe die Anweisungen in apple und here - how to make multi page PDF für einen bestimmten Inhalt Zeichenfolge gefolgt.

Aber die Formatierung des NSString (mit einigen ähnlichen Daten) ist schwieriger als das Erstellen einer HTML-Seite. Ich habe diesen HTML erstellt und in einem UIWebView angezeigt.

Jetzt möchte ich ein PDF aus diesem HTML zu einem Multi-Seite PDF-Datei erstellen.

Der Code, den ich verwende, kann ein einzelnes PDF erstellen.

 
- (void)createPDFfromUIView:(UIWebView *)aView saveToDocumentsWithFileName:(NSString*)aFilename 
{ 
    // Creates a mutable data object for updating with binary data, like a byte array 
    NSMutableData *pdfData = [NSMutableData data]; 

    // Points the pdf converter to the mutable data object and to the UIView to be converted 
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); 
    UIGraphicsBeginPDFPage(); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 


    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData 

    [aView.layer renderInContext:pdfContext]; 

    // remove PDF rendering context 
    UIGraphicsEndPDFContext(); 

    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; 

    // instructs the mutable data object to write its context to a file on disk 
    [pdfData writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 
} 

Kann jemand Hilfe geben?

Antwort

14

Ich habe eine Klasse basierend auf jedem guten Rat erstellt, den ich gefunden habe. Ich habe viel gegraben und hoffe, dass meine Klasse einen guten Start für jeden bietet, der versucht, mehrseitige PDF-Dateien direkt aus einer HTML-Quelle zu erstellen.

Sie werden den ganzen Code hier mit einigen grundlegenden Beispielcode finden: https://github.com/iclems/iOS-htmltopdf

ich, wie Sie gerade das gleiche Problem hatte und meine Anforderungen waren: - voll PDF (real Text, keine Bitmap) - smart mehrere Seiten (im Vergleich zum Schneiden einer vollen Höhe Webview alle X Pixel ...)

So ist die Lösung, die ich benutze, ziemlich schön, da es auf die gleichen Tools iOS verwendet verwendet, um Seiten für den Druck zu teilen.

Lassen Sie mich erklären, ich Setup ein UIPrintPageRenderer basierend auf der Web-Ansicht Druckformatierer- (erste Spitze):

UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init]; 

[render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0]; 

CGRect printableRect = CGRectMake(self.pageMargins.left, 
           self.pageMargins.top, 
           self.pageSize.width - self.pageMargins.left - self.pageMargins.right, 
           self.pageSize.height - self.pageMargins.top - self.pageMargins.bottom); 

CGRect paperRect = CGRectMake(0, 0, self.pageSize.width, self.pageSize.height); 

[render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"]; 
[render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"]; 

NSData *pdfData = [render printToPDF]; 

[pdfData writeToFile: self.PDFpath atomically: YES]; 

In der Zwischenzeit habe ich eine Kategorie UIPrintPageRenderer erstellt zu unterstützen:

-(NSData*) printToPDF 
{ 
    [self doNotRasterizeSubviews:self.view]; 

    NSMutableData *pdfData = [NSMutableData data]; 

    UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 

    [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)]; 

    CGRect bounds = UIGraphicsGetPDFContextBounds(); 

    for (int i = 0 ; i < self.numberOfPages ; i++) 
    { 
     UIGraphicsBeginPDFPage(); 

     [self drawPageAtIndex: i inRect: bounds]; 
    } 

    UIGraphicsEndPDFContext(); 

    return pdfData; 
} 
+0

Wehrung du bist der Mann. Ich habe mir nur die Beispiel-App angesehen und alles was ich gesucht habe. Aber meine Anforderung hat sich geändert und etwas anderes gemacht. Aber das ist großartig. Ich könnte das in Zukunft verwenden. Danke für die Mühe und speziell für die Erklärung der Dinge. – Viraj

+0

Das Problem mit diesem Framework besteht darin, dass es keine Daten in beliebigen Textfeldern erfassen wird. Sie werden alle leer sein. – GuybrushThreepwood

+0

Es funktioniert super !!! außergewöhnlicher Mann !!! – Rudi