如何在PDF中输出欧元符号

时间:2011-09-21 18:57:28

标签: iphone cocoa pdf currency euro

我正在尝试使用Core Graphics将Euro符号输出到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));

2 个答案:

答案 0 :(得分:2)

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

  
      
  1. 在PDF 1.3中,欧元字符已添加到Adobe标准拉丁字符集中。它在WinAnsiEncoding中编码为200,在PDFDocEncoding中编码为240,分配以前未使用的代码。 Apple将代码333的Mac OS拉丁文编码从货币字符更改为欧元字符。但是,这种不兼容的更改并未反映在PDF的MacRomanEncoding中,后者继续将代码333映射到货币。如果需要欧元字符,可以使用编码字典来指定与MacRomanEncoding的这一差异。
  2.   

答案 1 :(得分:0)

您应该能够使用CGContextShowGlyphsAtPoint来绘制欧元符号。问题是您需要将CGGlyph作为输入传递给该函数,而不是Unicode字符。此外,从Unicode字符到CGGlyphs的映射是字体相关的,通常是非常重要的。 (有时它是一个简单的偏移,您可以根据反复试验来猜测。)

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

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

另外:如果您使用CGContextShowGlyphsAtPoint,则需要将CGContextSelectFont的来电替换为CGContextSetFontCGContextSetFontSize