2010-12-03 1 views
2

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

Я использовал: CGContextDrawPDFPage (контекст, страница);

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

FYI, я использую версию 3.2 IOS (IPad)

ответ

0

Бревна сгенерированное сбрасывается на STDOUT, если вы действительно хотите отключить ведение журнала, близкий STDOUT и перенаправить STDOUT в/DEV/нуль или другие потоки, которые не является STDOUT;)

int fileDes = creat("/dev/null", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 
dup2(fileDes, STDOUT_FILENO); 
close(fileDes); 
+0

спасибо LaN, это решение работает! – Manny

1

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

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

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

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

Если мы хотим сделать, например, NSString называется word..get некоторую информацию о глифа:

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

Благодарит за очень подробный ответ, кажется, у вас есть жизнеспособный обходной путь, я попробую его первым! Я надеюсь, что производительность не пострадает. Я скоро обновлю вас. – Manny

+0

К сожалению, этот подход не сработал для меня ... даже не удается распечатать PDF без текста. – Manny