대체 텍스트가 템플릿과 같은 길이가 아니라면 그렇게 간단하지 않습니다.
교체 할 템플릿의 길이가 동일한 경우 제공 한 첫 번째 링크에서 강조 표시된 메소드를 사용하고 코어 그래픽을 사용하여 올바른 위치에 대체품을 그릴 수 있습니다.
대체 텍스트가 가변적 인 경우 이전 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의 하위 클래스를 만들어야합니다.그래서 하위 클래스를 생성했다고 가정합니다. 나머지 호출은 다음과 같습니다. Ill는 아래의 하위 클래스를 보여줍니다.
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
당신은 질문이 있으면 알려 주시기, 또는 도움이있는 경우, 또는하지 않았다합니다.
아, 알겠습니다. 문자열의 길이가 같아야합니다 ... 불가능한 것입니다. 어쨌든 코드가 작동하는 방식을 이해하는 데 많은 도움이됩니다. 감사. – SpaceDog