Iphone 如何在CGContextDrawPDFPage生成的特定PDF上禁用控制台日志记录

Iphone 如何在CGContextDrawPDFPage生成的特定PDF上禁用控制台日志记录,iphone,objective-c,pdf,nslog,Iphone,Objective C,Pdf,Nslog,我有一个问题,某些PDF的日志,以控制台一些节点号和字体家族,这是使我的应用程序缓慢。有人知道如何禁用日志记录吗 我用过: CGContextDrawPDFPage(上下文,页面) 这并不是在所有PDF上都会发生,中的一个解释是,当呈现器不知道PDF使用的字体时,会发生日志记录。我使用的PDF是 仅供参考,我使用的是3.2版iOS(iPad)不幸的是,我不知道如何抑制日志记录 有一种方法可以获得字形,并将文本绘制为矢量元素,而不是文本,从而避免字体问题。(信用证:)。字形不是直接的字符 创建字体

我有一个问题,某些PDF的日志,以控制台一些节点号和字体家族,这是使我的应用程序缓慢。有人知道如何禁用日志记录吗

我用过: CGContextDrawPDFPage(上下文,页面)

这并不是在所有PDF上都会发生,中的一个解释是,当呈现器不知道PDF使用的字体时,会发生日志记录。我使用的PDF是


仅供参考,我使用的是3.2版iOS(iPad)

不幸的是,我不知道如何抑制日志记录

有一种方法可以获得字形,并将文本绘制为矢量元素,而不是文本,从而避免字体问题。(信用证:)。字形不是直接的字符

创建字体:

//NSString * fontName;
CGFont cgfont = CGFontCreateWithFontName ((CFStringRef)fontName);
CGContextSetFont(cg, cgfont);
CGContextSetFontSize(cg, fontSize);
如果我们希望绘制一个名为word.的NSString,请获取有关字形的信息:

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);
换句话说,我们得到单词字母的字形,然后我们得到单个字形的尺寸和前进方向。注意:我找不到任何方法来确定一个单词的字形数。 现在,我们准备绘制图示符:

CGContextShowGlyphsAtPoint(outputCG, x, y, glyphs,count);
这很好,但不能解决整个字体嵌入问题。但是,如果让quartz将文本绘制为矢量元素而不是。。。好。。。文本。我们只需使用以下函数更改文本的绘制方式:

CGContextSetTextDrawingMode (outputCG, kCGTextClip);
这将使用文本作为剪切路径,而不是简单地绘制它。如果我们首先调用CGContextShowGlyphsAtPoint,然后围绕图示符显示的区域绘制一个填充矩形,该矩形将被剪裁到图示符上,基本上我们绘制的是单词的字母。但是,由于我们绘制的是矩形而不是文本,因此生成的PDF文件将不包含文本,而是一组看起来像文本的向量元素。因此,Quartz不再需要在PDF文件中嵌入字体。执行此操作的一种方法是通过以下循环:

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;
}
double scale=ffontSize/double(CGFontGetUnitsPerEm(cgfont));
用于(大小i=0;i
通过将剪裁路径设置为单个图示符并在其后面绘制填充矩形,一次绘制一个图示符。当然,我已经将当前填充颜色设置为我想要文本的颜色

完成后,请记住释放字体:


CGFontRelease(cgfont)

生成的日志将刷新到标准输出,如果确实要禁用日志记录,请关闭标准输出并将标准输出重定向到/dev/null或其他非标准输出的流;)


谢谢你非常详细的回复,看来你有一个可行的解决办法,我会先试试!我希望演出不会受到影响。我会很快告诉你最新情况。遗憾的是,这种方法对我不起作用。。。甚至无法在没有文本的情况下打印pdf。
int fileDes = creat("/dev/null", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(fileDes, STDOUT_FILENO);
close(fileDes);