К сожалению, я не знаю, как подавить регистрацию.
Существует способ получить глифы и нарисовать текст в виде векторных элементов вместо текста, что позволит избежать проблем с шрифтами. (кредит: 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)
;
спасибо LaN, это решение работает! – Manny