2

嗨朋友我正在尝试在我的应用程序中创建 PDF 页面的注释,如下图所示,并且所有其他 PDF 阅读器都可以看到此注释

例如:-

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

我在做这些东西的 RND 并阅读 iOS 提供的关于 Quartz 2D 的文档。我成功地阅读并使用它创建了 PDF,Quartz 2D但现在没有任何方法来做注释的东西。

我还研究了这类 SO 问题:-

在 iOS 中创建 PDF 注释

使用 Quartz 创建 PDF 注释 (iOS)

Objective-C中的pdf注释

我还使用 App Reading PDF 进行了注释,并将图层拖动的xy点存储到特定的 PDF 页面。现在的问题是,当我将此 PDF 文档发送给在其他 PDF 阅读器中打开此文档的其他用户时呢?

我还讨论了这个 SO 聊天组。Stack-overflow 用户之一建议我使用CGLayer执行此任务但我很困惑如何实现这些东西以及如何实现它。

请在这方面帮助我并指导我。

在此处输入图像描述

4

2 回答 2

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

于 2014-02-06T11:14:32.890 回答
0

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

于 2013-08-17T13:58:47.903 回答