我这里有这个方法,可以为PDF创建PDF和URL。我的问题是我试图返回PDF的NSData,但是当我在方法结束时尝试它返回nil。它为什么返回零?我该如何解决这个问题?
- (NSData *) setProductionSchedulePDF
{
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filename = @"test.pdf";
NSURL *fileURL = [NSURL fileURLWithPathComponents:[NSArray arrayWithObjects:documentsDirectory, filename, nil]];
CGContextRef pdfContext = CGPDFContextCreateWithURL((CFURLRef)fileURL, NULL, NULL);
CGPDFContextBeginPage(pdfContext, NULL);
UIGraphicsPushContext(pdfContext);
CGRect bounds = CGContextGetClipBoundingBox(pdfContext);
CGContextScaleCTM(pdfContext, 1.0, -1.0);
CGContextTranslateCTM(pdfContext, 0.0, -bounds.size.height);
NSArray *taskArray = self.taskData;
UIFont *headerFont = [UIFont fontWithName:@"Arial" size:8];
UIFont *font = [UIFont fontWithName:@"Arial" size:6];
NSDictionary *attributes = @{ NSFontAttributeName: font};
NSDictionary *headerAttributes = @{ NSFontAttributeName: headerFont};
[@"Task" drawAtPoint:CGPointMake(10, 10) withAttributes:headerAttributes];
int counter = 0;
for (id object in taskArray) {
[object drawAtPoint:CGPointMake(10, 10.5 * counter + 30) withAttributes:attributes];
counter++;
}
int keyCounter = 0;
for(id object in self.prodSchedSortedKeys) {
[object drawAtPoint:CGPointMake(60 * keyCounter + 90, 10) withAttributes:headerAttributes];
NSArray *bfsmArray;
if([finalProductionSchedule count]!=0)
{
bfsmArray = [finalProductionSchedule valueForKey:object];
}
else
{
bfsmArray = nil;
}
bfsmArray = nil;
int valueCounter = 0;
for(id object2 in bfsmArray)
{
if(bfsmArray != nil)
{
if(valueCounter == 13 || valueCounter == 66 || valueCounter == 67){
[[bfsmArray objectAtIndex:valueCounter] drawAtPoint:CGPointMake(60 * keyCounter + 90, 10.5 * valueCounter + 30) withAttributes:attributes];
}
else if (valueCounter == 68 || valueCounter == 69)
{
[[[bfsmArray objectAtIndex:valueCounter] baseLineStart] drawAtPoint:CGPointMake(60 * keyCounter + 90, 10.5 * valueCounter + 30) withAttributes:attributes];
}
else
{
if([[[bfsmArray objectAtIndex:valueCounter] baseLineStart] isEqualToString:@""] && [[[bfsmArray objectAtIndex:valueCounter] actualFinish] isEqualToString:@""]){
}
else
{
[[NSString stringWithFormat:@"%@ / %@",[[bfsmArray objectAtIndex:valueCounter] baseLineStart],[[bfsmArray objectAtIndex:valueCounter] actualFinish]] drawAtPoint:CGPointMake(60 * keyCounter + 90, 10.5 * valueCounter + 30) withAttributes:attributes];
}
}
}
NSLog(@"%@", object2);
valueCounter++;
}
keyCounter++;
}
UIGraphicsPopContext();
CGPDFContextEndPage(pdfContext);
CGPDFContextClose(pdfContext);
NSString *myString = [fileURL absoluteString];
NSData *pdfData = [NSData dataWithContentsOfFile:myString];
return pdfData;
}
更新
我像这样添加了NSError:
NSError *error;
NSData *pdfData = [NSData dataWithContentsOfFile:myString options:nil error:&error];
NSLog(@"%@", error);
和NSError返回以下内容:
error NSError * domain: @"NSCocoaErrorDomain" - code: 260 0x16820310
以下是错误的控制台日志:
Error Domain=NSCocoaErrorDomain Code=260 "The file “test.pdf” couldn’t be opened because there is no such file." UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/A2C316BA-97DF-4560-8F6D-BA6A15B2CCA3/Documents/test.pdf, NSUnderlyingError=0x155420e0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
答案 0 :(得分:4)
变化:
NSString *myString = [fileURL absoluteString];
要:
NSString *myString = [fileURL path];
原因是[NSData dataWithContentsOfFile:]
期望一条路径,即/some/dir/file.pdf
。 absoluteString
会返回一个网址,即:file://some/dir/file.pdf
。
您可以在此question中详细了解path
与absoluteString
之间的差异。