0

我有一个用于测试的应用程序,它可以做很多事情,但最终产品是一个上传到数据库的 .pdf。不幸的是,我的一位最终用户不喜欢长 .pdf 是一页的事实。生成的页面长度变化很大,所以无论如何我都只是生成一个页面。我知道 Adob​​e Acrobat 会将大文件平铺到多个页面上进行打印,但客户担心这对某些人来说可能太难了 -_-

这是我现在创建 .pdf 的方式

- (void)exportAsPDF:(NSString *)filename
{        
    int restorer = mineTable.frame.size.height;

    CGRect temp = CGRectMake(mineTable.frame.origin.x, mineTable.frame.origin.y, mineTable.frame.size.width, 200*formDataStorage.cake.count);
    [self resizeTheTable:temp];

    int addNumber = temp.size.height - temp.origin.y;

    CGRect mediaBox = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height + addNumber);

    NSString *tmpFile = filename;

    CGContextRef ctx = CGPDFContextCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:tmpFile], &mediaBox, NULL);

    //turn PDF upside-down
    CGAffineTransform transform = CGAffineTransformIdentity;
    transform = CGAffineTransformMakeTranslation(0, mediaBox.size.height);
    transform = CGAffineTransformScale(transform, 1.0, -1.0);

    CGPDFContextBeginPage(ctx, NULL);
    CGContextConcatCTM(ctx, transform);

    [self.view setNeedsLayout];
    [self.view setNeedsDisplay];
    [self.view.layer renderInContext:ctx];

    CGPDFContextEndPage(ctx);

    CGPDFContextClose(ctx);
    CFRelease(ctx);
}

如您所见,我调整了视图的大小以显示我正在渲染的表格中的所有单元格,然后将视图截屏为 .pdf。用户永远不会看到调整大小的视图(无论如何它都不适合屏幕)。

有谁知道如何将创建的 .pdf 的不同部分与不同的页面相关联?谢谢。

4

2 回答 2

3

我最终使用了这段代码:

- (void)exportAsPDF:(NSString *)filename
{        
    int restorer = mineTable.frame.size.height;
    CGRect temp = CGRectMake(mineTable.frame.origin.x, mineTable.frame.origin.y, mineTable.frame.size.width, 398*formDataStorage.cake.count);
    [self resizeTheTable:temp];

    int addNumber = temp.size.height - temp.origin.y;
    CGRect mediaBox = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height + addNumber);

    NSMutableData *theData = [NSMutableData data];
    CGSize pageSize = CGSizeMake(self.view.frame.size.width, 792);
    UIGraphicsBeginPDFContextToData(theData, CGRectZero, nil);
    CGContextRef pdfContext = UIGraphicsGetCurrentContext();

    NSInteger currentPage = 0;
    BOOL done = NO;

    do {
        UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0.0, pageSize.width, pageSize.height), nil);
        CGContextTranslateCTM(pdfContext, 0, -(pageSize.height*currentPage));
        [self.view.layer renderInContext:pdfContext];

        if ((pageSize.height*(currentPage+1)) > mediaBox.size.height) done = YES;
        else currentPage++;
    } while (!done);

    UIGraphicsEndPDFContext();

    [theData writeToFile:filename atomically:YES];
    NSLog(@"PDF written to: %@", filename);
}
于 2012-07-27T17:19:07.640 回答
1

您已经回答了自己,但如果有帮助,您可以使用像Docmosis这样的服务从 iOS 生成 PDF。在您的情况下,永远不会发生分页问题,​​因为文档“流动”,因为它们是基于模板填充的。缺点是您必须连接到网络。

于 2012-08-02T08:54:59.703 回答