iphone - iOS - 在 PDF 上搜索和替换

标签 iphone ios ipad

我必须根据模板创建 PDF 文件。我的想法是使用“text1”、“text2”等占位符构建该模板。该模板将保存到 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

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

关于iphone - iOS - 在 PDF 上搜索和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592988/

相关文章:

ios - 以下 : UIViewController, UINavigationController、UITabController 的通用返回方式

ios - 在 Swift 中的标签栏上方显示 iAd 横幅

c++ - 将 C++ 库集成到 iPhone 应用程序中

iphone - 随着时间增量生成 ImageView

iOS 企业计划和 iOS 开发者计划

iphone - 将基于标签栏的 iPhone 项目迁移到 iPad

ios - 在 iOS7.1 UIButton 中设置图像不起作用?

ios - 室内导航如何在 iOS 中使用 iBeacon 或 wi-fi 工作?

ios - cocos2d动画从后台返回时停止

ios - 在 UIView 中加载多个 tableview(UIView Controller )