0

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

我正在阅读 PDF 中的文本并尝试将其转换为 NSString。我可以使用 AppleCGPDFScannerCGPDFString. “fi”连字字符给我带来了麻烦。当我在调试器中查看我的字节数组时,我看到一个 '\f'

所以为了简单起见,假设我有这个字符:

unsigned char myLigatureFromPDF = '\f';

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

unichar whatIWant = 0xFB01;

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

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

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

谢谢!

4

1 回答 1

1

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

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

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

以上适用于所有PDF 和字符串。如果 PDF 中的字体定义包含编码,您的字符串提取方法应该使用它;如果 PDF 包含/ToUnicode字体表,那么您的方法应该再次使用它。如果两者都不包含,您将获得文字字符串内容(并且,您可能不会被告知使用了哪种方法以及它的可靠性)。

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

于 2014-07-19T11:39:10.320 回答