UIVIEW轉(zhuǎn)PDF文件

最近項(xiàng)目中新增了一個(gè)分享pdf文件的的功能讲冠,把一個(gè)界面以pdf文件的形式分享出去券膀,剛開始接觸pdf辟躏,沒一點(diǎn)思路谷扣,各種查資料,中間踩了好多坑捎琐。下面我就把自己踩到的坑跟大家分享一下会涎。

??? 第一步要做的就是把uiview轉(zhuǎn)換成image,然后把image畫到pdf的畫布上野哭。

1 uiview轉(zhuǎn)image

UIGraphicsBeginImageContext(CGSizeMake(scrollV.contentSize.width, scrollV.contentSize.height));

[scrollV.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage*image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

image = [self clipWithImageRect:CGRectMake(0, 0, image.size.width, image.size.height/2) clipImage:image];

由于圖片不是全部都需要在塔,這里我進(jìn)行了一步切割處理

- (UIImage *)clipWithImageRect:(CGRect)clipRect clipImage:(UIImage *)clipImage;

{

CGImageRef cgRef = clipImage.CGImage;

CGImageRef imageRef = CGImageCreateWithImageInRect(cgRef, clipRect);

UIImage *newImage = [UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

return? newImage;

}

拿到想要的圖片之后要做的就是把它畫到pdf文件上

//上面的圖片 畫圖用數(shù)學(xué)坐標(biāo)系

CGImageRef pageImage = [image CGImage];

CGContextDrawImage(myPDFContext, CGRectMake(0, scrollV.contentSize.height-image.size.height, [image size].width, [image size].height), pageImage);


由于我的需求比較特殊,這個(gè)view的底層是scrollview拨黔,所以這個(gè)scrollview的滾動(dòng)區(qū)域是動(dòng)態(tài)的蛔溃,不是一個(gè)屏幕大小這樣直接截個(gè)屏幕就行,于是我實(shí)驗(yàn)了好久發(fā)現(xiàn)篱蝇,改變scrollview的偏移量在截張然后把這兩張剪切一下拼起來就好了贺待。pdf從創(chuàng)建到結(jié)束的代碼如下:

// 1.創(chuàng)建media box

CGFloat myPageWidth = scrollV.contentSize.width;

CGFloat myPageHeight = scrollV.contentSize.height;

CGRect mediaBox = CGRectMake (0, 0, myPageWidth, myPageHeight);

// 2.設(shè)置pdf文檔存儲(chǔ)的路徑

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = paths[0];

NSString *filePath = [documentsDirectory stringByAppendingString:[NSString stringWithFormat:@"%@%@.pdf",@"/",pdfName]];

const char *cfilePath = [filePath UTF8String];

CFStringRef pathRef = CFStringCreateWithCString(NULL, cfilePath, kCFStringEncodingUTF8);

// 3.設(shè)置當(dāng)前pdf頁面的屬性

CFStringRef myKeys[3];

CFTypeRef myValues[3];

myKeys[0] = kCGPDFContextMediaBox;

myValues[0] = (CFTypeRef) CFDataCreate(NULL,(const UInt8 *)&mediaBox, sizeof (CGRect));

myKeys[1] = kCGPDFContextTitle;

myValues[1] = CFSTR("我的PDF");

myKeys[2] = kCGPDFContextCreator;

myValues[2] = CFSTR("Name");

CFDictionaryRef pageDictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, 3,

&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);

// 4.獲取pdf繪圖上下文

CGContextRef myPDFContext = MyPDFContextCreate (&mediaBox, pathRef);

// 5.開始描繪第一頁頁面

CGPDFContextBeginPage(myPDFContext, pageDictionary);

scrollV.contentOffset = CGPointZero;

//? ? CGRect s = scrollV.frame;

//? ? s.size = scrollV.contentSize;

//? ? UIGraphicsBeginImageContextWithOptions(s.size, YES, [UIScreen mainScreen].scale);

UIGraphicsBeginImageContext(CGSizeMake(scrollV.contentSize.width, scrollV.contentSize.height));

[scrollV.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage*image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

image = [self clipWithImageRect:CGRectMake(0, 0, image.size.width, image.size.height/2) clipImage:image];

//上面的圖片 畫圖用數(shù)學(xué)坐標(biāo)系

CGImageRef pageImage = [image CGImage];

CGContextDrawImage(myPDFContext, CGRectMake(0, scrollV.contentSize.height-image.size.height, [image size].width, [image size].height), pageImage);

scrollV.contentOffset = CGPointMake(0, scrollV.contentSize.height-image.size.height);

UIGraphicsBeginImageContext(scrollV.contentSize);

[scrollV.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage*image2 = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

image2 = [self clipWithImageRect:CGRectMake(0, scrollV.contentSize.height/2, image2.size.width, image2.size.height/2) clipImage:image2];

CGImageRef pageImage2 = [image2 CGImage];

CGContextDrawImage(myPDFContext, CGRectMake(0, 0, [image2 size].width, [image2 size].height), pageImage2);

CGPDFContextEndPage(myPDFContext);

CFRelease(pageDictionary);

CFRelease(myValues[0]);

CGContextRelease(myPDFContext);

scrollV.contentOffset = CGPointZero;

最后改變scrollview的偏移量

這個(gè)代碼已經(jīng)可以滿足需求了,不過有局限性零截,就是如果pdf的頁數(shù)超過了兩頁麸塞,就不能用了,于是我又花了好長的時(shí)間優(yōu)化代碼涧衙,被pdf搞的累死了哪工。如果有問題隨時(shí)可以跟我交流:QQ:872486713

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弧哎,隨后出現(xiàn)的幾起案子雁比,更是在濱河造成了極大的恐慌,老刑警劉巖撤嫩,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偎捎,死亡現(xiàn)場離奇詭異序攘,居然都是意外死亡程奠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門朴皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泛粹,“玉大人晶姊,你說我怎么就攤上這事〖卣” “怎么了宗侦?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵矾利,是天一觀的道長馋袜。 經(jīng)常有香客問我,道長察皇,這世上最難降的妖魔是什么泽台? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮溃睹,結(jié)果婚禮上胰坟,老公的妹妹穿的比我還像新娘泞辐。我一直安慰自己咐吼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布茶没。 她就那樣靜靜地躺著抓半,像睡著了一般格嘁。 火紅的嫁衣襯著肌膚如雪糕簿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音殃恒,去河邊找鬼芋类。 笑死隆嗅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侯繁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼丽焊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咕别?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤惰拱,失蹤者是張志新(化名)和其女友劉穎雌贱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偿短,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年降传,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勾怒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翼悴,靈堂內(nèi)的尸體忽然破棺而出缚够,到底是詐尸還是另有隱情,我是刑警寧澤古话,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布雏吭,位于F島的核電站,受9級(jí)特大地震影響陪踩,放射性物質(zhì)發(fā)生泄漏杖们。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一肩狂、第九天 我趴在偏房一處隱蔽的房頂上張望摘完。 院中可真熱鬧,春花似錦傻谁、人聲如沸孝治。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谈飒。三九已至,卻和暖如春态蒂,著一層夾襖步出監(jiān)牢的瞬間杭措,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工钾恢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留手素,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓瘩蚪,卻偏偏與公主長得像刑桑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子募舟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • UIGraphicsBeginImageContext 創(chuàng)建一個(gè)基于位圖的上下文(context),并將其設(shè)置為當(dāng)...
    李前途閱讀 3,234評(píng)論 1 4
  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發(fā)出絢麗的界面效果,一方面得益于成功系統(tǒng)的設(shè)計(jì)闻察,另一方面得益...
    韓七夏閱讀 2,721評(píng)論 2 10
  • 在通往知識(shí)的頂峰的路上長滿了荊棘拱礁,望你不畏艱險(xiǎn)琢锋、克服困難、勇往直前呢灶!
    鼗豸爻爻閱讀 188評(píng)論 0 0
  • 文/寧靜的煙火 青春的歲月就像是一條河吴超,流著流著就變成渾湯了。 2017年9月7日 星期四 晴 我是個(gè)痞子鸯乃。...
    寧靜的煙火閱讀 972評(píng)論 13 21
  • 重逢 文/冰百合 再也沒有那樣地重逢了 松林的光陰慢 慢慢地走過二十四節(jié)氣 萬水千山的蒼翠停留在它的發(fā)梢 細(xì)雨...
    冰百合閱讀 361評(píng)論 1 4