2

我正在尝试使用 Core Graphics 将欧元符号输出到 PDF。我有以下代码,它使用 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));
4

2 回答 2

2

那是因为MacRomanEncoding默认情况下不包含欧元符号,请参阅“PDF 参考 1.7”(第 D.1 节拉丁字符集和编码)中的此引用:

  1. 在 PDF 1.3 中,欧元字符被添加到 Adob​​e 标准拉丁字符集中。它在 WinAnsiEncoding 中编码为 200,在 PDFDocEncoding 中编码为 240,分配以前未使用的代码。Apple 将代码 333 的 Mac OS 拉丁文本编码从货币字符更改为欧元字符。然而,这种不兼容的变化并没有反映在 PDF 的 MacRomanEncoding 中,它继续将代码 333 映射到货币。如果需要欧元字符,则可以使用编码字典来指定与 MacRomanEncoding 的唯一区别。
于 2011-09-21T19:11:17.060 回答
0

您应该能够使用CGContextShowGlyphsAtPoint来绘制欧元符号。问题是您需要将该函数 aCGGlyph作为输入传递,而不是 Unicode 字符。此外,从 Unicode 字符到 的映射CGGlyphs是依赖于字体的,而且通常很重要。(有时它是一个简单的偏移量,您可以根据试验和错误猜测。)

看起来 Core Text 有一个CTFontGetGlyphsForCharacters可以执行转换的函数;不过,我从未在实践中使用过它:

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

另外:如果您使用CGContextShowGlyphsAtPoint,则需要将调用替换CGContextSelectFontCGContextSetFontand CGContextSetFontSize

于 2011-09-22T10:01:05.520 回答