2012-09-26 2 views
2

템플릿을 기반으로 PDF 파일을 만들어야합니다. 내 생각은 "text1", "text2"등과 같은 자리 표시자를 사용하여 해당 템플릿을 작성하는 것입니다.이 템플릿은 PDF 파일에 저장되어 앱 번들에 저장됩니다.iOS - PDF에서 검색 및 바꾸기

런타임에 서식 파일을 새 PDF 컨텍스트로 복사 한 다음 자리 표시자를 검색하여 원하는 실제 텍스트로 바꿉니다.

I have found this page으로 템플릿에서 새 PDF를 만드는 방법과 PDF 검색 방법을 this one으로 보여줍니다.

질문은 다음과 같습니다. 어떻게하면 새 PDF에서 내용 (텍스트 또는 이미지)을 바꿀 수 있습니까?

답변

3

대체 텍스트가 템플릿과 같은 길이가 아니라면 그렇게 간단하지 않습니다.

교체 할 템플릿의 길이가 동일한 경우 제공 한 첫 번째 링크에서 강조 표시된 메소드를 사용하고 코어 그래픽을 사용하여 올바른 위치에 대체품을 그릴 수 있습니다.

대체 텍스트가 가변적 인 경우 이전 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 

당신은 질문이 있으면 알려 주시기, 또는 도움이있는 경우, 또는하지 않았다합니다.

+0

아, 알겠습니다. 문자열의 길이가 같아야합니다 ... 불가능한 것입니다. 어쨌든 코드가 작동하는 방식을 이해하는 데 많은 도움이됩니다. 감사. – SpaceDog

-1

가능합니다. 바꾸려는 텍스트의 이미지를 찍을 수도 있습니다.

PDF 텍스트 2 두 텍스트 -

텍스트 1 = 실제 텍스트 = 지금 텍스트 2의 이미지 뷰를 취할 그리고의 이미지를 설정

텍스트 1을 대체하여 PDF 파일에 넣어하려는 텍스트가 같은 그 텍스트 대신 text1의 이미지. 먼저 text1을 검색하고 해당 텍스트의 이미지를 가져와야합니다. 당신은 대신 text1의 이미지를 text2로 바꿀 수 있습니다. 그리고 텍스트를 직접 변경할 수 없도록하는 것이 더 필요합니다. 그 텍스트의 이미지를 가져와야하고 이미지 만 바꿀 수 있습니다.

그리고 다른 점은 pdf의 이미지에서 그 텍스트를 잡는 것입니다. cgpoint의 도움으로 drwaing에서 정확한 지점을 사용할 수 있습니다. 따라서 x와 y 좌표의 도움으로 대체하려는 텍스트를 잡을 수 있습니다.

+0

미안하지만 내 두뇌가 녹아 내 두뇌. 이 코드가 실제로 작동하는지 보여주기 위해 코드를 추가 할 수 있습니까? 감사. – SpaceDog