Guest User

Untitled

a guest
Feb 17th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.44 KB | None | 0 0
  1. -(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename
  2. {
  3. // Creates a mutable data object for updating with binary data, like a byte array
  4. UIWebView *webView = (UIWebView*)aView;
  5. NSString *heightStr = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];
  6.  
  7. int height = [heightStr intValue];
  8.  
  9. // Get the number of pages needed to print. 9 * 72 = 648
  10. int pages = ceil(height / 648.0);
  11.  
  12. NSMutableData *pdfData = [NSMutableData data];
  13. UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
  14. CGRect frame = [webView frame];
  15. for (int i = 0; i < pages; i++) {
  16. // Check to see if page draws more than the height of the UIWebView
  17. if ((i+1) * 648 > height) {
  18. CGRect f = [webView frame];
  19. f.size.height -= (((i+1) * 648.0) - height);
  20. [webView setFrame: f];
  21. }
  22.  
  23. UIGraphicsBeginPDFPage();
  24. CGContextRef currentContext = UIGraphicsGetCurrentContext();
  25. CGContextTranslateCTM(currentContext, 72, 72); // Translate for 1" margins
  26.  
  27. [[[webView subviews] lastObject] setContentOffset:CGPointMake(0, 648 * i) animated:NO];
  28. [webView.layer renderInContext:currentContext];
  29. }
  30.  
  31. UIGraphicsEndPDFContext();
  32. // Retrieves the document directories from the iOS device
  33. NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
  34.  
  35. NSString* documentDirectory = [documentDirectories objectAtIndex:0];
  36. NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];
  37.  
  38. // instructs the mutable data object to write its context to a file on disk
  39. [pdfData writeToFile:documentDirectoryFilename atomically:YES];
  40. [webView setFrame:frame];
  41. NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
  42. }
  43.  
  44. @interface UIPrintPageRenderer (PDF)
  45. - (NSData*) printToPDF;
  46. @end
  47.  
  48. @implementation UIPrintPageRenderer (PDF)
  49. - (NSData*) printToPDF
  50. {
  51. NSMutableData *pdfData = [NSMutableData data];
  52. UIGraphicsBeginPDFContextToData( pdfData, self.paperRect, nil );
  53. [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)];
  54. CGRect bounds = UIGraphicsGetPDFContextBounds();
  55. for ( int i = 0 ; i < self.numberOfPages ; i++ )
  56. {
  57. UIGraphicsBeginPDFPage();
  58. [self drawPageAtIndex: i inRect: bounds];
  59. }
  60. UIGraphicsEndPDFContext();
  61. return pdfData;
  62. }
  63. @end
  64.  
  65. #define kPaperSizeA4 CGSizeMake(595.2,841.8)
  66.  
  67. - (void)webViewDidFinishLoad:(UIWebView *)awebView
  68. {
  69. if (awebView.isLoading)
  70. return;
  71.  
  72. UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
  73. [render addPrintFormatter:awebView.viewPrintFormatter startingAtPageAtIndex:0];
  74. //increase these values according to your requirement
  75. float topPadding = 10.0f;
  76. float bottomPadding = 10.0f;
  77. float leftPadding = 10.0f;
  78. float rightPadding = 10.0f;
  79. CGRect printableRect = CGRectMake(leftPadding,
  80. topPadding,
  81. kPaperSizeA4.width-leftPadding-rightPadding,
  82. kPaperSizeA4.height-topPadding-bottomPadding);
  83. CGRect paperRect = CGRectMake(0, 0, kPaperSizeA4.width, kPaperSizeA4.height);
  84. [render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
  85. [render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];
  86. NSData *pdfData = [render printToPDF];
  87. if (pdfData) {
  88. [pdfData writeToFile:[NSString stringWithFormat:@"%@/tmp.pdf",NSTemporaryDirectory()] atomically: YES];
  89. }
  90. else
  91. {
  92. NSLog(@"PDF couldnot be created");
  93. }
  94. }
  95.  
  96. -(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename
  97. {
  98. // Creates a mutable data object for updating with binary data, like a byte array
  99. UIWebView *webView = (UIWebView*)aView;
  100. NSString *heightStr = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];
  101.  
  102. int height = [heightStr intValue];
  103. // CGRect screenRect = [[UIScreen mainScreen] bounds];
  104. // CGFloat screenHeight = (self.contentWebView.hidden)?screenRect.size.width:screenRect.size.height;
  105. CGFloat screenHeight = webView.bounds.size.height;
  106. int pages = ceil(height / screenHeight);
  107.  
  108. NSMutableData *pdfData = [NSMutableData data];
  109. UIGraphicsBeginPDFContextToData(pdfData, webView.bounds, nil);
  110. CGRect frame = [webView frame];
  111. for (int i = 0; i < pages; i++) {
  112. // Check to screenHeight if page draws more than the height of the UIWebView
  113. if ((i+1) * screenHeight > height) {
  114. CGRect f = [webView frame];
  115. f.size.height -= (((i+1) * screenHeight) - height);
  116. [webView setFrame: f];
  117. }
  118.  
  119. UIGraphicsBeginPDFPage();
  120. CGContextRef currentContext = UIGraphicsGetCurrentContext();
  121. // CGContextTranslateCTM(currentContext, 72, 72); // Translate for 1" margins
  122.  
  123. [[[webView subviews] lastObject] setContentOffset:CGPointMake(0, screenHeight * i) animated:NO];
  124. [webView.layer renderInContext:currentContext];
  125. }
  126.  
  127. UIGraphicsEndPDFContext();
  128. // Retrieves the document directories from the iOS device
  129. NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
  130.  
  131. NSString* documentDirectory = [documentDirectories objectAtIndex:0];
  132. NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];
  133.  
  134. // instructs the mutable data object to write its context to a file on disk
  135. [pdfData writeToFile:documentDirectoryFilename atomically:YES];
  136. [webView setFrame:frame];
  137. }
  138.  
  139. func webViewDidFinishLoad(webView: UIWebView) {
  140. let pdfData = createPdfFile(webView.viewPrintFormatter())
  141. pdfData.writeToFile("/path/to/file", atomically: true)
  142. }
  143.  
  144. func createPdfFile(printFormatter: UIViewPrintFormatter) -> NSData {
  145. let renderer = UIPrintPageRenderer()
  146. renderer.addPrintFormatter(printFormatter, startingAtPageAtIndex: 0);
  147. let paperSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)
  148. let printableRect = CGRectMake(0, 0, paperSize.width, paperSize.height)
  149. let paperRect = CGRectMake(0, 0, paperSize.width, paperSize.height);
  150. renderer.setValue(NSValue(CGRect: paperRect), forKey: "paperRect")
  151. renderer.setValue(NSValue(CGRect: printableRect), forKey: "printableRect")
  152. return renderer.printToPDF()
  153. }
  154.  
  155. extension UIPrintPageRenderer {
  156. func printToPDF() -> NSData {
  157. let pdfData = NSMutableData()
  158. UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, nil)
  159. self.prepareForDrawingPages(NSMakeRange(0, self.numberOfPages()))
  160. let bounds = UIGraphicsGetPDFContextBounds()
  161. for i in 0..<self.numberOfPages() {
  162. UIGraphicsBeginPDFPage();
  163. self.drawPageAtIndex(i, inRect: bounds)
  164. }
  165. UIGraphicsEndPDFContext();
  166. return pdfData;
  167. }
  168. }
  169.  
  170. func webViewDidFinishLoad(_ webView: UIWebView) {
  171. let pdfData = createPdfFile(printFormatter: webView.viewPrintFormatter())
  172. pdfData.write(toFile: "/path/to/file", atomically: true)
  173. }
  174.  
  175. func createPdfFile(printFormatter: UIViewPrintFormatter) -> NSData {
  176. let renderer = UIPrintPageRenderer()
  177. renderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)
  178. let point = CGPoint(x:0,y:0)
  179. let paperSize = CGSize(width: self.view.frame.size.width, height: self.view.frame.size.height)
  180. let printableRect = CGRect(origin: point, size: CGSize(width:paperSize.width, height: paperSize.height))
  181. let paperRect = CGRect(origin: point, size: CGSize(width: paperSize.width, height: paperSize.height))
  182. renderer.setValue(NSValue(cgRect: paperRect), forKey: "paperRect")
  183. renderer.setValue(NSValue(cgRect: printableRect), forKey: "printableRect")
  184. return renderer.printToPDF()
  185. }
  186.  
  187. extension UIPrintPageRenderer {
  188. func printToPDF() -> NSData {
  189. let pdfData = NSMutableData()
  190. UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, nil)
  191. self.prepare(forDrawingPages: NSMakeRange(0, self.numberOfPages))
  192. let bounds = UIGraphicsGetPDFContextBounds()
  193. for i in 0..<self.numberOfPages {
  194. UIGraphicsBeginPDFPage();
  195. self.drawPage(at: i, in: bounds)
  196. }
  197. UIGraphicsEndPDFContext();
  198. return pdfData;
  199. }
  200. }
  201.  
  202. CGRect screenRect = [[UIScreen mainScreen] bounds];
  203. CGFloat screenWidth = screenRect.size.width;
  204. CGFloat screenHeight = screenRect.size.height;
  205.  
  206. extension WKWebView {
  207.  
  208. // Call this function when WKWebView finish loading
  209. func exportAsPdfFromWebView() -> String {
  210. let pdfData = createPdfFile(printFormatter: self.viewPrintFormatter())
  211. return self.saveWebViewPdf(data: pdfData)
  212. }
  213.  
  214. func createPdfFile(printFormatter: UIViewPrintFormatter) -> NSMutableData {
  215. let originalBounds = self.bounds
  216. self.bounds = CGRect(x: originalBounds.origin.x,
  217. y: bounds.origin.y,
  218. width: self.bounds.size.width,
  219. height: self.scrollView.contentSize.height)
  220. let pdfPageFrame = CGRect(x: 0, y: 0, width: self.bounds.size.width,
  221. height: self.scrollView.contentSize.height)
  222. let printPageRenderer = UIPrintPageRenderer()
  223. printPageRenderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)
  224. printPageRenderer.setValue(NSValue(cgRect: UIScreen.main.bounds), forKey: "paperRect")
  225. printPageRenderer.setValue(NSValue(cgRect: pdfPageFrame), forKey: "printableRect")
  226. self.bounds = originalBounds
  227. return printPageRenderer.generatePdfData()
  228. }
  229.  
  230. // Save pdf file in document directory
  231. func saveWebViewPdf(data: NSMutableData) -> String {
  232.  
  233. let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
  234. let docDirectoryPath = paths[0]
  235. let pdfPath = docDirectoryPath.appendingPathComponent("webViewPdf.pdf")
  236. if data.write(to: pdfPath, atomically: true) {
  237. return pdfPath.path
  238. } else {
  239. return ""
  240. }
  241. }
  242. }
  243. extension UIPrintPageRenderer {
  244.  
  245. func generatePdfData() -> NSMutableData {
  246. let pdfData = NSMutableData()
  247. UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, nil)
  248. self.prepare(forDrawingPages: NSMakeRange(0, self.numberOfPages))
  249. let printRect = UIGraphicsGetPDFContextBounds()
  250. for pdfPage in 0..<self.numberOfPages {
  251. UIGraphicsBeginPDFPage()
  252. self.drawPage(at: pdfPage, in: printRect)
  253. }
  254. UIGraphicsEndPDFContext();
  255. return pdfData
  256. }
  257. }
Add Comment
Please, Sign In to add comment