2012-09-26 66 views
2

我必須創建一個基於模板的PDF文件。我的想法是使用諸如「text1」,「text2」等佔位符來構建該模板。該模板將被保存爲PDF文件並放在應用程序包中。iOS - 在PDF上搜索和替換

在運行時,該模板將被複制到一個新的PDF上下文中,然後搜索佔位符,並用我想要的真實文本替換它們。

I have found this page,顯示如何從模板創建新的PDF,並且this one說明如何在PDF上進行搜索。

現在的問題是:如何替換新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才能完成此操作。所以假設你已經創建了你的子類,這裏是其餘的調用將看起來像,我向你展示下面的子類。

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 2周文本的

的text1 =實際文本=你希望把PDF文件通過替換文本1

現在就文本2的imageview的並且設置的圖像文本該文本而不是text1的圖像。 首先,您需要搜索text1並拍攝該文本的圖像。那麼只有你可以用text2替換文本1的圖像 。 還有一件事你需要確保你不能直接改變文本。您必須拍攝該文字的圖像,並且只能替換圖像。

另一件事是捕捉PDF圖像中的文字,你可以在cgpoint的幫助下使用drwaing中的確切點。因此,通過x和y座標的幫助,您可以捕獲要替換的文本。

+0

對不起,但我的大腦在第二行之後就融化了。你可以添加一些代碼來展示這個動作嗎?謝謝。 – SpaceDog