【问题标题】:how to read chinese from pdf in ios correctly如何在ios中正确读取pdf中的中文
【发布时间】:2013-02-06 13:04:33
【问题描述】:

这是我所做的,但它看起来很混乱。提前致谢。

1.使用CGPDFStringCopyTextString从pdf中获取文本

2.将NSString编码为char*

NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
const char *char_content = [self.currentData cStringUsingEncoding:enc];

以下是我获取 currentData 的方法:

void arrayCallback(CGPDFScannerRef inScanner, void *userInfo)
{
  BIDViewController *pp = (__bridge BIDViewController*)userInfo;
  CGPDFArrayRef array;
  bool success = CGPDFScannerPopArray(inScanner, &array);
  for(size_t n = 0; n < CGPDFArrayGetCount(array); n += 1)
  {
      if(n >= CGPDFArrayGetCount(array))
          continue;
      CGPDFStringRef string;
      success = CGPDFArrayGetString(array, n, &string);
      if(success)
      {
          NSString *data = (__bridge NSString *)CGPDFStringCopyTextString(string);
          [pp.currentData appendFormat:@"%@", data];
      }
  }
}
 - (IBAction)press:(id)sender {
    table = CGPDFOperatorTableCreate();
    CGPDFOperatorTableSetCallback(table, "TJ", arrayCallback);
    CGPDFOperatorTableSetCallback(table, "Tj", stringCallback);
    self.currentData = [NSMutableString string];
    CGPDFContentStreamRef contentStream = CGPDFContentStreamCreateWithPage(pagerf);
    CGPDFScannerRef scanner = CGPDFScannerCreate(contentStream, table, (__bridge void *)(self));
    bool ret = CGPDFScannerScan(scanner);
}

【问题讨论】:

  • 你说的无序是什么意思?您是否检查过CGPDFStringCopyTextString 的输出是否确实是GB_18030_2000 编码的?
  • 我的意思是因为不同的编码器或其他原因,字符变为无法识别。以及如何获取CGPDFStringCopyTextString的编码类型?Thx
  • 我想用 GB_18030_2000 对 CGPDFStringCopyTextString 进行编码,它应该能正确显示中文,但它不起作用....
  • 在您使用 GB_18030_2000 编码之前,问题可能已经存在,参见。我的回答如下。

标签: ios pdf localization


【解决方案1】:

根据the Mac Developer Library CGPDFStringCopyTextString 返回一个将 PDF 字符串表示为文本字符串的 CFString 对象。 PDF 字符串以CGPDFString 的形式给出,它是一系列字节——0 到 255 范围内的无符号整数值;因此,此方法已经根据某些字符编码解码了字节。

它没有明确给出,所以它假定一种编码类型,很可能是 PDFDocEncodingUTF-16BE Unicode 字符编码方案,这两种编码可能用于表示 PDF 文档中的文本字符串在文档的内容流之外,参见。第 7.9.2.2 节 文本字符串类型 和表 D.1,the PDF specification 中的附件 D。

现在你还没有告诉我们你从哪里收到你的CGPDFString。不过,我假设您是从文档的内容流之一中收到它的。另一方面,那里的文本字符串可以用任何可以想象的编码进行编码。使用的编码由要显示字符串的字体的嵌入数据给出。

有关这方面的更多信息,您可能需要阅读CGPDFScannerPopString returning strange result 并查看PDFKitten

【讨论】:

  • 我完全不明白。你能解释更多吗?我添加了更多有问题的代码。我试过PDFKitten的例子,但是当我搜索中文时,似乎效果不佳。非常感谢。
  • 好的,您的代码添加证实了我的假设,您的 CGPDFStrings 来自 PDF 页面的内容。因此,它们的编码是由它们的字体给出的,而不是单一的固定编码。不过,CGPDFStringCopyTextString 采用固定编码。因此,除非你很幸运,否则该方法会返回乱码。请看一下我提供的参考资料。
  • 不幸的是,PDFKitten 还不是很好,但它比仅使用 CGPDFStringCopyTextString 并假设它是正确的要好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多