iOS生成PDF圖文


PDF文檔生成兩種方式:
1.通過上下文繪制
2.通過UIPrintPageRenderer生成

  • 上下文繪制

參考地址

這個(gè)繪制方法比較麻煩湿酸,要去計(jì)算文本圖片內(nèi)容的位置大小,然后再繪制灭美。

  • UIPrintPageRenderer

給render設(shè)置printformatter推溃,然后直接繪制到PDF上下文中。

printformatter可以添加文本届腐,富文本,html字符串硬萍,也有直接將view轉(zhuǎn)化成UIViewPrintFormatter的類別围详。

這樣子就好辦了,寫一個(gè)html助赞,設(shè)置其中的樣式,加載到webview中畜普,最后webview調(diào)用viewPrintFormatter生成printFormatter群叶,渲染PDF钝荡。

代碼:

YHPDFTool.h

#import <UIKit/UIKit.h>

@interface YHPDFTool : UIView

/** 添加一行標(biāo)題*/
- (void)addHtmlTitle:(NSString *)title;

/** 添加一個(gè)表格*/
-(void)addHtmlTableSegList:(NSArray <NSString *>*)titleTitles andContentList:(NSArray <NSArray <NSDictionary *>*>*)contentList;


+ (void)creatPDFOnVC:(UIViewController *)vc andConfigBlock:(void(^)(YHPDFTool * tool))configBlock andFinishBlock:(void(^)(BOOL isSuccess, NSString * filepath))finishblock;

@end

YHPDFTool.m

#import "YHPDFTool.h"
#import "UIView+YH.h"
#import <NSString+YYAdd.h>

@interface YHPDFTool()<UIWebViewDelegate>

@property (retain, nonatomic) UIWebView * webV;

@property (retain, nonatomic) NSMutableString * htmlStr;

@property (copy, nonatomic) void(^finishblock)(BOOL isSuccess, NSString * filepath);

- (void)creatPDF;

@end

@implementation YHPDFTool


+ (void)creatPDFOnVC:(UIViewController *)vc andConfigBlock:(void (^)(YHPDFTool *))configBlock andFinishBlock:(void (^)(BOOL, NSString *))finishblock
{
    YHPDFTool * tool = [[YHPDFTool alloc] initWithFrame:CGRectZero];
    
    tool.htmlStr = [[NSMutableString alloc] init];
    
    if(configBlock)
    {
        configBlock(tool);
    }
    
    tool.finishblock = finishblock;
    
    [vc.view addSubview:tool];
    
    [tool creatPDF];
}


- (void)creatPDF
{
    self.webV = [[UIWebView alloc] initWithFrame:self.bounds];
    self.webV.delegate = self;
    [self addSubview:self.webV];
    
    [self.webV loadHTMLString:self.htmlStr baseURL:[[NSBundle mainBundle] bundleURL]];

}

-(void)webViewDidStartLoad:(UIWebView *)webView
{

}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{    
    if(self.finishblock)
    {
        self.finishblock(NO,nil);
    }
    
    if(self.superview)
    {
        [self removeFromSuperview];
    }
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
    render.headerHeight = 50;
    render.footerHeight = 50;
    [render addPrintFormatter:[webView viewPrintFormatter] startingAtPageAtIndex:0];
    CGRect page;
    page.origin.x=0;
    page.origin.y=0;
    page.size.width=600;
    page.size.height=612;
    
    
    CGRect printable=CGRectInset( page, 0, 0 );
    [render setValue:[NSValue valueWithCGRect:page] forKey:@"paperRect"];
    [render setValue:[NSValue valueWithCGRect:printable] forKey:@"printableRect"];
    
//    NSLog(@"number of pages %zd",[render numberOfPages]);
    
    NSMutableData * pdfData = [NSMutableData data];
    UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
    
    for (NSInteger i=0; i < [render numberOfPages]; i++)
    {
        UIGraphicsBeginPDFPage();
        CGRect bounds = UIGraphicsGetPDFContextBounds();
        [render drawPageAtIndex:i inRect:bounds];
        
    }
    
    UIGraphicsEndPDFContext();
    
    [pdfData writeToFile:[self pathPDF] atomically:YES];
    

    if(self.finishblock)
    {
        self.finishblock(YES,[self pathPDF]);
    }
    
    if(self.superview)
    {
        [self removeFromSuperview];
    }
}


