iphone - 如何禁用 CGContextDrawPDFPage 生成的某些 PDF 上的控制台日志记录

标签 iphone objective-c pdf nslog

我在某些 PDF 日志记录中遇到问题,无法控制某些节点编号和字体系列,这导致我的应用程序变慢。有人知道如何禁用日志记录吗?

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

并非所有 PDF 都会出现这种情况,another SO question 中有一个解释。是当渲染器不知道 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);

这很简洁,但它并不能解决整个字体嵌入问题。然而,如果让 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;
}

通过将剪切路径设置为单个字形并在其后面绘制一个填充矩形,一次绘制一个字形。当然,我已将当前填充颜色设置为我想要文本的颜色。

完成后记得释放字体:

CGFontRelease(cgfont);

关于iphone - 如何禁用 CGContextDrawPDFPage 生成的某些 PDF 上的控制台日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4346557/

相关文章:

ios - 如何在其 subview 之一正在动画时释放 UIView?

php - 在 PDF 中插入换行符

javascript - 如何使用 Objective-C 从 IOS Cordova 中的设备(本地数据库)中删除图像

iphone - 如何为 iPhone 开发可分发的 UI 控件?

ios - '>' 的 Swift String 重载行为

iPhone:将按钮添加到 ScrollView 会使按钮无法交互

iphone - 如何将 UILocatNotification 设置为每天早上 9 点触发

twitter-bootstrap - 使用 rotativa PDF Bootstrap 最小规模

c# - 如何处理 NX Open 中的打开文件错误

iphone - 最好的 windows iphone 应用程序开发替代方案