Как получить доступ к гиперссылкам в документах PDF в iphone / ipad? - PullRequest
2 голосов
/ 10 августа 2011

Как получить доступ к гиперссылкам в документах PDF на iPhone и iPad?

Я хочу установить ссылки на содержимое электронной книги.

1 Ответ

0 голосов
/ 10 августа 2011

Используйте следующую функцию, чтобы поместить кнопки UIB на ссылки в PDF. Это нарисует кнопки на вашем UIView. Вы должны передать свою страницу в качестве параметра. В настоящее время он будет рисовать кнопку с типом UIButtonTypeRoundedRect, которую вы потом измените на пользовательский, чтобы он был скрыт. Изначально кнопки могут быть нарисованы не в месте ссылки, поэтому вам нужно отрегулировать положение x / y в соответствии с вашими требованиями.

-(void)drawLinks:(CGPDFPageRef)thisPage
{
    CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(thisPage);

    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( thisPage, 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);

        UIButton *btnTmp = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // After testing put here UIButtonTypeCustom
        [btnTmp addTarget:self action:@selector(urlOpen:) forControlEvents:UIControlEventTouchUpInside];
        rect.origin.x = rect.origin.x + 78; //I have adjusted this as per my requirement
        rect.origin.y = rect.origin.y + 108; // I have adjusted this as per my requirement
        btnTmp.frame = rect;
        btnTmp.titleLabel.text = uri;
        [self.superview addSubview:btnTmp];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...