2011-10-30 11 views
8

Ho utilizzato i seguenti metodi per generare un PDF da un UIView. Tutti loro creare il PDF, ma perde di qualità:iOS - Generazione di PDF da UIView tramite il rendering perde qualità

Metodo 1:

@implementation UIView(PDFWritingAdditions) 

- (void)renderInPDFFile:(NSString*)path 
{ 
    CGRect mediaBox = self.bounds; 
    CGContextRef ctx = CGPDFContextCreateWithURL((__bridge_retained CFURLRef)[NSURL fileURLWithPath:path], &mediaBox, NULL); 
    CGPDFPageRef page; 
    CGContextDrawPDFPage(ctx, page); 

    CGPDFContextBeginPage(ctx, NULL); 

    // Also tried following commented lines but no luck 
    // CGContextSetFlatness(ctx, 0.1); 
    // CGContextSetAllowsAntialiasing(ctx, YES); 
    // CGContextSetAllowsFontSmoothing(ctx, YES); 
    // CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); 
    [self.layer renderInContext:ctx]; 
    CGPDFContextEndPage(ctx); 
    CFRelease(ctx); 
} 

@end 

Metodo 2:

- (void)createPDFfromUIView:(UIView*)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); 
} 

credo di mancare alcune impostazioni per il contesto pdf, non è sicuro. Anche io ho creare un'immagine PNG da UIView con i seguenti metodo che è esattamente lo stesso di qualità:

- (UIImage *)imageFromView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 

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

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:@"pdf.png"]; 

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

Qualcuno può vedere quello che sto facendo male? Grazie.

+0

Come si perde la qualità? –

+0

Ecco il link di visualizzazione originale: e dopo il collegamento pdf: iEamin

+0

possibile duplicato di [Alta qualità UIImmagine dal PDF] (http://stackoverflow.com/questions/14152477/high-quality-uiimage-from-pdf) – nielsbot

risposta

2

Si sta utilizzando un display retina? Potrebbe essere una cosa di contenutoScale. Date un'occhiata a this SO post

EDIT Ok, ora che hai postato prima & dopo pics, vedo che ciò che si desidera che l'UIView fattura essere reso così bello, di alta qualità, dati vettoriali stampabili in formato PDF .

Sono abbastanza sicuro che [CALayer renderInContext] produce sempre dati raster, quindi probabilmente stai meglio costruendo il PDF manualmente. E se parli di fatture fiscali, vuoi davvero che il layout cambi con il prossimo aggiornamento iOS?

Tuttavia, è possibile look at this answer, che suggerisce a malincuore di utilizzare UIView come un modello di sistema per il layout PDF.

+0

No, questo accade con la visualizzazione normale. – iEamin

+0

Ho già creato la vista manualmente per pdf [poiché non è stata ancora trovata alcuna soluzione] e ho usato l'UIView per ottenere punti e colori come riferimenti [in modo che se cambio qualcosa nella vista non devo cambiare il codice]. Ma il link immagine originale che ho aggiunto è generato usando il metodo "imageFromView" e anche un'immagine raster. Quindi, il mio punto è che "renderInContext" dovrebbe essere in grado di generare il pdf della stessa qualità. Inoltre ho provato a creare pdf da quell'immagine, ma senza fortuna. . . stesso problema. – iEamin

+0

È necessario creare il PDF dalle chiamate a CGContextFillRect, CTFontDrawGlyphs, ecc. RenderInContext creerà sempre file PDF raster con una risoluzione dello schermo scadente. –

0

Guardando le tue immagini di esempio, non sono sicuro che le tue aspettative siano giuste ... La tua finestra di anteprima è parzialmente ingrandita, mentre stai disegnando un'immagine bitmap nel tuo PDF - così vedrai i bordi frastagliati 'quando si ingrandisce. Se si visualizzano le dimensioni effettive (dal menu Visualizza in Anteprima o Cmd-0), si dovrebbe vedere un'immagine più o meno identica allo screenshot.

Tuttavia, ciò che si vuole veramente fare non è solo rendere l'UIView bitmap nel contesto PDF, ma piuttosto eseguire il disegno e il layout di CoreGraphics direttamente nel contesto PDF. Guarda questo tutorial http://www.raywenderlich.com/6818/how-to-create-a-pdf-with-quartz-2d-in-ios-5-tutorial-part-2 per un esempio. Ciò garantisce che il testo e le linee rimangano nitidi quando vengono ingranditi e garantiscono un prodotto di qualità se stampato su carta. Quartz2D grafica vettoriale è tuo amico qui, come non otterrete mai una di alta qualità con una bitmap, almeno non senza creare un file PDF enorme ...

0

modificare ok, non è esattamente lo stesso problema, ma Penso che la soluzione sarà simile

Penso che questa sia una vittima di High quality UIImage from PDF

Vedere la mia risposta non:

https://stackoverflow.com/a/14152516/210171

Quando si chiede al PDF la dimensione della pagina, si ottiene una larghezza/altezza per 72 PPI. Potresti provare a creare un contesto scalato usando una trasformazione di scala . Ad esempio, se si desidera eseguire il rendering a 300 dpi, aggiungere una trasformazione di scala in scala di 300.0/72.0.

Se si esporta come TIFF, sarà possibile incapsulare il PPI (300) finale dell'immagine generata.

Problemi correlati