BNHtmlPdfKit easily turns HTML data from an HTML string or URL into a PDF file on iOS. Feel free to fork this project and help make it better!
If you are using BNHtmlPdfKit in your app I would love to hear about it!
Just copy BNHtmlPdfKit.h and BNHtmlPdfKit.m into your project.
pod 'BNHtmlPdfKit', :git => 'https://github.com/brentnycum/BNHtmlPdfKit'This all started with a post of mine back in June of 2011, when I was trying to save Html data to a PDF and copy the PDF data to an email as an attachment. I had always wanted to make the code better and was finally able to. The post of mine generates a bunch of traffic to my blog to this day, by an order of 10 fold to the next top page and is still a very popular problem that people are working on.
You can either use blocks based or delegate based calling.
There are quite a few block methods provided for convenience.
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url success:(void (^)(NSData *pdfData))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url pageSize:(BNPageSize)pageSize success:(void (^)(NSData *pdfData))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url pageSize:(BNPageSize)pageSize isLandscape:(BOOL)landscape success:(void (^)(NSData *pdfData))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url pageSize:(BNPageSize)pageSize isLandscape:(BOOL)landscape topAndBottomMarginSize:(CGFloat)topAndBottom leftAndRightMarginSize:(CGFloat)leftAndRight success:(void (^)(NSData *pdfData))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url toFile:(NSString *)filename success:(void (^)(NSString *filename))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url toFile:(NSString *)filename pageSize:(BNPageSize)pageSize success:(void (^)(NSString *filename))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url toFile:(NSString *)filename pageSize:(BNPageSize)pageSize isLandscape:(BOOL)landscape success:(void (^)(NSString *filename))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url toFile:(NSString *)filename pageSize:(BNPageSize)pageSize isLandscape:(BOOL)landscape topAndBottomMarginSize:(CGFloat)topAndBottom leftAndRightMarginSize:(CGFloat)leftAndRight success:(void (^)(NSString *filename))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url customPageSize:(CGSize)pageSize success:(void (^)(NSData *pdfData))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url customPageSize:(CGSize)pageSize topAndBottomMarginSize:(CGFloat)topAndBottom leftAndRightMarginSize:(CGFloat)leftAndRight success:(void (^)(NSData *pdfData))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url toFile:(NSString *)filename customPageSize:(CGSize)pageSize success:(void (^)(NSString *filename))completion failure:(void (^)(NSError *error))failure;
+ (BNHtmlPdfKit *)saveUrlAsPdf:(NSURL *)url toFile:(NSString *)filename customPageSize:(CGSize)pageSize topAndBottomMarginSize:(CGFloat)topAndBottom leftAndRightMarginSize:(CGFloat)leftAndRight success:(void (^)(NSString *filename))completion failure:(void (^)(NSError *error))failure;To use them simply call:
htmlPdfKit = [BNHtmlPdfKit saveUrlAsPdf:[NSURL URLWithString:@"http://itsbrent.net"] toFile:@"...itsbrent.pdf" pageSize:BNPageSizeA6 success:^(NSString *pdfFileName) {
NSLog(@"Done");
} failure:^(NSError *err) {
NSLog(@"Failure");
}];
Be sure to retain a reference to the BNHtmlPdfKit object outside the scope of the calling method. Otherwise, no delegate methods will be called:
- (void) createPdf:(id)sender {
_htmlPdfKit = [[BNHtmlPdfKit alloc] init];
_htmlPdfKit.delegate = self;
[_htmlPdfKit saveUrlAsPdf:[NSURL URLWithString:@"http://itsbrent.net/index.html"]];
}
...
- (void)htmlPdfKit:(BNHtmlPdfKit *)htmlPdfKit didSavePdfData:(NSData *)data {
...
}
- (void)htmlPdfKit:(BNHtmlPdfKit *)htmlPdfKit didSavePdfFile:(NSString *)file {
...
}
- (void)htmlPdfKit:(BNHtmlPdfKit *)htmlPdfKit didFailWithError:(NSError *)error {
...
}
- (id)init;
- (id)initWithPageSize:(BNPageSize)pageSize;
- (id)initWithCustomPageSize:(CGSize)pageSize;Default initializer has default page size based on locale (thanks Pierre Bernard) and 1/4" margins.
BNHtmlPdfKit *htmlPdfKit = [[BNHtmlPdfKit alloc] init];
htmlPdfKit.delegate = self;
[htmlPdfKit saveUrlAsPdf:[NSURL URLWithString:@"http://itsbrent.net"] toFile:@"...itsbrent.pdf"];To just save PDF data.
[htmlPdfKit saveUrlAsPdf:[NSURL URLWithString:@"http://itsbrent.net"]];BNHtmlPdfKit *htmlPdfKit = [[BNHtmlPdfKit alloc] init];
htmlPdfKit.delegate = self;
[htmlPdfKit saveHtmlAsPdf:@"<html>..." toFile:@"...itsbrent.pdf"];To just save PDF data.
[htmlPdfKit saveHtmlAsPdf:@"<html>..."];- (void)htmlPdfKit:(BNHtmlPdfKit *)htmlPdfKit didSavePdfData:(NSData *)data;
- (void)htmlPdfKit:(BNHtmlPdfKit *)htmlPdfKit didSavePdfFile:(NSString *)file;
- (void)htmlPdfKit:(BNHtmlPdfKit *)htmlPdfKit didFailWithError:(NSError *)error;didSavePdfData is called whenever PDF data is generated for an Html string or URL. didSavePdfFile is called whenever a PDF file was saved using the toFile methods.
BNHtmlPdfKit has support for many of the top paper sizes.
- Letter -
BNPageSizeLetter - Government Letter -
BNPageSizeGovernmentLetter - Legal -
BNPageSizeLegal - Junior Legal -
BNPageSizeJuniorLegal - Ledger -
BNPageSizeLedger - Tabloid -
BNPageSizeTabloid - A0 -
BNPageSizeA0 - A1 -
BNPageSizeA1 - A2 -
BNPageSizeA2 - A3 -
BNPageSizeA3 - A4 -
BNPageSizeA4 - A5 -
BNPageSizeA5 - A6 -
BNPageSizeA6 - A7 -
BNPageSizeA7 - A8 -
BNPageSizeA8 - A9 -
BNPageSizeA9 - A10 -
BNPageSizeA10 - B0 -
BNPageSizeB0 - B1 -
BNPageSizeB1 - B2 -
BNPageSizeB2 - B3 -
BNPageSizeB3 - B4 -
BNPageSizeB4 - B5 -
BNPageSizeB5 - B6 -
BNPageSizeB6 - B7 -
BNPageSizeB7 - B8 -
BNPageSizeB8 - B9 -
BNPageSizeB9 - B10 -
BNPageSizeB10 - C0 -
BNPageSizeC0 - C1 -
BNPageSizeC1 - C2 -
BNPageSizeC2 - C3 -
BNPageSizeC3 - C4 -
BNPageSizeC4 - C5 -
BNPageSizeC5 - C6 -
BNPageSizeC6 - C7 -
BNPageSizeC7 - C8 -
BNPageSizeC8 - C9 -
BNPageSizeC9 - C10 -
BNPageSizeC10 - Japanese B0 -
BNPageSizeJapaneseB0 - Japanese B1 -
BNPageSizeJapaneseB1 - Japanese B2 -
BNPageSizeJapaneseB2 - Japanese B3 -
BNPageSizeJapaneseB3 - Japanese B4 -
BNPageSizeJapaneseB4 - Japanese B5 -
BNPageSizeJapaneseB5 - Japanese B6 -
BNPageSizeJapaneseB6 - Japanese B7 -
BNPageSizeJapaneseB7 - Japanese B8 -
BNPageSizeJapaneseB8 - Japanese B9 -
BNPageSizeJapaneseB9 - Japanese B10 -
BNPageSizeJapaneseB10 - Japanese B11 -
BNPageSizeJapaneseB11 - Japanese B12 -
BNPageSizeJapaneseB12
BNHtmlPdfKit also supports custom page sizes by using the customPageSize property. Specify your page size in inches * 72.0f.
htmlPdfKit.customPageSize = CGSizeMake(8.5f * 72.0f, 11.0f * 72.0f);Support for setting a paper size and setting as landscape is available by either using the landscape property or by using the custom init method below.
- (id)initWithPageSize:(BNPageSize)pageSize isLandscape:(BOOL)landscape;Default margin size is set to 1/4".
htmlPdfKit.topAndBottomMarginSize = 0.25f * 72.0f;
htmlPdfKit.leftAndRightMarginSize = 0.25f * 72.0f;- Fix page sizes to not use rounded inch values.
- Custom Top, Left, Bottom, and Right margins
- Brent Anderson for commit 6767874ecd.
- Pierre Bernard who also has his own fork gloubibou/BNHtmlPdfKit.
- Laurent Denoue for finding this bug.