我正在开发我的第一个应用程序,几乎完成了;我只是坚持创建一个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的见解或想法!
答案 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创建字符串。