- (void)addHtmlTitle:(NSString *)title
{
    [self.htmlStr appendFormat:@"<br /><p>\
     <br />\
     <br />\
     </p>\
     <h2 style=\"text-align:center;\">\
     %@\
     </h2>\
     <p>\
     </p>\
     ",title];
}

-(void)addHtmlTableSegList:(NSArray<NSString *> *)titleTitles andContentList:(NSArray<NSArray<NSDictionary *> *> *)contentList
{
    [self.htmlStr appendString:@"<br /><p>\
     <table style=\"width:100%;\" cellpadding=\"2\" cellspacing=\"0\" border=\"1\" bordercolor=\"#000000\">\
     <tbody>"];
    
    if(titleTitles)
    {
        [self.htmlStr appendString:@"<tr>"];
        
        for(NSString * str in titleTitles)
        {
            [self.htmlStr appendFormat:@"<td>%@</td><br />",str];
        }
        [self.htmlStr appendString:@"</tr>"];
    }
    
    if(contentList)
    {
        for(NSArray * titleList in contentList)
        {
            [self.htmlStr appendString:@"<tr>"];
            
            for(NSDictionary * dataDic in titleList)
            {
                [self.htmlStr appendString:@"<td>"];
                
                NSString * str = dataDic[@"title"];
                NSString * img = dataDic[@"image"];
                
                if([img isNotBlank])
                {
                    NSString * imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@@2x",img] ofType:@"png"];
                    
                    [self.htmlStr appendFormat:@"<img src=\"%@\" border=\"0\" width=\"15\" height=\"15\" alt=\"\" />  ",imagePath];
                }
                
                if([str isNotBlank])
                {
                    [self.htmlStr appendString:str];
                }
                
                [self.htmlStr appendString:@"<br /></td>"];
            }
            [self.htmlStr appendString:@"</tr>"];
        }
    }
    
    [self.htmlStr appendString:@"       </tbody>\
     </table>\
     </p>"];
    
}



- (NSString *)pathPDF
{
    NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    
    path = [path stringByAppendingPathComponent:@"yhpdf.pdf"];
    
//    NSLog(@"====\n%@",path);
    
    return path;
}

@end

如果html不是寫的話 有在線的html編輯器约炎,點(diǎn)這里

已在簡記-快速記賬本中使用蟹瘾,謝謝大家支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狸捕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灸拍,更是在濱河造成了極大的恐慌砾省,老刑警劉巖鸡岗,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轩性,死亡現(xiàn)場離奇詭異狠鸳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)件舵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門铅祸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛾派,“玉大人个少,你說我怎么就攤上這事】前模” “怎么了茫经?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵萎津,是天一觀的道長抹镊。 經(jīng)常有香客問我,道長垮耳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任俊嗽,我火速辦了婚禮铃彰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竹揍。我一直安慰自己邪铲,他們只是感情好鬼佣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布晶衷。 她就那樣靜靜地躺著阴孟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪永丝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天哥牍,我揣著相機(jī)與錄音喝检,去河邊找鬼。 笑死挠说,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛙奖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仔夺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缸兔?” 一聲冷哼從身側(cè)響起祭衩,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤阅签,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后政钟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡精算,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年灰羽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鱼辙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倒戏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傍念,到底是詐尸還是另有隱情葛闷,我是刑警寧澤憋槐,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布秦陋,位于F島的核電站治笨,受9級(jí)特大地震影響赤嚼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜更卒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一稚照、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧果录,春花似錦、人聲如沸辨萍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽义起。三九已至,卻和暖如春椅棺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背两疚。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工肴熏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛙吏。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓鸦做,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泼诱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容