【问题标题】:iOS - searching and replacing on a PDFiOS - 在 PDF 上搜索和替换
【发布时间】:2012-09-26 00:30:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: iphone ios ipad


    【解决方案1】:

    真的没那么简单,除非替换的文字和模板一样长。

    如果替换与模板的长度相同,您可以使用您提供的第一个链接中突出显示的方法,然后只需使用核心图形在坐标的正确位置绘制替换。

    如果替换文本是可变的,那么您正在尝试将文本插入到旧的 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
    

    如果您有任何问题,或者有帮助,或者没有帮助,请告诉我。

    【讨论】:

    • 啊,我明白了,字符串必须是相同的长度......这使得事情变得不可能......无论如何,您的代码有助于理解它是如何工作的。谢谢。
    【解决方案2】:

    这是可能的。您可以获取要替换的文本的图像。

    好像有两个文本-

    text1 = pdf 中的实际文本 text2 = 您要通过替换 text1 放入 pdf 中的文本

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

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

    【讨论】:

    • 很抱歉,第二行后我的大脑融化了。你能添加一些代码来展示这个吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2023-04-07
    • 2017-01-05
    相关资源
    最近更新 更多