Malheureusement, je ne sais pas comment supprimer l'enregistrement.
Il existe cependant un moyen d'obtenir les glyphes et de dessiner le texte en tant qu'éléments vectoriels à la place du texte, évitant ainsi les problèmes de polices. (crédit: jegeblad). Les glyphes ne sont pas directement des caractères.
Créer une police:
//NSString * fontName;
CGFont cgfont = CGFontCreateWithFontName ((CFStringRef)fontName);
CGContextSetFont(cg, cgfont);
CGContextSetFontSize(cg, fontSize);
Si l'on veut dessiner par exemple un NSString appelé word..get quelques informations sur le glyphe:
int count = [word.s length];
unichar * buffer = new unichar[count+1];
CGGlyph * glyphs = new CGGlyph[count+1];
int * adv = new int[count+1];
CGRect * rects = new CGRect[count+1];
[word.s getCharacters:buffer];
CGFontGetGlyphsForUnichars(cgfont, buffer, glyphs, [word.s length]);
CGFontGetGlyphAdvances(cgfont,glyphs,count,adv);
CGFontGetGlyphBBoxes(cgfont, glyphs, count, rects);
En d'autres termes, nous obtenons les glyphes pour les lettres du mot, puis nous obtenons les dimensions et les progrès des glyphes individuels. Note: Je n'ai trouvé aucun moyen de déterminer le nombre de glyphes pour un mot. Maintenant, nous sommes prêts à tirer les Glyphes:
CGContextShowGlyphsAtPoint(outputCG, x, y, glyphs,count);
C'est propre mais il ne résout pas tout le problème-incorporation des polices. Cependant, nous pouvons résoudre ce problème si vous obtenez du quartz pour dessiner le texte en tant qu'éléments vectoriels au lieu de ... bien ... du texte. Nous changeons simplement le texte de manière est dessiné en utilisant la fonction:
CGContextSetTextDrawingMode (outputCG, kCGTextClip);
Cela utilisera le texte comme un chemin de découpage au lieu de dessiner simplement. Si nous appelons d'abord CGContextShowGlyphsAtPoint, puis que nous dessinons un rectangle rempli autour de la zone où sont affichés les glyphes, ce rectangle sera découpé en glyphes et, essentiellement, nous dessinons les lettres du mot. Cependant, comme nous dessinons un rectangle et non du texte, le fichier PDF résultant n'inclura pas le texte mais plutôt un ensemble d'éléments vectoriels qui ressemblent à du texte. Par conséquent, Quartz n'a plus besoin d'intégrer les polices dans le fichier PDF. Une façon de le faire est par la boucle suivante:
double scale = ffontSize/double(CGFontGetUnitsPerEm(cgfont));
for (size_t i = 0; i < count; ++i) {
CGContextSaveGState(outputCG);
CGContextShowGlyphsAtPoint(outputCG, x, p.y + spaceH, &glyphs[i], 1);
CGContextBeginPath(outputCG);
CGContextAddRect(outputCG,
CGRectMake(x+scale* rects[i].origin.x , p.y + spaceH + scale*(rects[i].origin.y),
scale*(rects[i].size.width), scale*(rects[i].size.height)));
CGContextFillPath(outputCG);
CGContextRestoreGState(outputCG);
x += adv[i] * scale;
}
dessiner un glyphe à la fois en définissant le chemin de découpe au glyphe et dessiner un rectangle rempli derrière. J'ai bien sûr défini la couleur de remplissage actuelle sur la couleur dans laquelle je veux insérer le texte.
Rappelez-vous de libérer la police lorsque vous avez terminé:
CGFontRelease(cgfont)
;
merci LaN, cette solution fonctionne! – Manny