寻找如何在iOS或Cocoa中使用UIGraphicsSetPDFContextURLForRect。

5

我正在iOS上处理PDF(显示和生成),希望能够嵌入作为“外部”链接的矩形区域(URLs,如http://host.tld/path/file)。

您知道在哪里可以找到使用UIGraphicsSetPDFContextURLForRect函数的示例吗?我在互联网上找不到任何信息。

如果我理解正确,唯一的要求是当前图形上下文应该是PDF “类型”,我认为我已经满足此要求,因为在上游,我将我的PDF上下文作为参数调用了UIGraphicsPushContext(这也是像drawAtPoint:这样的方法成功使用的必要条件)。

我不认为这很重要,但以防万一,我指定这并非View子类的drawRect中发生的事情。

你完全正确地毫不含糊地告诉我“全部错误”。iOS中的图形环境是如此复杂和丰富,以至于我现在只掌握了1或2%,谢谢您提前。

2个回答

5

你说得对,要求当前的图形上下文是PDF上下文。你可以使用UIGraphicsPushContext将其推入堆栈(以激活它),或者像这样创建上下文:

UIGraphicsBeginPDFContextToFile(path, CGRectMake(0, 0, 612, 792), nil);
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);
// ...
UIGraphicsSetPDFContextURLForRect(url, rect);
// ... 
UIGraphicsEndPDFContext(); 

UIGraphicsSetPDFContextURLForRect有两个参数:第一个参数是您想要链接跳转的url,第二个参数是当前页面上代表链接区域的矩形。例如,以下代码将在页面左下角创建72*72点大小的链接:

UIGraphicsSetPDFContextURLForRect(url, CGRectMake(0, 0, 72, 72));

这个方法实际上是在PDF文件中创建一个链接注释。该链接本身没有视觉效果,您必须知道它存在,或者如果您将鼠标移动到查看器中的PDF页面上,则可能偶然发现它。因此,通常需要在页面上绘制/编写一些内容(例如“单击此处”),并将链接区域设置在文本上方。
更新-工作代码片段:
- (void) makePdf {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *pdfFile = [documentsDirectory stringByAppendingPathComponent:@"uigraphics.pdf"];

    UIGraphicsBeginPDFContextToFile(pdfFile, CGRectMake(0, 0, 612, 792), nil);
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);

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

    UIGraphicsEndPDFContext();
}

不必再次提及文档。 特别是如果您在之后犯了一个错误。对于UIGraphicsSetPDFContextURLForRect,您必须提供NSURL而不是NSString作为第一个参数。 - Diablotin
我修正了错误,但是想法仍然保持不变。 - iPDFdev
好的,但是你的例子仍然是理论性的。你尝试过使用这段代码编写一个真正的程序吗?我的意思是完整的、编译成功并在生成的PDF中附带链接的程序。 - Diablotin
我更新了我的答案,并提供了一个可工作的代码片段。这只是我的理论代码,使用了实际的方法参数值,没有其他内容。它可以运行并创建一个带有左下角链接的PDF文件。 - iPDFdev

4
我希望你能找到所需的帮助。
UIGraphicsBeginPDFContextToFile( pdfFilePath, CGRectZero, nil );

CGRect windowFrame = CGRectMake( 0, 0, 596, 842 );
UIGraphicsBeginPDFPageWithInfo( windowFrame, nil );

NSURL *url = [NSURL URLWithString:@"http://www.google.com"];

CGRect textFrame = CGRectMake( 10, 10, 200, 20 );
CGRect linkFrame = textFrame;
linkFrame.origin.y = windowFrame.size.height - linkFrame.origin.y - linkFrame.size.height;
UIGraphicsSetPDFContextURLForRect( url, linkFrame );

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:textFrame];

UIGraphicsEndPDFContext();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接