在 iOS 上创建动态 pdf 文档

Create dynamic pdf documents on iOS

如何在 iOS 上创建动态 pdf 文档? 我可以使用 objective-c/swift 来完成,但应该支持动态内容和每个文档的不同页数。 每个 PDF 文档的创建都应该 "on the fly" 不使用模板。

要在我们的 PDF 中绘制一些文本,我们将需要使用 Core Text 框架。为此,select 项目目标并转到“构建阶段”选项卡。单击 Link Binaries With Libraries 选项下方的 + 号,然后单击 select CoreText 框架。

然后打开ViewController.h并导入CoreTextheader:

#import <CoreText/CoreText.h>

向 ViewController.m 添加新方法以创建“hello world”PDF。

-(void)drawText
{
NSString* fileName = @"Invoice.PDF";

NSArray *arrayPaths =
NSSearchPathForDirectoriesInDomains(
                                    NSDocumentDirectory,
                                    NSUserDomainMask,
                                    YES);
NSString *path = [arrayPaths objectAtIndex:0];
NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];

NSString* textToDraw = @"Hello World";
CFStringRef stringRef = (__bridge CFStringRef)textToDraw;

// Prepare the text using a Core Text Framesetter.
CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, stringRef, NULL);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);

CGRect frameRect = CGRectMake(0, 0, 300, 50);
CGMutablePathRef framePath = CGPathCreateMutable();
CGPathAddRect(framePath, NULL, frameRect);

// Get the frame that will do the rendering.
CFRange currentRange = CFRangeMake(0, 0);
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
CGPathRelease(framePath);

// Create the PDF context using the default page size of 612 x 792.
UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);

// Mark the beginning of a new page.
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);

// Get the graphics context.
CGContextRef currentContext = UIGraphicsGetCurrentContext();

// Put the text matrix into a known state. This ensures
// that no old scaling factors are left in place.
CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);

// Core Text draws from the bottom-left corner up, so flip
// the current transform prior to drawing.
CGContextTranslateCTM(currentContext, 0, 100);
CGContextScaleCTM(currentContext, 1.0, -1.0);

// Draw the frame.
CTFrameDraw(frameRef, currentContext);

CFRelease(frameRef);
CFRelease(stringRef);
CFRelease(framesetter);

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

}

参考资料

1. How to create a pdf with quartz-2d in ios part-1

2. How to create a pdf with quartz 2d in ios part-2

有关 CoreText 框架的更多信息

1. Core text tutorial for ios making a magazine app

2. About Core Text - Apple Doc