2011-09-07 81 views
1

现在我创造的作品,如“iAnnotate PDF” 直到在UIView的,现在我已经完成了读取和显示PDF页面的应用程序。 即使我成功获得TOC成功。编辑PDF

现在我想编辑PDF,编辑包括标记,高光和写作笔记。

现在我的问题是如何编辑?我的意思是我们是否需要创建另一个PDF,然后写入新的更改?

或者有什么方法可以更新现有pdf中的单个页面? 如果是如何做到这一点?

如果我们正在重写整个pdf,那是否会造成开销?

回答

1

也许这个想法可以在iPhone中工作我认为没有直接的方式我们可以编辑PDF,但我们可以做的,我们可以产生这样的功能,即iAnnotate应用程序有,即绘制线和文本,然后将PDF保存为一页接一页的图片,你也会在其中包含编辑过的页面,然后你将再次通过图片创建PDF,然后我想你会得到编辑后的PDF。

+0

但是你不认为这会造成头顶?对于单个页面,我们需要编写完整的pdf,对于pdf中的页面不会有任何限制。 – DivineDesert

+0

但是,这是方式。我不认为没有直接的API或库提供这样的功能,它是由你来处理这个想法。 – Ballu

2

您可以使用CoreGraphics轻松创建/编辑pdf。只要创建定义尺寸的矩形,然后创建的背景下,推进的背景下,调用CFPDFContextBeginPage,开始绘制就像你通常会做......这里有一个例子:

CGRect mediaBox = CGRectMake(0, 0, 550, 800); 
    NSString *url = [path stringByExpandingTildeInPath]; 
    CGContextRef ctx = CGPDFContextCreateWithURL((CFURLRef)[NSURL fileURLWithPath:url], &mediaBox, NULL); 
    UIGraphicsPushContext(ctx); 


//Page1 
    CGPDFContextBeginPage(ctx, NULL); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); 
    //name and value are NSStrings 
    [name drawInRect:rectName withFont:fontName]; 
    [value drawInRect:rectValue withFont:fontValue]; 
    [[UIImage imageNamed:@"logo.png"] drawInRect:CGRectMake(8, 15, 91, 99)]; 
    CGPDFContextEndPage(ctx); 

    UIGraphicsPopContext(); 
    CFRelease(ctx); 

UPDATE 您可以复制页面你需要然后像这样对它们进行绘图:

CGPDFDocumentRef originalDoc = NULL; 
CGContextRef pdfContext = NULL; 
CGRect docRect = CGRectZero; 


NSURL *originalURL = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"pdf"]; 
NSString *newPath = @"/Users/***/Desktop/new.pdf"; 
CFURLRef newURL = CFURLCreateWithFileSystemPath (NULL, 
               (CFStringRef)newPath, 
               kCFURLPOSIXPathStyle, 
               false); 

//Original doc and it's dimesnions 
originalDoc = CGPDFDocumentCreateWithURL((CFURLRef)originalURL); 
CGPDFPageRef firstPage = CGPDFDocumentGetPage(originalDoc, 1); 
if (firstPage == NULL) { 
    NSLog(@"This document has no pages..Exiting."); 
} 
docRect = CGPDFPageGetBoxRect(firstPage, kCGPDFCropBox); 
NSLog(@"%@", NSStringFromRect(docRect)); 


//New doc context 
if (newURL != NULL) { 
    pdfContext = CGPDFContextCreateWithURL(newURL, &docRect, NULL); 

    if (pdfContext == NULL) { 
     NSLog(@"Error creating context"); 
    } 

    CFRelease(newURL); 
} else { 
    NSLog(@"Error creating url"); 
} 

然后单独复制每个页面。在这个特定的例子中,我在页面中添加了“贝茨”(编号)。

//Copy original to new, and write bates 
size_t count = CGPDFDocumentGetNumberOfPages(originalDoc); 

for (size_t pageNumber = 1; pageNumber <= count; pageNumber++) { 



    CGPDFPageRef originalPage = CGPDFDocumentGetPage(originalDoc, pageNumber); 

    CGContextBeginPage (pdfContext,nil); 

    CGContextSetRGBFillColor(pdfContext, 0, 0, 255, 0.1); 
    CGContextSetRGBStrokeColor(pdfContext, 0, 0, 255, 0.5); 

    // Draw a circle (filled) 
    CGContextFillEllipseInRect(pdfContext, CGRectMake(0, 0, 25, 25)); 

    CGContextSaveGState(pdfContext); 

    //flip context due to different origins 
    CGContextTranslateCTM(pdfContext, 0.0, (docRect.size.height - (docRect.size.height * 0.80))/2); 
    CGContextScaleCTM(pdfContext, 1.0, 0.8); 

    //copy content of template page on the corresponding page in new file 
    CGContextDrawPDFPage(pdfContext, originalPage); 

    CGContextRestoreGState(pdfContext); 

    //flip context back 
    //CGContextTranslateCTM(pdfContext, 0.0, -(docRect.size.height - (docRect.size.height * 0.80))/2); 
    //CGContextScaleCTM(pdfContext, 1.0, 1.25); 

    CGContextSetRGBFillColor(pdfContext, 0, 0, 255, 0.1); 
    CGContextSetRGBStrokeColor(pdfContext, 0, 0, 255, 0.5); 

    // Draw a circle (filled) 
    CGContextFillEllipseInRect(pdfContext, CGRectMake(0, 0, 25, 25)); 

    NSString *bate = [self generateStringForCount:(int)pageNumber-1]; 

    int fontSize = 15; 
    CGContextSelectFont(pdfContext, "Helvetica", fontSize, kCGEncodingMacRoman); 
    CGContextSetTextDrawingMode(pdfContext, kCGTextFill); 
    CGContextSetTextPosition(pdfContext, 0.0f, round(fontSize/4.0f)); 
    CGContextShowText(pdfContext, [bate UTF8String], strlen([bate UTF8String])); 


    CGContextEndPage(pdfContext); 

} 

CFRelease(pdfContext); 
+0

我知道如何创建pdf。我想**编辑** pdf。如何编辑单行而不是单页。我想避免重写整个pdf。如果可以编辑现有pdf中的单页,这将很容易..或者任何复制大量页面和更换特定页面的方式也可以。 – DivineDesert

+0

已更新,显示如何复制页面。有了这个,你可以在页面上绘制或添加新的内容.. – 0xSina

+0

我没有得到你的观点:( – DivineDesert