ios - CGPDFScannerScan 不调用回调函数

标签 ios pdf swift callback cgpdfscanner

我正在尝试从一个 pdfFile 中获取 strings,该文件通过 open in... 菜单从另一个应用程序发送到我的应用程序。 我写了一个 pdfscanner,我将一个 pdfPage 传递给它,扫描仪应该触发一个回调 "getString" 我主要使用 SWIFT,但扫描代码在 objective-C 中 问题是当我从另一个应用程序向我的应用程序发送 pdfDoc 时,“getString”回调不会触发。 当我使用 macbook pro 目录中的 URL 将相同的文档发送到我的应用程序时, 然后它工作并调用“getString”回调。 当我检查调试器时,我总是将有效的 CGPDFPageRef 传递给“extractStringsFromPDFPage:”方法。 我在这两种情况下都有一个有效的 CGPDFContentStream 和 CGPDFOperatorTable

这是扫描仪的代码:

@implementation FFStringExtractor

- (instancetype)init
{
self = [super init];
if (self) {
    self.pdfStrings = [[NSMutableArray alloc] init];
}

return self;
}

- (void) extractStringsFromPDFPage: (CGPDFPageRef) page {

CGPDFContentStreamRef contentStream = CGPDFContentStreamCreateWithPage(page);

// get the strings
CGPDFOperatorTableRef operatorTable = CGPDFOperatorTableCreate();
CGPDFOperatorTableSetCallback(operatorTable, "Tj", getString);

FFStringExtractor *currentExtractor = self;

CGPDFScannerRef scanner = CGPDFScannerCreate(contentStream, operatorTable, (__bridge void*)currentExtractor);
CGPDFScannerScan(scanner);

//releases
CGPDFOperatorTableRelease(operatorTable);
CGPDFScannerRelease(scanner);
CGPDFContentStreamRelease(contentStream);

}

@end


void getString (CGPDFScannerRef pageScanner, void *info) {

CGPDFStringRef pdfString;
CGPDFScannerPopString(pageScanner, &pdfString);

const unsigned char *byteString = CGPDFStringGetBytePtr(pdfString);

NSString *macRomanDecode = [NSString stringWithCString:byteString encoding:NSMacOSRomanStringEncoding];

FFStringExtractor *currentObject = (__bridge FFStringExtractor*) info;
[currentObject.pdfStrings addObject:macRomanDecode];

}

下面是我如何将文档从 appDelegate 发送到我的应用

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {

    //Get the Data from the preview open in... menu

    //let macBookUrl = NSURL(fileURLWithPath: "/Users/vmalterre/Documents/Xcodes/TESTDOC.pdf")

    let doc = CGPDFDocumentCreateWithURL(url)
    //let doc = = CGPDFDocumentCreateWithURL(macBookUrl)

    let sharedStore = FFDataStore.sharedStore
    sharedStore.addFileWithDoc(doc)

    return true
}

我一整天都在处理这个问题,如有任何帮助,我们将不胜感激。

最佳答案

问题解决了, 文本运算符不是“TJ”,而只是“'”。 这可能发生在旧的 PDF 版本中

关于ios - CGPDFScannerScan 不调用回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27661624/

相关文章:

iphone - 使用 NSURL 方法的登录凭据问题

ios - UIWebView - 我应该期望什么加载时间?

ios - 为 UILocalNotification 设置超时(一段时间后将其从锁屏和通知中心移除)

java - 在 Java 中打开 PDF 文件并使用双倍行距

ios - 'success' 中的成员 'SingleEvent<_>' 产生类型为 'SingleEvent<Element>' 的结果

swift - 类型 'Like' 没有下标成员?

iphone - 如何垂直移动带有 slider 的 UILabel

PHP PDF 函数

javascript - 使用 Pdf.js 突出显示 pdf 中的一个部分

arrays - Swift - 带数组的字典 - 获取对数组的引用