从核心数据和表视图控制器创建PDF文档

时间:2013-11-27 12:27:21

标签: ios objective-c uitableview pdf core-data

我正在开发我的第一个应用程序,几乎完成了;我只是坚持创建一个PDF功能。我有一个简单的核心数据库和一个表视图控制器(使用FetchedResultsController)和一个NavigationBar按钮项,当我按下它时,我理想地希望在文档目录中创建一个PDF,然后附加到电子邮件。我正处于创建PDF的阶段。

遵循Apple的指南(https://developer.apple.com/library/ios/documentation/2ddrawing/conceptual/drawingprintingios/GeneratingPDF/GeneratingPDF.html),但这里有更多本教程(http://www.ioslearner.com/generate-pdf-programmatically-iphoneipad/),我在iPhone模拟器的文档目录中创建了一个可用的PDF。

当然,上面教程中的代码有很多方法已经在iOS 7中折旧了,所以我更新了“正文”方法:

- (void) drawText
{
    CGContextRef    currentContext = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0);

    NSString *textToDraw = @"Hello, this is a test PDF";

    UIFont *font = [UIFont systemFontOfSize:14.0];

    CGSize textSize = CGSizeMake(pageSize.width - 5*kBorderInset-5*kMarginInset, pageSize.height - 5*kBorderInset - 5*kMarginInset);

    CGRect renderingRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset + 50.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, textSize.height);

    [textToDraw drawWithRect:renderingRect options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil];
}

这很有效。 PDF格式是使用边框创建的,在标题行下面,它的文字说“你好,这是一个测试PDF”,没有引号。

这一切都很好,但问题是从Core Data中提取信息。此表视图调用名为Transaction的Core Data Entity,它与其他Core Data Entities有关系。

表视图控制器(使用自定义单元格)具有标签和附件视图(图像),我需要将其传递给PDF。表视图工作得很好; PDF工作得很好。问题是,我如何传递核心数据信息?

所以我想将“自定义单元格中的标签”传递给PDF,这些都是从Core Data获取信息的。

当然,这不只是一个条目。此表视图可以包含1到30个单元格,每个单元格有3个标签和一个附件视图。我需要将这些标签放入Core Data。

我尝试过使用代码,但我不确定如何格式化上面的NSString命令以使其正常工作。

我的saveToPDF按钮是:

- (IBAction)saveToPDF:(id)sender
{
    pageSize = CGSizeMake(612, 792);
    NSString *fileName = @"new.pdf";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName];

    [self generatePdfWithFilePath:pdfFileName];

}

调用:

- (void) generatePdfWithFilePath: (NSString *)thefilePath
{
    UIGraphicsBeginPDFContextToFile(thefilePath, CGRectZero, nil);

    //NSInteger currentPage = 0;
    BOOL done = NO;
    do
    {
        //Start a new page.
        UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil);

        //Draw a page number at the bottom of each page.
        //currentPage++;
        //[self drawPageNumber:currentPage];

        //Draw a border for each page.
        [self drawBorder];

        //Draw text fo our header.
        [self drawHeader];

        //Draw a line below the header.
        [self drawLine];

        //Draw some text for the page.
        [self drawText];

        //Draw an image
        [self drawImage];
        done = YES;
    }
    while (!done);

    // Close the PDF context and write the contents out.
    UIGraphicsEndPDFContext();
}

编辑:

我在drawText方法中创建了一个fetchRequest,然后输出了它的信息。

NSManagedObjectContext * managedObjectContext = [self managedObjectContext];

NSFetchRequest *pdfFetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
pdfFetchRequest.entity = entity;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"dates.dateOfEvent" ascending:NO];
pdfFetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
pdfFetchRequest.fetchBatchSize = 20;
NSError *error = nil;
NSArray *types = [managedObjectContext executeFetchRequest:pdfFetchRequest error:&error];
NSString *textToDraw = [NSString stringWithFormat:@"Information = %@", types];

PDF中的输出当然是:“(entity:Transaction; id:0x8baac90; data:{\ n,这对用户来说是不可读的。

我有一个带有3个标签和附件视图的自定义单元格。我想要以下任何一种:

1)PDF具有与表视图类似的表视图布局,将此提取调用为PDF,因此使用单元格,标签和附件视图(首选结果),或者 2)一种添加代码的方法,以便我绘制一个包含单元格的表格,并在PDF中包含单元格和附件视图。

非常欢迎任何有关将核心数据信息纳入此PDF的见解或想法!

1 个答案:

答案 0 :(得分:1)

使用NSFetchRequest从核心数据中获取数据,例如from apple example

NSManagedObjectContext *context = [recipe managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"RecipeType" inManagedObjectContext:context]];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
NSArray *types = [context executeFetchRequest:fetchRequest error:&error];

然后你可以迭代types并为你的pdf创建字符串。