Nano Hash - криптовалюты, майнинг, программирование

Получение гиперссылок PDF на iOS с помощью Quartz

Я потратил весь день, пытаясь получить метаданные гиперссылок из PDF-файлов в своем приложении для iPad. API-интерфейсы CGPDF * - настоящий кошмар, и единственная информация, которую я нашел в сети обо всем этом, - это то, что мне нужно искать словарь «Аннотации», но я просто не могу найти его в своих PDF-файлах.

Я даже использовал старый образец Voyeur Xcode для проверки моего тестового файла PDF, но никаких следов этого словаря "Аннотации" ...

Вы знаете, это функция, которую я вижу в каждом PDF-ридере - в этом же вопросе есть был задан несколько раз здесь без реальных практических ответов. Обычно я никогда не запрашиваю образец кода напрямую, но, видимо, на этот раз он мне действительно нужен ... у кого-нибудь это работает, возможно, с образцом кода?

Обновление: я только что понял, что парень, который проводил тестирование моего PDF-файла, только что вставил URL-адрес в виде текста, а не настоящей аннотации. Он попытался поставить аннотацию, и мой код теперь работает ... Но это не то, что мне нужно, поэтому, похоже, мне придется анализировать текст и искать URL-адреса. Но это уже другая история ...

Обновление 2. Итак, я наконец придумал рабочий код. Я публикую это здесь, надеюсь, это кому-то поможет. Предполагается, что документ PDF действительно содержит аннотации.

for(int i=0; i<pageCount; i++) {
    CGPDFPageRef page = CGPDFDocumentGetPage(doc, i+1);

    CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(page);

    CGPDFArrayRef outputArray;
    if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {
        return;
    }

    int arrayCount = CGPDFArrayGetCount( outputArray );
    if(!arrayCount) {
        continue;
    }

    for( int j = 0; j < arrayCount; ++j ) {
        CGPDFObjectRef aDictObj;
        if(!CGPDFArrayGetObject(outputArray, j, &aDictObj)) {
            return;
        }

        CGPDFDictionaryRef annotDict;
        if(!CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) {
            return;
        }

        CGPDFDictionaryRef aDict;
        if(!CGPDFDictionaryGetDictionary(annotDict, "A", &aDict)) {
            return;
        }

        CGPDFStringRef uriStringRef;
        if(!CGPDFDictionaryGetString(aDict, "URI", &uriStringRef)) {
            return;
        }

        CGPDFArrayRef rectArray;
        if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {
            return;
        }

        int arrayCount = CGPDFArrayGetCount( rectArray );
        CGPDFReal coords[4];
        for( int k = 0; k < arrayCount; ++k ) {
            CGPDFObjectRef rectObj;
            if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {
                return;
            }

            CGPDFReal coord;
            if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {
                return;
            }

            coords[k] = coord;
        }               

        char *uriString = (char *)CGPDFStringGetBytePtr(uriStringRef);

        NSString *uri = [NSString stringWithCString:uriString encoding:NSUTF8StringEncoding];
        CGRect rect = CGRectMake(coords[0],coords[1],coords[2],coords[3]);

        CGPDFInteger pageRotate = 0;
        CGPDFDictionaryGetInteger( pageDictionary, "Rotate", &pageRotate ); 
        CGRect pageRect = CGRectIntegral( CGPDFPageGetBoxRect( page, kCGPDFMediaBox ));
        if( pageRotate == 90 || pageRotate == 270 ) {
            CGFloat temp = pageRect.size.width;
            pageRect.size.width = pageRect.size.height;
            pageRect.size.height = temp;
        }

        rect.size.width -= rect.origin.x;
        rect.size.height -= rect.origin.y;

        CGAffineTransform trans = CGAffineTransformIdentity;
        trans = CGAffineTransformTranslate(trans, 0, pageRect.size.height);
        trans = CGAffineTransformScale(trans, 1.0, -1.0);

        rect = CGRectApplyAffineTransform(rect, trans);

        // do whatever you need with the coordinates.
        // e.g. you could create a button and put it on top of your page
        // and use it to open the URL with UIApplication's openURL
    }
}

  • строка 6, не должно ли это быть continue вместо return? - почему вы возвращаетесь после проверки объекта, значения, словаря, строки, массива и т. д. 19.11.2010
  • Это просто пример кода без проверки ошибок. 19.11.2010
  • PDF-файлы не переводятся в собственные. Подробности см. В моей ветке: прокрутите вниз до: «Другие функции PDF», «Получение ссылок внутри PDF», «Общие сведения о PDF-тексте для позиционирования ссылок» stackoverflow .com / questions / 3889634 / 23.11.2010
  • Я делаю rect.size.width -= rect.origin.x; rect.size.height -= rect.origin.y;, чтобы исправить это, у меня это работает .. 23.11.2010
  • Да, это работает для w и h, но в спецификации pdf указано: массив принимает форму [llx lly urx ury], определяя координаты нижнего левого x, нижнего левого y, верхнего правого x и верхнего правого y координат прямоугольника в тот заказ. Это означает, что ваш rect.origin.y на самом деле rect.origin.y+rect.size.height, поскольку саманный прямоугольник находится внизу слева, а не в верхнем левом углу, установленном по умолчанию CGRect. Возможно, это было не так заметно, потому что, вероятно, было бы только 20-30 пикселей и все же зарегистрировало бы вашу прессу. 23.11.2010
  • Также стоит упомянуть, что я не смог получить URI из аннотации, только «Dest», я полагаю, это значение по умолчанию для внутренних ссылок на документы? 23.11.2010
  • Да, IIRC Dest предназначен для внутренних ссылок на страницы. 23.11.2010
  • См. Также stackoverflow.com/questions/3045587/, чтобы получить размер страницы и преобразовать координаты из значений PDF в значения iOS. 19.01.2011
  • @ pt2ph8 Привет, у тебя есть возможность получить все ссылки из документа? 19.04.2014

