DLPDFRenderer是一个用于从任意HTML输入生成多页PDF的轻量级解决方案。
NSData
或文件。0.0
以从网页内容中推断出来。(实验性)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 包含一个演示应用程序,可快速概述如何使用渲染类。
DLPDFRenderer 使用 自动引用计数 (ARC)。
无。
Vincent Esche (@regexident)
DLPDFRenderer 在一个带有 附加归属权要求 的 修改过的 BSD-3 条款许可 下可用。更多信息请参阅 LICENSE
文件。