0

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

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);
}
4

1 回答 1

1

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

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

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

有关这方面的更多信息,您可能需要阅读CGPDFScannerPopString 返回奇怪的结果并查看PDFKitten

于 2013-02-06T15:46:27.223 回答