Ответы:


1

Вот основная идея, чтобы добраться до аннотаций CGPDFDictionary по крайней мере для каждой страницы. после этого вы сможете выяснить это с помощью спецификации PDF от Adobe.

1.) получить CGPDFDocumentRef.

2.) получить каждую страницу.

3.) на каждой странице используйте CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray), где pageDictionary - это CGPDFDictionary, представляющий CGPDFPage, а outputArray - это переменная (CGPDFArrayRef) для хранения массива аннотаций этой страницы.

02.11.2010
  • @Jesse Naugher: Большое спасибо за ваш ответ, но: после этого вы сможете понять это с помощью спецификации PDF от Adobe, я не смог найти никакой полезной информации из этого раздутого беспорядка, который является спецификацией Adobe PDF. Единственная его часть, где встречается слово аннотация, - это раздел 8, но опять же, я не вижу никакой информации, которая могла бы мне помочь здесь ... разочарование 02.11.2010
  • Есть целый раздел обо всех типах аннотаций, которые могут быть в PDF-документе, включая аннотации ссылок. Обычно, когда вы получаете массив аннотаций, вы просматриваете его в цикле, и каждая запись представляет собой словарь, который является аннотацией. Эти словари имеют ключ под названием «Подтип», который определяет тип аннотации, и Link является одним из них и определен в спецификации pdf. 02.11.2010
  • @Jesse Naugher: Удивительно, я только что понял, что смотрю не на тот документ - теперь у меня есть настоящий документ со спецификациями PDF. Сейчас проверю, спасибо (да, вот что бывает, когда ты устал / расстроен). 02.11.2010
  • @Jesse Naugher: CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray) для меня возвращает false ... Вот как я получаю pageDictionary: CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(page); 02.11.2010
  • убедитесь, что вы получаете сам PDF-файл правильно, а также действительную страницу с аннотацией. проверять аннотации на каждой странице отдельно 02.11.2010
  • @Jesse Naugher: Да, я делаю это в цикле for. CGPDFPageRef действителен, и документ тоже (я его тоже рисую, так что почти уверен в этом). Кроме того, на странице, которую я тестирую, есть три ссылки ... И приложение Preview их читает. Вот мой метод: pastebin.com/69JW1Kkc Я устанавливаю точку останова внутри CGPDFDictionaryGetArray, если и он не достигает Вызов CGPDFArrayGetCount .. 02.11.2010
  • Я также просмотрел PDF-файл с образцом XCode Voyeur (github.com/below/PDF-Voyeur/network) (который показывает три узла в PDF) и нет массива аннотаций ... но ссылки есть, я могу щелкнуть по ним в предварительном просмотре ... 02.11.2010
  • Я не уверен, что вам сказать, это должно сработать, единственная разница, которая у меня есть, это то, что я использую переменную типа bool для проверки if, но, очевидно, это не должно иметь значения. Я попробую с PDF-файлом, который вы делаете в Adobe или что-то в этом роде, возможно, создатель неправильно создает аннотации для ссылок? Я не уверен. 02.11.2010
  • Я обновил свой пост, это был мой PDF-файл ... В любом случае, похоже, мне придется разбирать текст и искать URL-адреса, мне это нужно в моем приложении ... В любом случае спасибо за ваши ответы. 02.11.2010
  • Удачи, он тебе понадобится: p 02.11.2010
  • @Jesse Naugher: Теперь, когда я успешно разбираю аннотации, мне нужно их отобразить. Единственная проблема в том, что PDF явно использует другую систему координат. Вроде они вверх ногами что ли. Есть идеи, как это исправить? 03.11.2010
  • Я понял. Во-первых, Rect в PDF-файле не в формате X, Y, W, H, а представляет собой массив из четырех точек, составляющих прямоугольник, поэтому: CGRect rect = CGRectMake(coords[0],coords[1],coords[2]-coords[0],coords[3]-coords[1]). 03.11.2010
  • Затем прямоугольник необходимо преобразовать таким же образом, как и сам PDF-файл при рисовании (обычно он должен быть перевернут, поскольку Quartz использует другую систему координат). Итак, код: CGAffineTransform trans = CGAffineTransformIdentity; trans = CGAffineTransformTranslate(trans, 0, pageRect.size.height); trans = CGAffineTransformScale(trans, 1.0, -1.0); rect = CGRectApplyAffineTransform(rect, trans); 03.11.2010

  • 2

    Отличный код, но у меня небольшие проблемы с его включением в мой проект. Он получает все URL-адреса правильно, но когда я нажимаю на него, ничего не происходит. Вот мой код, который мне пришлось немного изменить для работы с моим проектом). Чего-то не хватает:

    - (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx {
    //CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index+1);
    
    CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index+1);
    CGAffineTransform transform1 = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox),
                                             CGContextGetClipBoundingBox(ctx));
    CGContextConcatCTM(ctx, transform1);
    CGContextDrawPDFPage(ctx, page);
    
    int pageCount = CGPDFDocumentGetNumberOfPages(pdf);
    int i = 0;
    while (i<pageCount) {
        i++;
        CGPDFPageRef page = CGPDFDocumentGetPage(pdf, i+1);
    
        CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(page);
    
        CGPDFArrayRef outputArray;
        if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {
            return;
        }
    
        int arrayCount = CGPDFArrayGetCount( outputArray );
        if(!arrayCount) {
            continue;
        }
    
        for( int j = 0; j < arrayCount; ++j ) {
            CGPDFObjectRef aDictObj;
            if(!CGPDFArrayGetObject(outputArray, j, &aDictObj)) {
                return;
            }
    
            CGPDFDictionaryRef annotDict;
            if(!CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) {
                return;
            }
    
            CGPDFDictionaryRef aDict;
            if(!CGPDFDictionaryGetDictionary(annotDict, "A", &aDict)) {
                return;
            }
    
            CGPDFStringRef uriStringRef;
            if(!CGPDFDictionaryGetString(aDict, "URI", &uriStringRef)) {
                return;
            }
    
            CGPDFArrayRef rectArray;
            if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {
                return;
            }
    
            int arrayCount = CGPDFArrayGetCount( rectArray );
            CGPDFReal coords[4];
            for( int k = 0; k < arrayCount; ++k ) {
                CGPDFObjectRef rectObj;
                if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {
                    return;
                }
    
                CGPDFReal coord;
                if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {
                    return;
                }
    
                coords[k] = coord;
            }               
    
            char *uriString = (char *)CGPDFStringGetBytePtr(uriStringRef);
    
            NSString *uri = [NSString stringWithCString:uriString encoding:NSUTF8StringEncoding];
            CGRect rect = CGRectMake(coords[0],coords[1],coords[2],coords[3]);
    
            CGPDFInteger pageRotate = 0;
            CGPDFDictionaryGetInteger( pageDictionary, "Rotate", &pageRotate ); 
            CGRect pageRect = CGRectIntegral( CGPDFPageGetBoxRect( page, kCGPDFMediaBox ));
            if( pageRotate == 90 || pageRotate == 270 ) {
                CGFloat temp = pageRect.size.width;
                pageRect.size.width = pageRect.size.height;
                pageRect.size.height = temp;
            }
    
            rect.size.width -= rect.origin.x;
            rect.size.height -= rect.origin.y;
    
            CGAffineTransform trans = CGAffineTransformIdentity;
            trans = CGAffineTransformTranslate(trans, 0, pageRect.size.height);
            trans = CGAffineTransformScale(trans, 1.0, -1.0);
    
            rect = CGRectApplyAffineTransform(rect, trans);
    
            // do whatever you need with the coordinates.
            // e.g. you could create a button and put it on top of your page
            // and use it to open the URL with UIApplication's openURL
            NSURL *url = [NSURL URLWithString:uri];
            NSLog(@"URL: %@", url);
            CGPDFContextSetURLForRect(ctx, (CFURLRef)url, rect);
           // CFRelease(url);
            }
        }   
    
    
    }
    

    Спасибо и отличная работа BrainFeeder!

    ОБНОВИТЬ:

    Для тех, кто использует проект листьев в своем приложении, вот как я заставил работать ссылки PDF (это не идеально, поскольку прямоугольник, кажется, заполняет весь экран, но это начало):

    - (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx {
    
    CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index+1);
    CGAffineTransform transform1 = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox),
                                             CGContextGetClipBoundingBox(ctx));
    CGContextConcatCTM(ctx, transform1);
    CGContextDrawPDFPage(ctx, page);
    
    
        CGPDFPageRef pageAd = CGPDFDocumentGetPage(pdf, index);
    
        CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(pageAd);
    
        CGPDFArrayRef outputArray;
        if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {
            return;
        }
    
        int arrayCount = CGPDFArrayGetCount( outputArray );
        if(!arrayCount) {
            //continue;
        }
    
        for( int j = 0; j < arrayCount; ++j ) {
            CGPDFObjectRef aDictObj;
            if(!CGPDFArrayGetObject(outputArray, j, &aDictObj)) {
                return;
            }
    
            CGPDFDictionaryRef annotDict;
            if(!CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) {
                return;
            }
    
            CGPDFDictionaryRef aDict;
            if(!CGPDFDictionaryGetDictionary(annotDict, "A", &aDict)) {
                return;
            }
    
            CGPDFStringRef uriStringRef;
            if(!CGPDFDictionaryGetString(aDict, "URI", &uriStringRef)) {
                return;
            }
    
            CGPDFArrayRef rectArray;
            if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {
                return;
            }
    
            int arrayCount = CGPDFArrayGetCount( rectArray );
            CGPDFReal coords[4];
            for( int k = 0; k < arrayCount; ++k ) {
                CGPDFObjectRef rectObj;
                if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {
                    return;
                }
    
                CGPDFReal coord;
                if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {
                    return;
                }
    
                coords[k] = coord;
            }               
    
            char *uriString = (char *)CGPDFStringGetBytePtr(uriStringRef);
    
            NSString *uri = [NSString stringWithCString:uriString encoding:NSUTF8StringEncoding];
            CGRect rect = CGRectMake(coords[0],coords[1],coords[2],coords[3]);
    
            CGPDFInteger pageRotate = 0;
            CGPDFDictionaryGetInteger( pageDictionary, "Rotate", &pageRotate ); 
            CGRect pageRect = CGRectIntegral( CGPDFPageGetBoxRect( page, kCGPDFMediaBox ));
            if( pageRotate == 90 || pageRotate == 270 ) {
                CGFloat temp = pageRect.size.width;
                pageRect.size.width = pageRect.size.height;
                pageRect.size.height = temp;
            }
    
            rect.size.width -= rect.origin.x;
            rect.size.height -= rect.origin.y;
    
            CGAffineTransform trans = CGAffineTransformIdentity;
            trans = CGAffineTransformTranslate(trans, 0, pageRect.size.height);
            trans = CGAffineTransformScale(trans, 1.0, -1.0);
    
            rect = CGRectApplyAffineTransform(rect, trans);
    
                // do whatever you need with the coordinates.
                // e.g. you could create a button and put it on top of your page
                // and use it to open the URL with UIApplication's openURL
                NSURL *url = [NSURL URLWithString:uri];
                NSLog(@"URL: %@", url);
    //          CGPDFContextSetURLForRect(ctx, (CFURLRef)url, rect);
                UIButton *button = [[UIButton alloc] initWithFrame:rect];
                [button setTitle:@"LINK" forState:UIControlStateNormal];
                [button addTarget:self action:@selector(openLink:) forControlEvents:UIControlEventTouchUpInside];
                [self.view addSubview:button];
               // CFRelease(url);
            }
        //} 
    

    Последнее обновление. Ниже приведен последний код, который я использовал в своих приложениях.

    - (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx {
    //If the view already contains a button control remove it
    if ([[self.view subviews] containsObject:button]) {
        [button removeFromSuperview];
    }
    
    CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index+1);
    CGAffineTransform transform1 = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox),
                                             CGContextGetClipBoundingBox(ctx));
    CGContextConcatCTM(ctx, transform1);
    CGContextDrawPDFPage(ctx, page);
    
    
    CGPDFPageRef pageAd = CGPDFDocumentGetPage(pdf, index);
    
    CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(pageAd);
    
    CGPDFArrayRef outputArray;
    if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {
        return;
    }
    
    int arrayCount = CGPDFArrayGetCount( outputArray );
    if(!arrayCount) {
        //continue;
    }
    
    for( int j = 0; j < arrayCount; ++j ) {
        CGPDFObjectRef aDictObj;
        if(!CGPDFArrayGetObject(outputArray, j, &aDictObj)) {
            return;
        }
    
        CGPDFDictionaryRef annotDict;
        if(!CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) {
            return;
        }
    
        CGPDFDictionaryRef aDict;
        if(!CGPDFDictionaryGetDictionary(annotDict, "A", &aDict)) {
            return;
        }
    
        CGPDFStringRef uriStringRef;
        if(!CGPDFDictionaryGetString(aDict, "URI", &uriStringRef)) {
            return;
        }
    
        CGPDFArrayRef rectArray;
        if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {
            return;
        }
    
        int arrayCount = CGPDFArrayGetCount( rectArray );
        CGPDFReal coords[4];
        for( int k = 0; k < arrayCount; ++k ) {
            CGPDFObjectRef rectObj;
            if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {
                return;
            }
    
            CGPDFReal coord;
            if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {
                return;
            }
    
            coords[k] = coord;
        }               
    
        char *uriString = (char *)CGPDFStringGetBytePtr(uriStringRef);
    
        NSString *uri = [NSString stringWithCString:uriString encoding:NSUTF8StringEncoding];
        CGRect rect = CGRectMake(coords[0],coords[1],coords[2],coords[3]);
        CGPDFInteger pageRotate = 0;
        CGPDFDictionaryGetInteger( pageDictionary, "Rotate", &pageRotate ); 
        CGRect pageRect = CGRectIntegral( CGPDFPageGetBoxRect( page, kCGPDFMediaBox ));
        if( pageRotate == 90 || pageRotate == 270 ) {
            CGFloat temp = pageRect.size.width;
            pageRect.size.width = pageRect.size.height;
            pageRect.size.height = temp;
        }
    
        rect.size.width -= rect.origin.x;
        rect.size.height -= rect.origin.y;
    
        CGAffineTransform trans = CGAffineTransformIdentity;
        trans = CGAffineTransformTranslate(trans, 35, pageRect.size.height+150);
        trans = CGAffineTransformScale(trans, 1.15, -1.15);
    
        rect = CGRectApplyAffineTransform(rect, trans);
    
        urlLink = [NSURL URLWithString:uri];
        [urlLink retain];
    
        //Create a button to get link actions
        button = [[UIButton alloc] initWithFrame:rect];
        [button setBackgroundImage:[UIImage imageNamed:@"link_bg.png"] forState:UIControlStateHighlighted];
        [button addTarget:self action:@selector(openLink:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:button];
    }   
    [leavesView reloadData];
    }
    
    }
    
    03.11.2010
  • @ user470763: Ага, самое очевидное решение - добавить кнопку :) 04.11.2010
  • @Brainfeeder Единственная проблема, с которой я действительно сталкиваюсь, это то, что прямоугольный размер масштабируется только для iPhone, а не для iPad. Кроме того, по ссылкам на всю страницу я не могу смахнуть, чтобы изменить страницу. 04.11.2010
  • @kmcg: Спасибо за ваш код, я могу масштабировать размеры прямоугольников также на ipad, единственное, что вам нужно, это изменить значения x и y, может быть, это может вам помочь. Также хотел спросить, можете ли вы найти в PDF-файле какое-либо слово, кроме URL-адресов. Спасибо. 20.01.2011
  • Помните, что кнопка, созданная этим фрагментом кода, имеет белый шрифт. Так что, если ваш PDF-файл не цветной, вы его не увидите. Я не могу поставить прямоугольник в нужное место, хотя 03.02.2011
  • @kmcg Это работает и для внутренних ссылок? У вас есть какой-нибудь примерный проект? Заранее спасибо. 23.03.2011
  • @Jimit Что вы подразумеваете под внутренними ссылками? Он работает для ссылок в PDF-файле (например, рекламных объявлений, URL-адресов и т. Д.). Эти ссылки должны быть встроены в PDF-файл при его создании. Он не просто ищет ссылки, написанные в виде текста. У меня нет примера проекта, извините. 29.03.2011
  • @kmcgrady Спасибо, цените ваш ответ, я разобрался! 29.03.2011
  • @kmcgrady Вы когда-нибудь придумали, как правильно перевести прямоугольник? 18.06.2011
  • @lindon Я обновил свой ответ своим окончательным кодом. Я на 90% уверен, что это сработало как на iPhone, так и на iPad, но сейчас у меня нет времени тестировать. Я не работал над проектом около 6 месяцев, поэтому не могу вспомнить. Надеюсь, это вам поможет. Когда я закончил, все заработало. 26.06.2011

  • 3

    Я должен быть сбит с толку, потому что все это работает, если я использую:

    CGRect rect = CGRectMake(coords[0],coords[1],coords[2]-coords[0]+1,coords[3]-coords[1]+1);
    

    Возможно, я что-то неправильно использую позже? PDF предоставляет углы, а CGRect требует угол и размер.

    18.08.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..