6

我正在尝试做一件非常简单的事情:在 PDF 文件中写入一个用户可以实际点击的 URL。

我确信使用libharu可以做到。我正在寻找的是使用 Core Graphics 做同样的事情,因为我在我的应用程序中已经拥有的整个代码已经在使用这些方法。

== 编辑 ==

我想我找到了一些东西:UIGraphicsSetPDFContextURLForRect但我无法让它工作。

我正在使用类似的东西:

NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
UIGraphicsSetPDFContextURLForRect( url, CGRectMake(0, 0, 100, 100));

但是,矩形是不可点击的。

4

2 回答 2

16

好的,我设法弄清楚为什么它不起作用。

Core Graphics 上下文是“反转”的,原点位于页面左下角,而 UIKit 的原点位于左上角。

这是我想出的方法:

- (void) drawTextLink:(NSString *) text inFrame:(CGRect) frameRect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGAffineTransform ctm = CGContextGetCTM(context);

    // Translate the origin to the bottom left.
    // Notice that 842 is the size of the PDF page. 
    CGAffineTransformTranslate(ctm, 0.0, 842);

    // Flip the handedness of the coordinate system back to right handed.
    CGAffineTransformScale(ctm, 1.0, -1.0);

    // Convert the update rectangle to the new coordiante system.
    CGRect xformRect = CGRectApplyAffineTransform(frameRect, ctm);

    NSURL *url = [NSURL URLWithString:text];        
    UIGraphicsSetPDFContextURLForRect( url, xformRect );

    CGContextSaveGState(context);
    NSDictionary *attributesDict;
    NSMutableAttributedString *attString;

    NSNumber *underline = [NSNumber numberWithInt:NSUnderlineStyleSingle];
    attributesDict = @{NSUnderlineStyleAttributeName : underline, NSForegroundColorAttributeName : [UIColor blueColor]};
    attString = [[NSMutableAttributedString alloc] initWithString:url.absoluteString attributes:attributesDict];

    [attString drawInRect:frameRect];

    CGContextRestoreGState(context);
}

这个方法的作用是:

  • 获取当前上下文并对提供的矩形应用转换,以便获得一个在将框UIGraphicsSetPDFContextURLForRect标记为可点击时可以工作的矩形
  • xformRect使用上述方法将新矩形 ( ) 标记为可点击
  • 保存当前上下文,以便以后所做的任何事情(颜色、大小、属性等)都不会在当前上下文中保持持久性
  • 在提供的矩形中绘制文本(现在使用 UIKit 坐标系)
  • 恢复上下文 GState
于 2013-02-07T11:13:35.350 回答
1

这是Swift 5的转换代码

let context = UIGraphicsGetCurrentContext()
let ctm = context?.ctm

// Translate the origin to the bottom left.
// Notice that 842 is the size of the PDF page. 
ctm?.translatedBy(x: 0.0, y: 842)

// Flip the handedness of the coordinate system back to right handed.
ctm?.scaledBy(x: 1.0, y: -1.0)

var xformRect: CGRect? = nil
if let ctm = ctm {
    xformRect = frameRect.applying(ctm)
}

let url = URL(string: text)
if let url = url {
    UIGraphicsSetPDFContextURLForRect(url, xformRect ?? CGRect.zero)
}

context?.saveGState()

let attributesDict =[
        .foregroundColor: UIColor.blue,
        .underlineStyle: NSUnderlineStyle.single.rawValue
    ]
let attString = NSMutableAttributedString(string: url?.absoluteString ?? "", attributes: attributesDict as? [NSAttributedString.Key : Any])

attString?.draw(in: frameRect)

context?.restoreGState()
于 2020-07-21T15:41:24.410 回答