置換テキストがテンプレートと同じ長さでない限り、それは実際にはそれほど単純ではありません。
置換がテンプレートと同じ長さである場合は、提供した最初のリンクで強調表示されている方法を使用してから、コアグラフィックを使用して、座標の正しい位置に置換を描画できます。
置換テキストが可変の場合は、テキストを古い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
ご不明な点がある場合、または役に立った場合、または役に立たなかった場合はお知らせください。