从PDF到unichar或NSString读取特殊字符字节

时间:2014-07-18 23:43:12

标签: ios pdf text nsstring ligature

首先,此解决方案不适用于连字: Convert or Print CGPDFStringRef string

我正在从PDF中读取文本并尝试将其转换为NSString。我可以使用Apple的CGPDFScannerCGPDFString的形式获取文本的字节数组。 “fi”结合角色给我带来了麻烦。当我在调试器中查看我的字节数组时,我看到'\ f'

为了简单起见,我们可以说我有这个字符:

unsigned char myLigatureFromPDF = '\f';

最终我想把它转换成这个(“fi”连字的unicode值):

unichar whatIWant = 0xFB01;

这是我失败的尝试(我从PDFKitten btw复制了这个):

 const char str[] = {myLigatureFromPDF, '\0'};
    NSString* stringEncodedLigature = [NSString stringWithCString:str encoding:NSUTF8StringEncoding];
    unichar encodedLigature = [stringEncodedLigature characterAtIndex:0];

如果有人能告诉我如何做到这一点会很棒  另外,作为旁注,调试器如何解释未编码的字节数组,换句话说,当我将鼠标悬停在数组上时,它如何知道显示'\ f'

谢谢!

1 个答案:

答案 0 :(得分:1)

每个PDF解析器的功能都受到PDF规范中一个重要点的限制:文字字符串中的字符被编码为字节或单词,但编码不需要包含在文件中

例如,如果包含字体的子集,其中代码“1”对应于“h”的图像(字符字形),代码“2”映射到字形“a”,字符串(\1\2\1\2)将按预期显示“haha”。 但是如果PDF中没有关于该字体中的字形如何与Unicode对应的更多信息,则字符串解码器无法找到正确的字符代码“字形#1“和”字形#2“。

似乎您的测试PDF确实包含该信息 - 否则,它如何推断“常规”字符的正确字符? - 但在这种情况下,为方便起见,“常规”字符只是重新映射到其他二进制代码。另外,为方便起见,单个字符“fi”的字形以原始字体(或包含在文件中的子集)重新映射到“0x0C”。但是,如果文件不包含字符代码和Unicode值之间的转换表,则无法检索正确的代码。

所有 PDF和字符串都是如此。如果PDF中的字体定义包含编码,则字符串提取方法应使用它;如果PDF包含该字体的/ToUnicode表,则您的方法应该再次使用它。如果它既不包含,那么你会得到文字字符串内容(并且,大概你不知道使用了哪种方法以及它有多可靠)。

作为最后一个脚注:在TeX和LaTeX字体中,连字被映射到较低的ASCII码(以及其他非ASCII码的一小部分,例如卷曲引号)。您似乎正在阅读通过TeX在此处创建的PDF - 但这只能通过此特定编码推断。此外,即使您事先知道PDF是通过TeX生成的,也不能保证 使用此特定编码,因为翻译或不翻译的决定由PDF生成器自行决定,而不是TeX本身。