Как вывести символ евро в PDF - PullRequest
2 голосов
/ 21 сентября 2011

Я пытаюсь вывести символ евро в PDF, используя Core Graphics.У меня есть следующий код, который использует NSMacOSRomanStringEncoding (я должен был использовать это, чтобы символы £ и $ отображались правильно), но символ евро выглядит как ¤

CGRect pageRect = CGRectMake(0, 0, 800, 1150);
CFMutableDataRef pdfData = (CFMutableDataRef) [NSMutableData dataWithCapacity:0];                     
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(pdfData);
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, nil);

CGContextSelectFont(pdfContext, "Helvetica", 15, kCGEncodingMacRoman);
CGContextSetTextDrawingMode (pdfContext, kCGTextFill);
CGContextSetRGBFillColor (pdfContext, 0, 0, 0, 1);
const char *ctext = [@"€" cStringUsingEncoding:NSMacOSRomanStringEncoding];
CGContextShowTextAtPoint(pdfContext, 10, 10, ctext, strlen(ctext));

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Это связано с тем, что MacRomanEncoding по умолчанию не содержит символа евро, см. Эту цитату из "PDF reference 1.7" (Раздел D.1 Латинский набор символов и кодировки):

  1. В PDF 1.3 символ евро был добавлен в стандартный набор символов латинского языка Adobe.Он закодирован как 200 в WinAnsiEncoding и 240 в PDFDocEncoding, назначая коды, которые ранее не использовались.Apple изменила кодировку латинского текста Mac OS для кода 333 с символа валюты на знак евро.Тем не менее, это несовместимое изменение не было отражено в MacRomanEncoding PDF, который продолжает отображать код 333 в валюте.Если требуется знак евро, можно использовать словарь кодирования, чтобы указать это единственное отличие от MacRomanEncoding.
0 голосов
/ 22 сентября 2011

Вы должны использовать CGContextShowGlyphsAtPoint для рисования символа евро. Уловка в том, что вам нужно передать эту функцию CGGlyph в качестве ввода, а не символ Unicode. Кроме того, отображение символов Unicode в CGGlyphs зависит от шрифта и часто нетривиально. (Иногда это простое смещение, которое можно угадать на основе проб и ошибок.)

Похоже, в Core Text есть функция CTFontGetGlyphsForCharacters, которая может выполнять преобразование; Я никогда не использовал это на практике, хотя:

http://developer.apple.com/library/mac/#documentation/Carbon/Reference/CTFontRef/Reference/reference.html

Также: если вы используете CGContextShowGlyphsAtPoint, вам нужно будет заменить вызов на CGContextSelectFont на CGContextSetFont и CGContextSetFontSize.

...