如何在PDF文档上设置注释,对于所有PDF阅读器而言,这些注释不仅适用于特定应用程序

时间:2013-08-17 06:55:52

标签: iphone ios objective-c pdf annotations

嗨朋友我正在尝试创建PDF页面的注释,就像我的应用程序中的贝娄图像一样,所有其他PDF阅读器都可以看到此注释

例如: -

  

我在我的应用程序和添加注释中创建PDF文档然后我将此文档发送到我的朋友邮件。然后我的朋友下载此PDF并打开到Mac的Preview应用程序,然后创建了应该显示的PDF注释。

我正在做这个东西的RND并且还阅读iOS提供Doc about Quartz 2D。我成功阅读并使用此Quartz 2D创建PDF,但现在没有任何方法可以进行注释。

我也研究过那些SO问题: -

Create PDF Annotations in iOS

Create PDF Annotations with Quartz (iOS)

pdf annotations in objective-c

我还使用应用程序阅读PDF完成了注释,并将 x 点和 y 部分图层存储到特定PDF页面。现在的问题是,当我将此PDF文档发送给在其他PDF阅读器中打开此文档的其他用户时,该怎么办?

我也讨论这个SO聊天小组。堆栈溢出用户之一建议我使用CGLayer来完成这项任务但是我很困惑如何实现这些东西以及如何实现它。

请帮助我并指导我这方面的事情。

enter image description here

2 个答案:

答案 0 :(得分:0)

答案是否定的,您无法使用iOS API创建标准PDF注释。 CGPDF * API是只读的,只能用于读取PDF文件,带有PDF上下文的CoreGraphics API只能创建没有注释,表单字段,书签等的简单PDF页面。
如果您创建新的PDF文件,您可以切换到支持注释的libHaru,但如果想要为现有PDF文件添加注释,则运气不佳(libHaru无法加载PDF文件)。还有IFXPDFFactory但它正在开发中,我不知道它是否支持注释。

答案 1 :(得分:0)

首先我不知道是不是因为复杂性,人们建议使用昂贵的PDF iOS库,或者他们通过评论这个以及如果没有事先测试就无法做到这一点来推广它们。

您可以在pdf文件中添加和保存注释,甚至可以将其导出。

NSURL *OriginalPdfPath = [[NSBundle mainBundle] URLForResource:@"yourPDFname" withExtension:@"pdf"];
NSString *string=[OriginalPdfPath path];


NSError *error;
//Load original pdf data:
NSData *pdfData = [NSData dataWithContentsOfFile:string options:NSDataReadingUncached error:&error];
if (error)
{
    NSLog(@"%@", [error localizedDescription]);
    return;
}
else  {
    NSLog(@"Data has loaded successfully.");
}



NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pathLD = [documentsDirectory stringByAppendingPathComponent:@"dirName"];  // get directory

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:pathLD])
{
    [fileManager createDirectoryAtPath:pathLD withIntermediateDirectories:YES attributes:nil error:nil];
}
pathLD = [pathLD stringByAppendingPathComponent:@"yourPDFname.pdf"];  // add file path


 BOOL isDir;
if (![fileManager fileExistsAtPath:pathLD isDirectory:&isDir]) {
    BOOL didsave=[fileManager createFileAtPath:pathLD contents:pdfData attributes:nil];
}

NSURL *url = [NSURL fileURLWithPath:string];
CGPDFDocumentRef document = CGPDFDocumentCreateWithURL ((__bridge_retained CFURLRef) url);
size_t count = CGPDFDocumentGetNumberOfPages(document);

if (count == 0)
{
    NSLog(@"PDF needs at least one page");
    return;
}

//现在使用pdf文件

 UIGraphicsBeginPDFContextToFile(pathLD , CGRectZero, nil);
 CGContextRef currentContext = UIGraphicsGetCurrentContext();
 CGPDFPageRef page = CGPDFDocumentGetPage (document, 1); 
 CGRect paperSize = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox);
 UIGraphicsBeginPDFContextToFile(pathLD , CGRectZero, nil);
 UIGraphicsBeginPDFPageWithInfo(paperSize, nil);

//翻转上下文,以便正确显示PDF页面。

  CGContextTranslateCTM(currentContext, 0.0, paperSize.size.height);
  CGContextScaleCTM(currentContext, 1.0, -1.0);
  CGContextDrawPDFPage (currentContext, page);

//此处的魔术功能:在上下文

中渲染注释视图的图层
  [drawingView.layer renderInContext:currentContext];
  UIGraphicsEndPDFContext();
  CGPDFDocumentRelease (document);

这会将您在当前pdf上下文中呈现的所有内容保存回文件管理器
您可以使用模型在WebView上查看显示VC:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
     [self displayPdfinWebView];

}

-(void)displayPdfinWebView {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory =[paths objectAtIndex:0];

    NSString *pathLD = [documentsDirectory stringByAppendingPathComponent:@"dirName"]; // get directory
    pathLD = [pathLD stringByAppendingPathComponent:@"yourPDFname.pdf"]; // add file path

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSData *data;

    NSURL* pdfUrl;
    if ([fileManager fileExistsAtPath:pathLD])
     {
         pdfUrl = [NSURL fileURLWithPath:pathLD];
         [webView loadRequest:[NSURLRequest requestWithURL:pdfUrl]];
     }

}

我猜您可以使用UIDocumentInteractionController连接到iBooks进行导出。  我的推荐是ApplePDF Drawing