我对某些 PDF 的日志记录有问题,以控制台一些节点号和字体系列,这使我的应用程序变慢。有人知道如何禁用日志记录吗?
我用过:CGContextDrawPDFPage(context, page);
这不会发生在所有 PDF 上,另一个 SO 问题中的一个解释是当渲染器不知道 PDF 使用的字体时会发生日志记录。我使用的 PDF 是http://dl.dropbox.com/u/861361/test.pdf
仅供参考,我使用的是 3.2 版 iOS (iPad)
我对某些 PDF 的日志记录有问题,以控制台一些节点号和字体系列,这使我的应用程序变慢。有人知道如何禁用日志记录吗?
我用过:CGContextDrawPDFPage(context, page);
这不会发生在所有 PDF 上,另一个 SO 问题中的一个解释是当渲染器不知道 PDF 使用的字体时会发生日志记录。我使用的 PDF 是http://dl.dropbox.com/u/861361/test.pdf
仅供参考,我使用的是 3.2 版 iOS (iPad)
不幸的是,我不知道如何抑制日志记录。
有一种方法可以获取字形并将文本绘制为矢量元素而不是文本,从而避免字体问题。(信用:jegeblad)。字形不是直接的字符。
创建字体:
//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);
这很简洁,但并不能解决整个字体嵌入问题。但是,如果让石英将文本绘制为矢量元素而不是......好吧......文本,我们可以解决这个问题。我们只需使用函数更改文本的绘制方式:
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;
}
通过将剪切路径设置为单个字形并在其后面绘制一个填充的矩形,一次绘制一个字形。我当然已经将当前的填充颜色设置为我想要的文本颜色。
完成后记得释放字体:
CGFontRelease(cgfont)
;
生成的日志会刷新到 STDOUT,如果您真的想要禁用日志记录,请关闭 STDOUT 并将 STDOUT 重定向到 /dev/null 或其他非 STDOUT 的流;)
int fileDes = creat("/dev/null", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(fileDes, STDOUT_FILENO);
close(fileDes);