真的没那么简单,除非替换的文字和模板一样长。
如果替换与模板的长度相同,您可以使用您提供的第一个链接中突出显示的方法,然后只需使用核心图形在坐标的正确位置绘制替换。
如果替换文本是可变的,那么您正在尝试将文本插入到旧的 pdf 中。据我所知,这很重要,除非您使用 libharu 等非常低级的库。
这里有一个可供您选择的解决方案,它可能适合您的需求,并且我正在使用。
首先,将您的模板存储为 HTML 文件。
在 HTML 文件中为要替换的文本放置占位符。
加载模板,替换文本,然后使用以下方法获取您的pdf。
NSString *html = @"<html><head></head><body>all my awesome html</body></html>"
为数据创建 PDF 上下文。
NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData( pdfData, CGRectMake(0, 0, kPDFPageWidth, kPDFPageHeight), nil );
创建一个标记文本打印格式化程序,在这种情况下,参数 html 是您完全替换的 html 模板页面。
UIMarkupTextPrintFormatter *fmt = [[UIMarkupTextPrintFormatter alloc]
initWithMarkupText:html];
标记格式化程序是苹果为您提供的用于打印 html 的工具,但您也可以使用它来打印 pdf。您需要子类化 UIPrintPageRenderer 才能执行此操作。所以假设你已经创建了你的子类,下面是调用的其余部分,我将在下面向你展示子类。
PDFPrintPageRenderer *renderer = [[PDFPrintPageRenderer alloc] init];
// Render the html into a PDF
[renderer addPrintFormatter:fmt startingAtPageAtIndex:0];
[renderer printToPDF:1];
print to pdf 是一个获取您要打印的页数的调用。如果您事先不知道这一点,确保一切看起来不错的最佳方法是将您的模板分成页面,并为每个页面执行此过程。无论如何,在这个电话之后,你应该有一个 pdf,你可以用以下内容保存。
UIGraphicsEndPDFContext();
//store the pdf
[pdfData writeToFile:basePath atomically:YES];
这是我使用的子类渲染器。
#define kPDFPageWidth 595
#define kPDFPageHeight 842
@interface PDFPrintPageRenderer : UIPrintPageRenderer
@property (nonatomic) BOOL generatingPDF;
@property (nonatomic) NSInteger heightCount;
- (NSData*) printToPDF:(NSInteger) height;
@end
实现
@implementation PDFPrintPageRenderer
@synthesize generatingPDF;
@synthesize heightCount;
- (CGRect) paperRect
{
if (!generatingPDF)
return [super paperRect];
return UIGraphicsGetPDFContextBounds();
}
- (CGRect) printableRect
{
if (!generatingPDF)
return [super printableRect];
return CGRectInset( self.paperRect, 5, 5 );
}
-(NSInteger) numberOfPages {
if (!generatingPDF) {
return [super numberOfPages];
}
return self.heightCount;
}
- (NSData*) printToPDF:(NSInteger) height
{
self.heightCount = height;
generatingPDF = YES;
[self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)];
CGRect bounds = UIGraphicsGetPDFContextBounds();
for ( int i = 0 ; i < self.numberOfPages; i++ )
{
UIGraphicsBeginPDFPage();
[self drawPageAtIndex: i inRect: bounds];
}
generatingPDF = NO;
return nil;
}
@end
如果您有任何问题,或者有帮助,或者没有帮助,请告诉我。