CGPDFDictionaryGetString получение измерений проблем PDF

Основываясь на этом вопросе, я попытался углубиться в CGPDF, чтобы получить данные о размере PDF, не загружая их в память.

Эта часть iOS очень плохо документирована, и поиск в Интернете дает мне только некоторые плохие результаты о записи в pdfs. Вот что я пробовал, это не приводит ни к чему другому, кроме EXC_BAD_ACCESS в отмеченной строке.

 NSURL *imageFileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"a1" ofType:@"pdf"]];

CGPDFDocumentRef pdfSource = CGPDFDocumentCreateWithURL((__bridge CFURLRef)imageFileURL);
CGPDFDictionaryRef pdfProps = CGPDFDocumentGetInfo(pdfSource);

CGPDFStringRef cfValue;
CGPDFDictionaryGetString(pdfProps, kCGPDFMediaBox, &cfValue); //Crash, EXC_BAD_ACCESS

NSString *value = CFBridgingRelease(CGPDFStringCopyTextString(cfValue));
CGRect rect = CGRectFromString(value);
NSLog(@"#rekt: %@",NSStringFromCGRect(rect));

Где я здесь не так?

2 ответа

Решение

CGPDFDocumentGetInfo() Словарь не содержит информации о размерах, поскольку все страницы в документе PDF могут иметь разные размеры (поле мультимедиа, поле обрезки, ...). Ниже показано, как получить информацию для первой страницы:

CGPDFDocumentRef doc = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(doc, 1);
CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
NSLog(@"#mediaBox: %@",NSStringFromCGRect(mediaBox));
CGPDFDocumentRelease(doc);

Для документов с несколькими страницами вы должны будете определить максимум для всех страниц в документе.

Вы передаете неверное значение ключа CGPDFDictionaryGetStringключи const char * и вы проходите kCGPDFMediaBox которая является константой перечисления CGPDFBox (определяется как 0). Как сказано в документации CGPDFDictionaryRef ключи сравниваются с помощью strcmp, так что передача 0 (или NULL) в качестве ключа приведет к сбою strcmp,

Если вы хотите мультимедийный блок страницы PDF, используйте CGPDFPageGetBoxRect

NSLog(@"#rekt: %@",NSStringFromCGRect(CGPDFPageGetBoxRect(aPDFPage, kCGPDFMediaBox));
Другие вопросы по тегам