2

一部のノード番号とフォント ファミリをコンソールに出力する特定の PDF のログに問題があり、アプリケーションの速度が低下しています。ロギングを無効にする方法を知っている人はいますか?

私が使用した: CGContextDrawPDFPage(context, page);

これはすべての PDF で発生するわけではありません。別の SO の質問の1 つの説明は、レンダラーが PDF で使用されるフォントを認識していない場合にログが発生することです。私が使用した PDF はhttp://dl.dropbox.com/u/861361/test.pdfです。

参考までに、バージョン 3.2 の iOS (iPad) を使用しています。

4

2 に答える 2

1

残念ながら、ロギングを抑制する方法がわかりません。

ただし、グリフを取得し、テキストではなくベクトル要素としてテキストを描画する方法があるため、フォントの問題を回避できます。(クレジット: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ファイルに埋め込む必要がなくなりました。これを行う1つの方法は、次のループを使用することです。

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

クリッピングパスを個々のグリフに設定し、その後ろに塗りつぶされた長方形を描画して、一度に1つのグリフを描画します。もちろん、現在の塗りつぶしの色を、テキストを入れたい色に設定しました。

完了したら、フォントを解放することを忘れないでください。

CGFontRelease(cgfont);

于 2010-12-03T17:15:03.480 に答える
0

生成されたログは 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);
于 2010-12-09T10:17:51.207 に答える