我必須創建一個基於模板的PDF文件。我的想法是使用諸如「text1」,「text2」等佔位符來構建該模板。該模板將被保存爲PDF文件並放在應用程序包中。iOS - 在PDF上搜索和替換
在運行時,該模板將被複制到一個新的PDF上下文中,然後搜索佔位符,並用我想要的真實文本替換它們。
I have found this page,顯示如何從模板創建新的PDF,並且this one說明如何在PDF上進行搜索。
現在的問題是:如何替換新PDF上的東西(文本或圖像)?
我必須創建一個基於模板的PDF文件。我的想法是使用諸如「text1」,「text2」等佔位符來構建該模板。該模板將被保存爲PDF文件並放在應用程序包中。iOS - 在PDF上搜索和替換
在運行時,該模板將被複制到一個新的PDF上下文中,然後搜索佔位符,並用我想要的真實文本替換它們。
I have found this page,顯示如何從模板創建新的PDF,並且this one說明如何在PDF上進行搜索。
現在的問題是:如何替換新PDF上的東西(文本或圖像)?
其實並非如此簡單,除非替換文本與模板的長度相同。
如果替換的長度與模板的長度相同,則可以使用您提供的第一個鏈接中突出顯示的方法,然後使用核心圖形在正確的座標位置繪製替換。
如果替換文本是可變的,那麼您試圖將文本插入到舊的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
讓我知道,如果你有任何疑問,或者如果它幫助,或者如果它沒有。
這是可能的。您可以拍攝您想要替換的文字的圖像。
好像有在PDF 文本2 2周文本的
的text1 =實際文本=你希望把PDF文件通過替換文本1
現在就文本2的imageview的並且設置的圖像文本該文本而不是text1的圖像。 首先,您需要搜索text1並拍攝該文本的圖像。那麼只有你可以用text2替換文本1的圖像 。 還有一件事你需要確保你不能直接改變文本。您必須拍攝該文字的圖像,並且只能替換圖像。
另一件事是捕捉PDF圖像中的文字,你可以在cgpoint的幫助下使用drwaing中的確切點。因此,通過x和y座標的幫助,您可以捕獲要替換的文本。
對不起,但我的大腦在第二行之後就融化了。你可以添加一些代碼來展示這個動作嗎?謝謝。 – SpaceDog
啊,我知道,字符串必須是相同的長度......這使事情變得不可能......無論如何,你的代碼可以幫助你理解它是如何工作的。謝謝。 – SpaceDog