2010-12-03 24 views
2

J'ai un problème avec la consignation de certains PDF pour consoler certains numéros de nœuds et la famille de polices, ce qui ralentit mon application. Quelqu'un sait comment désactiver la journalisation? J'ai utilisé: CGContextDrawPDFPage (context, page);Comment désactiver la consignation de console sur certains PDF générés par CGContextDrawPDFPage

Cela ne se produit pas sur tous les fichiers PDF, une explication dans another SO question est que la journalisation se produit lorsque le moteur de rendu ne connaît pas la police utilisée par PDF. Le PDF est je http://dl.dropbox.com/u/861361/test.pdf

Pour votre information, j'utilise la version 3.2 iOS (iPad)

Répondre

0

Les journaux sont générés sont vidées à STDOUT, si vous voulez vraiment désactiver la journalisation, à proximité STDOUT et rediriger STDOUT vers/dev/null ou d'autres cours d'eau qui ne sont pas STDOUT;)

int fileDes = creat("/dev/null", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 
dup2(fileDes, STDOUT_FILENO); 
close(fileDes); 
+0

merci LaN, cette solution fonctionne! – Manny

1

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);

+0

Nous vous remercions de une réponse très détaillée, semble que vous avez une solution de contournement viable, je vais l'essayer d'abord! J'espère que la performance ne souffrira pas. Je vais vous mettre à jour bientôt. – Manny

+0

Malheureusement, cette approche n'a pas fonctionné pour moi ... ne peut même pas réussir à imprimer le pdf sans le texte. – Manny