Как отключить консольное ведение журнала для определенного PDF, созданного CGContextDrawPDFPage - PullRequest
2 голосов
/ 03 декабря 2010

У меня проблема с журналированием некоторых PDF-файлов для поддержки некоторых номеров узлов и семейства шрифтов, и это замедляет работу моего приложения. Кто-нибудь знает, как отключить ведение журнала?

Я использовал: CGContextDrawPDFPage (context, page);

Это происходит не во всех PDF-файлах, одно объяснение в другой вопрос SO состоит в том, что регистрация происходит, когда средство визуализации не знает шрифта, используемого PDF. PDF я использовал http://dl.dropbox.com/u/861361/test.pdf

К вашему сведению, я использую iOS версии 3.2 (iPad)

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

К сожалению, я не знаю, как подавить регистрацию.

Хотя есть способ получить глифы и нарисовать текст как векторные элементы вместо текста, что позволяет избежать проблем со шрифтами. (кредит: jegeblad ). Глифы не являются непосредственно символами.

Создать шрифт:

//NSString * fontName;
CGFont cgfont = CGFontCreateWithFontName ((CFStringRef)fontName);
CGContextSetFont(cg, cgfont);
CGContextSetFontSize(cg, fontSize);

Если мы хотим нарисовать, например, строка NSS с именем word..получите информацию о глифе:

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

0 голосов
/ 09 декабря 2010

Сгенерированные журналы сбрасываются в 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...