iOS - 搜索和替换PDF

时间:2012-09-26 00:30:57

标签: iphone ios ipad

我必须根据模板创建PDF文件。我的想法是使用“text1”,“text2”等占位符构建该模板。此模板将保存为PDF文件并放在应用程序包中。

在运行时,模板将被复制到新的PDF上下文,然后我会搜索占位符,用我想要的真实文本替换它们。

I have found this page,展示了如何从模板创建新PDF以及this one如何搜索PDF。

现在的问题是:如何在新PDF上替换内容(文本或图像)?

2 个答案:

答案 0 :(得分: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];

标记格式化程序是Apple为您提供的打印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

如果您有疑问,或者是否有帮助,或者是否有问题,请告诉我。

答案 1 :(得分:-1)

这是可能的。您可以将该文本的图像作为要替换的文本。

就像有两个文字 -

text1 = pdf中的实际文字 text2 =您希望通过替换text1

放入pdf的文本

现在获取text2的imageview并设置该文本的图像而不是text1的图像。 首先,您需要搜索text1并获取该文本的图像。那么只有你可以替换 带有text2的text1的图像。 还有一件事需要确保您无法直接更改文本。你必须拍摄该文字的图像,你只能替换图像。

另一件事是在pdf的图像中捕获该文本,您可以在cgpoint的帮助下使用drwaing中的确切点。因此,借助x和y坐标,您可以捕获要替换的文本。