首先,此解决方案不适用于连字:
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'

谢谢!

最佳答案

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

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

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

以上适用于所有PDF和字符串。如果PDF中的字体定义包含编码,则您的字符串提取方法应使用该编码;否则,请参见图5。如果PDF包含字体的/ToUnicode表,请再次使用您的方法。如果两者都不包含,则将获取原义字符串内容(并且大概不会通知您使用了哪种方法以及其可靠性如何)。

最后一个脚注:在TeX和LaTeX字体中,连字映射到较低的ASCII代码(以及少量其他非ASCII代码,例如弯引号)。看来您正在阅读通过TeX创建的PDF,但是只能从这种特定编码中推断出。另外,即使您事先知道PDF是通过TeX生成的,也不能保证它确实使用了这种特殊编码,因为是否要翻译是由PDF生成器(而不是TeX本身)自行决定。

10-08 07:31
查看更多