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

标签 ios pdf text nsstring ligature

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

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

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

unsigned char myLigatureFromPDF = '\f';

最终我想将其转换为这个(“fi”连字的 unicode 值):

unichar whatIWant = 0xFB01;

这是我失败的尝试(顺便说一句,我从 PDFKitten 复制了此内容):

 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 中的字体定义包含编码,您的字符串提取方法应该使用它;如果 PDF 包含字体的 /ToUnicode 表,同样,您的方法应该使用它。如果两者都不包含,您将获得文字字符串内容(而且,您可能不会被告知使用了哪种方法以及它的可靠性)。

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

关于ios - 从 PDF 读取特殊字符字节到 unichar 或 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835274/

相关文章:

ios - 为什么 typedef 是一个 block 而不是使用普通的 block ?

pdf - 使用 Solr 用页码索引 PDF

python - 在 iPython Notebook 中查看 pdf 图像

text - 为什么纯文本技术文章经常将术语括在反引号和单引号中?

iphone - canSendText 返回 false

ios - 如何在顶部中心设置标签

ios - 如何避免父 View Controller 旋转

pdf - 使用 Google Script Editor 将 Google Doc 转换为 PDF

java - 如何在 JTextArea 中将文本右对齐?

text - 如何清理文本中未对齐的列?