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