DLPDFRenderer 1.1.2

DLPDFRenderer 1.1.2

测试已测试
Lang语言 Obj-CObjective C
许可证 BSD
发布最后发布2014年12月

Vincent Esche维护。



  • Vincent Esche

DLPDFRenderer是一个用于从任意HTML输入生成多页PDF的轻量级解决方案。

特性

  • 简单的API 使用 DataSource/Delegate
  • 将PDF渲染为NSData或文件。
  • 单独的页面大小和可打印矩形。
  • 将页面的宽度或高度设置为 0.0 以从网页内容中推断出来。(实验性)
  • 为每页指定单独的 media-crop-bleed-trim-art-boxes(可选)。
  • 设置文档属性:作者创建者标题关键词(可选)。
  • 使用 owner- 和/或 user-password(可选)对渲染的PDF文件进行安全设置。
  • 指定 加密密钥长度(可选)。
  • 锁定复制和/或打印(可选)。

DLPDFRenderer与HTML 模板引擎搭配非常出色!

安装

只需将“DLPDFRenderer/Classes/...”中的文件复制到您的项目中。

或者您可以使用CocoaPods将DLPDFRenderer安装到您的项目中。
只需在Podfile中添加它:pod 'DLPDFRenderer'

用法

查看DLPDFRenderer.h以获取完整的API和DLPDFRenderer.m以获取一个简单的用法示例。

示例用法

- (void)startRender {
    // Init a renderer:
    self.renderer = [[DLPRRenderer alloc] initWithDataSource:self delegate:self];

    // start render, either to NSData:
    [self.renderer renderToDataWithDocumentInfo:nil];

    // or directly to a file:
    // [self.renderer renderToFile:@"path/to/test.pdf" withDocumentInfo:nil];
}

#pragma mark - DLPRRendererDataSource Protocol

- (BOOL)renderer:(DLPRRenderer *)renderer hasReachedLastPageAtIndex:(NSUInteger)pageIndex {
    return ...;
}

- (id<DLPRPage>)renderer:(DLPRRenderer *)renderer pageAtIndex:(NSUInteger)pageIndex {
    NSString *source = ...;
    DLPRSourcePage *page = [[DLPRSourcePage alloc] initWithSource:source];

    CGSize paperSize = [DLPRSourcePage paperSizeForISO216A:4 forOrientation:DLPRPageOrientationPortrait];
    page.paperSize = paperSize;

    CGFloat insetInInches = 0.5;
    CGFloat insetPixels = insetInInches * [DLPRSourcePage resolution];
    page.margins = DLPRPageMarginsMakeUniform(insetInPixels);

    return page;
}

#pragma mark - DLPRRendererDelegate Protocol

- (void)renderer:(DLPRRenderer *)renderer finishedWithData:(NSData *)data orFile:(NSString *)file {
    if (data) {
        [self.webview loadData:data MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];
    } else if (file) {
        [self.webview loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:file]]];
    }
}

- (void)renderer:(DLPRRenderer *)renderer failedWithError:(NSError *)error {
    // handle failure
}

自定义绘制

对于可能需要在页面内容之上或之下绘制页眉/页脚或水印的情况,DLPDFRenderer提供了可选的按页回调块。

以下示例代码片段在渲染的页面顶部绘制一个红色矩形:

renderer.pageCallbackBlock = ^(CGContextRef context, id<DLPRPage> page, CGRect pageBounds, CGRect paperRect, NSDictionary *boxInfo, NSUInteger currentPageIndex) {
    CGContextSetFillColorWithColor(context, [[UIColor redColor] colorWithAlphaComponent:0.5].CGColor);
    CGContextFillRect(context, CGRectInset(pageBounds, 100.0, 100.0));
};

高级用法

对于想直接将资产(如图片)注入到PDF中而无需先写入磁盘(或者想包括本地和远程资产)的情况,可以包含它们通过自定义URL方案:`”并让它们由自定义NSURLProtocol子类处理。

@interface YourCustomURLProtocol : NSURLProtocol

@end

@implementation YourCustomURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    if ([request.URL.scheme caseInsensitiveCompare:@"test"] == NSOrderedSame) {
        return YES;
    }
    return NO;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

- (void)startLoading {
    if ([self isRequestForImage]) {
        [self loadPNGImageForURL:self.request.URL];
    } else {
        // ...
    }
}

- (void)stopLoading {

}

- (void)loadPNGImageForURL:(NSURL *)url {
    UIImage *image = [... inMemoryImageForURL:url]]; //cache it if appropriate
    NSData *data = UIImagePNGRepresentation(image);
    if (image) {
        NSURLResponse *response = [[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:@"image/png" expectedContentLength:data.length textEncodingName:@"utf-8"];
        [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowedInMemoryOnly];
        [self.client URLProtocol:self didLoadData:data];
        [self.client URLProtocolDidFinishLoading:self];
    } else {
        [self.client URLProtocol:self didFailWithError:...];
    }
}

@end

别忘了调用……

[NSURLProtocol registerClass:[YourCustomURLProtocol class]];

在开始实际渲染之前,在某个时间点进行调用。

演示

DLPDFRenderer 包含一个演示应用程序,可快速概述如何使用渲染类。

ARC

DLPDFRenderer 使用 自动引用计数 (ARC)

依赖项

无。

创建者

Vincent Esche (@regexident)

许可协议

DLPDFRenderer 在一个带有 附加归属权要求修改过的 BSD-3 条款许可 下可用。更多信息请参阅 LICENSE 文件。