Quartz / PDF

POUNAS

Membre confirmé
3 Juillet 2011
35
0
Bonjour à toutes et à tous,

je souhaite générer via Quartz un PDF.

voici le code de l'initialisation du Pdf :

Bloc de code:
   CGContextRef pdfContext;
    
    CFStringRef path;
    
    CFURLRef url;
    
    CFDataRef boxData = NULL;
    
    CFMutableDictionaryRef myDictionary = NULL;
    CFMutableDictionaryRef pageDictionary = NULL;
    
    const char * namePDF = [@"myPDF" cStringUsingEncoding:NSUTF8StringEncoding];
    
    path = CFStringCreateWithCString (NULL, namePDF, 
                                      kCFStringEncodingUTF8);
    
    url = CFURLCreateWithFileSystemPath (NULL, path, 
                                         kCFURLPOSIXPathStyle, 0);
    
    myDictionary = CFDictionaryCreateMutable(NULL, 0,
                                             &kCFTypeDictionaryKeyCallBacks,
                                             &kCFTypeDictionaryValueCallBacks); 
    
    CFDictionarySetValue(myDictionary, kCGPDFContextTitle, path);
    
    CFRelease (path);
    
    CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("__xxx__"));
    
    pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary);
    
    CFRelease(myDictionary);
    CFRelease(url);
    
    pageDictionary = CFDictionaryCreateMutable(NULL, 0,
                                               &kCFTypeDictionaryKeyCallBacks,
                                               &kCFTypeDictionaryValueCallBacks);
    
    boxData = CFDataCreate(NULL,(const UInt8 *)&pageRect, sizeof (CGRect));
    CFDictionarySetValue(pageDictionary, kCGPDFContextMediaBox, boxData);
    
    CGPDFContextBeginPage (pdfContext, myDictionary); 
    
    // draw content of document...
    ...
    
    CGPDFContextEndPage (pdfContext);
    
    CGContextRelease (pdfContext);
    
    CFRelease(pageDictionary); 
    CFRelease(boxData);

ok pas de problème pour l'initialisation du PDF.

je souhaite écrire 2 lignes de texte (dans la partie du code // draw content of document...).

La première est dessinée correctement sur le PDF - ok.

La deuxième n'apparait pas !!!

voici le code pour écrire le texte dans le PDF :

Bloc de code:
- (void) drawText : (CGContextRef) myContext : (CGRect) contextRect : (NSMutableAttributedString *) text : (const char *) nameFont : (struct tColor) foreground : (struct tColor) background
{
    float w, h;
    
    w = contextRect.size.width;
    h = contextRect.size.height;
    
    if (![[text string] isEqualToString: @""]) {         
        CGContextSetRGBFillColor(myContext, background.red, background.green, background.blue, 0.8);
        
        CGContextFillRect(myContext, NSMakeRect(px, py, w, h + 2));
        
        CGContextSelectFont (myContext, 
                             nameFont,
                             [NSFont systemFontSize],
                             kCGEncodingMacRoman);
        
        CGContextSetCharacterSpacing (myContext, 1); 
        CGContextSetTextDrawingMode (myContext, kCGTextFillClip);
        
        CGContextSetRGBFillColor (myContext, foreground.red, foreground.green, foreground.blue, 1.0); 
        
        const char * txt = [[text string] cStringUsingEncoding:NSUTF8StringEncoding];
        
        CGContextShowTextAtPoint (myContext, px, py + 4, txt, [[text string] length]);
    }
}

ce qui est bizarre c'est que je peux écrire soit l'une soit l'autre mais pas les 2 !!!

pourtant le CGContextRef est de taille largement suffisante.

je pense qu'il faut un seul CGContextRef par PDF, il suffit ensuite de dessiner ce qu'on y veut ?

si vous avez une idée, ne pas hésiter...

merci par avance :)
 
merci pour l'info.

mais je suis sous Os X non sous IOS.

donc "CGContextRef context = UIGraphicsGetCurrentContext();" ne marche pas.

comment faire un save et un restore dans ce cas ?

merci.

---------- Nouveau message ajouté à 16h15 ---------- Le message précédent a été envoyé à 16h04 ----------

j'ai trouvé c'est "CGContextSaveGState" pour le save-state et "CGContextRestoreGState" pour le restore-save.

j'ai toujours le même problème.

ma première ligne est bien écrite dans le PDF.

je sauvegarde (après première ligne) et restore le contexte (avant l'écriture de la deuxième ligne).

Elle n'apparait toujours pas sur mon PDF !

Est-ce bien un problème de contexte ?
 
j'ai trouvé la source du problème.

"CGContextSetTextDrawingMode (myContext, kCGTextFill);"

et non KCGTextFillClip !

:up: :)
 
c'est sur si tu clips :rateau:

NOTA: le concept de save/restore c'est pareil sur n'importe quelle framework graphique et ca depuis tres tres longtemps crois moi :)
 

Sujets similaires