2016-05-04 12 views
5

Я хочу создать pdf в каталоге документов и хочу предоставить номера страниц, поэтому мне нужен объект CGPDFDocumentRef.Crash whille Преобразование NSURL в CFURL

let fileName: NSString = "test.pdf" 

let path:NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 

let documentDirectory: AnyObject = path.objectAtIndex(0) 

let pdfPathWithFileName = documentDirectory.stringByAppendingPathComponent(fileName as String) 

UIGraphicsBeginPDFContextToFile(pdfPathWithFileName as String, CGRectZero, nil) 

let ref : CGContextRef = UIGraphicsGetCurrentContext()! 

let localUrl = NSURL.fileURLWithPath(pdfPathWithFileName) 

Я преобразовал путь к файлу в URL, но это ниже линии генерирует сбой, и я не знаю, почему ..?

let pdfDocumentRef: CGPDFDocumentRef = CGPDFDocumentCreateWithURL(localUrl as CFURLRef)! 
+0

У вас есть результат с момента аварии? Кроме того, попробуйте извлечь 'localUrl как CFURLRef' в отдельную строку и посмотреть, является ли это' nil', случайно, я предполагаю, что именно здесь вы столкнулись с проблемой. – pbodsk

+0

@pbodsk: Да, он возвращает нуль, и я не знаю, почему ..? эта строка возвращает CGPDFDocumentCreateWithURL (localUrl как CFURLRef)! ноль. Хотя localUrl имеет путь к файлу. –

+0

В Swift вам не нужно явно указывать тип переменной, если Swift может вывести тип. Например, 'let path: NSArray = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true)' можно легко представить как 'let path = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true)', с добавленным бонусом Swift, зная типы используется массивом 'String'. – MaddTheSane

ответ

0

Его так как ваш test.pdf нет в папке каталога документов.

+0

Нет, я уже тестировал. Test.pdf создается каждый раз при запуске приложения. –

0
let localUrl = pdfPathWithFileName as CFStringRef 
let pdfDocumentRef = CFURLCreateWithFileSystemPath(nil, localUrl, CFURLPathStyle.CFURLPOSIXPathStyle, false) 
let page_count = CGPDFDocumentGetNumberOfPages(pdfDocumentRef) 
+0

Это не сбой с кодом, а pdfDocumentRef возвращает нуль. –

+0

Пожалуйста, покажите нам журнал аварий. –

+0

Теперь он должен работать, если NSURL не сможет преобразовать, просто попробуйте преобразовать предыдущую строку. –

0

Так что, кажется, ваша NSURL(fileURLWithPath: pdfPathWithFileName) as CFURLRef часть терпит неудачу, и это то, что является причиной ваших проблем.

Я только что нашел это в documentation about CFURL

CFURL не удается создать объект, если переданная строка не хорошо сформирован (то есть, если он не соответствует RFC 2396). Примеры случаев, которые не будут успешными, - это строки, содержащие пробельные символы и символы с высоким битом. Если функция не создает объект CFURL, он возвращает NULL, с которым вы должны быть готовы обращаться. Если вы создаете объекты CFURL, используя пути файловой системы, вы должны использовать функции CFURLCreateFromFileSystemRepresentation и CFURLCreateFromFileSystemRepresentationRelativeToBase, которые обрабатывают тонкие различия между путями URL-адресов и путями файловой системы.

И this question похоже примерно такая же проблема. Как one of the answers предполагают:

Вам нужно новообращенный NSString к CFStringRef затем вызвать CFURLCreateWithFileSystemPath;

Надеюсь, что вам поможет.

+0

Как вы можете видеть в моем коде, я уже использовал fileUrlWithPath. –

+0

и что такое значение 'localUrl'? – pbodsk

+0

файл: ///Users/anil.kukadeja/Library/Developer/CoreSimulator/Devices/AC107F46-79C0-49B6-9773-0BB0672E8902/data/Containers/Data/Application/7BE0B88F-45A0-45BB-B01F-A41F18D7A2FF/Documents/ test.pdf –

 Смежные вопросы

  • Нет связанных вопросов^_^