iOS извлечь векторную графику из PDF

Было много разговоров о PDF-файлах в iOS, и я нашел все ответы на свои вопросы здесь, кроме одного: у меня есть PDF-файл, содержащий простую векторную форму. Можно ли извлечь данные пути этой фигуры, чтобы я мог использовать их для рисования фигур непосредственно на слое Quartz?

До сих пор я могу путешествовать по документу PDF, создавая такой вывод:

Object key Resources type: kCGPDFObjectTypeDictionary
Object key ProcSet type: kCGPDFObjectTypeArray with length 4
    Object key Array Object type: kCGPDFObjectTypeName PDF
    Object key Array Object type: kCGPDFObjectTypeName ImageB
    Object key Array Object type: kCGPDFObjectTypeName ImageC
    Object key Array Object type: kCGPDFObjectTypeName ImageI
Object key ColorSpace type: kCGPDFObjectTypeDictionary
    Object key Cs1 type: kCGPDFObjectTypeArray with length 2
        Object key Array Object type: kCGPDFObjectTypeName ICCBased
        Object key Array Object type: kCGPDFObjectTypeStream
            Object key Length type: kCGPDFObjectTypeInteger 737
            Object key N type: kCGPDFObjectTypeInteger 3
            Object key Alternate type: kCGPDFObjectTypeName DeviceRGB
            Object key Filter type: kCGPDFObjectTypeName FlateDecode
Object key XObject type: kCGPDFObjectTypeDictionary
    Object key Im1 type: kCGPDFObjectTypeStream
        Object key Length type: kCGPDFObjectTypeInteger 125
        Object key Type type: kCGPDFObjectTypeName XObject
        Object key Subtype type: kCGPDFObjectTypeName Image
        Object key Width type: kCGPDFObjectTypeInteger 62
        Object key Height type: kCGPDFObjectTypeInteger 49
        Object key Interpolate type: kCGPDFObjectTypeBoolean 1
        Object key ColorSpace type: kCGPDFObjectTypeArray with length 2
            Object key Array Object type: kCGPDFObjectTypeName ICCBased
            Object key Array Object type: kCGPDFObjectTypeStream
                Object key Length type: kCGPDFObjectTypeInteger 737
                Object key N type: kCGPDFObjectTypeInteger 3
                Object key Alternate type: kCGPDFObjectTypeName DeviceRGB
                Object key Filter type: kCGPDFObjectTypeName FlateDecode
        Object key SMask type: kCGPDFObjectTypeStream
            Object key Length type: kCGPDFObjectTypeInteger 36
            Object key Type type: kCGPDFObjectTypeName XObject
            Object key Subtype type: kCGPDFObjectTypeName Image
            Object key Width type: kCGPDFObjectTypeInteger 62
            Object key Height type: kCGPDFObjectTypeInteger 49
            Object key ColorSpace type: kCGPDFObjectTypeName DeviceGray
            Object key Interpolate type: kCGPDFObjectTypeBoolean 1
            Object key BitsPerComponent type: kCGPDFObjectTypeInteger 8
            Object key Filter type: kCGPDFObjectTypeName FlateDecode
        Object key BitsPerComponent type: kCGPDFObjectTypeInteger 8
        Object key Filter type: kCGPDFObjectTypeName FlateDecode

Очевидно, есть изображение размером 62x49 и маска такого же размера (вокруг формы, PDF прозрачный). Изображение определенно является векторной графикой, я могу масштабировать его до любого размера без потери качества. Так где, черт возьми, информация о пути?

Спасибо за любую информацию!

Лучший, Бенджамин


person BenAtWork    schedule 03.05.2011    source источник


Ответы (2)


Изображение встроено в сам файл PDF. Пути к нему нет — это не внешний файл. Скорее, это объект поток в PDF. Вам нужно будет распаковать («раздуть») этот потоковый объект (который сжат с помощью «flate» в соответствии со значением фильтра для этого XObject), затем проанализировать и преобразовать содержащиеся в нем команды рисования/рендеринга PDF в их эквивалентные вызовы Quartz. Это определенно не тривиально — извините. (Я бы посоветовал поискать библиотеку, которая сделает это за вас.)

Удачи!

person Turix    schedule 24.04.2013

На GitHub существует небольшой проект, который использует CGPDFScannerScan() для извлечения векторных данных: http://github.com/depth42/PWDynamicPDFImage

person Stephan Michels    schedule 14.07.2017