RAPDFPage.m 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. //
  2. // RAPDFPage.m
  3. // pdftest
  4. //
  5. // Created by Ray on 10/11/16.
  6. // Copyright © 2016 United Software Applications, Inc. All rights reserved.
  7. //
  8. #import "RAPDFPage.h"
  9. #import "GroupDrawable.h"
  10. #import "ImageDrawable.h"
  11. #import "LineDrawable.h"
  12. #import "TextDrawable.h"
  13. #import "TableDrawable.h"
  14. #import "GridDrawable.h"
  15. @implementation RAPDFPage
  16. -(instancetype) init:(NSMutableDictionary *)page size:(CGRect)rect
  17. {
  18. if (self = [super init]) {
  19. self.rect = rect;
  20. [self setPageTemplate:page];
  21. self.pagecount=1;
  22. }
  23. return self;
  24. }
  25. -(void) setPageTemplate:(NSMutableDictionary *)pageTemplate
  26. {
  27. _pageTemplate = pageTemplate;
  28. self.margin_left=[self.pageTemplate[@"margin_left"] doubleValue];
  29. self.margin_right=[self.pageTemplate[@"margin_right"] doubleValue];
  30. self.margin_top=[self.pageTemplate[@"margin_top"] doubleValue];
  31. self.margin_bottom=[self.pageTemplate[@"margin_bottom"] doubleValue];
  32. self.header=self.pageTemplate[@"header"];
  33. self.footer=self.pageTemplate[@"footer"];
  34. self.drawable_rect = CGRectMake(self.rect.origin.x+self.margin_left, self.rect.origin.y+self.margin_top, self.rect.size.width-(self.margin_right+self.margin_left), self.rect.size.height-(self.margin_bottom+self.margin_top));
  35. self.pos_x = _margin_left;
  36. self.pos_y = _margin_top;
  37. // self.rect = CGRectMake(0, 0, [self.pageTemplate[@"width"] doubleValue], [self.pageTemplate[@"height"] doubleValue]);
  38. }
  39. -(int) QueryPageCount:(CGContextRef) context dataSource:(NSMutableDictionary*)data
  40. {
  41. self.data=data;
  42. GroupDrawable* pageHeader = [[GroupDrawable alloc]init:self.header];
  43. self.header_height=pageHeader.rect.size.height;
  44. pageHeader.delegate = self;
  45. GroupDrawable* pageFooter = [[GroupDrawable alloc]init:self.footer];
  46. pageFooter.delegate = self;
  47. // while (true)
  48. {
  49. // page 去除页眉,页脚后的区域
  50. NSRange range = NSMakeRange(self.drawable_rect.origin.y+pageHeader.rect.size.height, self.drawable_rect.origin.y+self.drawable_rect.size.height-pageFooter.rect.size.height);
  51. // CGRect rect = self.rect;
  52. // CGContextBeginPage(context, &rect);
  53. // [pageHeader Draw:context dataSource:data ParentRect:(CGRect)self.drawable_rect startX:0 startY:0 flipHeight:self.rect.size.height range:range];
  54. for (int i=0;i<[self.pageTemplate[@"contents"][@"count"] intValue];i++)
  55. {
  56. NSMutableDictionary * item =self.pageTemplate[@"contents"][ [NSString stringWithFormat:@"item_%d",i ] ];
  57. PDFDrawable* drawable_obj=nil;
  58. if([item[@"type"] isEqualToString:@"img"])
  59. {
  60. drawable_obj= [[ImageDrawable alloc] init:item];
  61. }
  62. else if([item[@"type"] isEqualToString:@"line"])
  63. {
  64. drawable_obj= [[LineDrawable alloc] init:item];
  65. }
  66. else if([item[@"type"] isEqualToString:@"text"])
  67. {
  68. drawable_obj= [[TextDrawable alloc] init:item];
  69. }
  70. else if([item[@"type"] isEqualToString:@"group"])
  71. {
  72. drawable_obj= [[GroupDrawable alloc] init:item];
  73. }
  74. else if([item[@"type"] isEqualToString:@"table"])
  75. {
  76. drawable_obj= [[TableDrawable alloc] init:item];
  77. }
  78. else if([item[@"type"] isEqualToString:@"grid"])
  79. {
  80. drawable_obj= [[GridDrawable alloc] init:item];
  81. }
  82. drawable_obj.delegate = self;
  83. [drawable_obj Query_Rect:context dataSource:data ParentRect:(CGRect)self.drawable_rect startX:0 startY:self.header_height flipHeight:self.rect.size.height range:range];
  84. }
  85. // [pageFooter Draw:context dataSource:data ParentRect:(CGRect)self.drawable_rect startX:0 startY:0 flipHeight:self.rect.size.height range:range];
  86. // CGContextEndPage(context);
  87. }
  88. return self.pagecount;
  89. }
  90. -(void) DirectDraw:(CGContextRef) context page:(CGPDFPageRef)page
  91. {
  92. // CGAffineTransform m;
  93. // m = CGPDFPageGetDrawingTransform (page, kCGPDFCropBox, self.rect, -180, true);
  94. CGContextSaveGState (context);
  95. // CGContextTranslateCTM(myContext, 80, self.frame.size.height);
  96. // CGContextScaleCTM(myContext, 1, -1);
  97. CGContextDrawPDFPage (context, page);
  98. CGContextRestoreGState (context);
  99. }
  100. -(void) DirectDraw:(CGContextRef) context drawable:(PDFDrawable*)drawable_obj
  101. {
  102. if(drawable_obj==nil)
  103. return;
  104. DebugLog(@"pdfpage directdraw begin");
  105. NSRange range = NSMakeRange(0,self.rect.size.height);
  106. // CGRect rect = self.rect;
  107. drawable_obj.delegate = self;
  108. [drawable_obj Draw:context dataSource:nil ParentRect:(CGRect)self.drawable_rect startX:0 startY:self.header_height flipHeight:self.rect.size.height range:range];
  109. DebugLog(@"pdfpage directdraw end");
  110. }
  111. -(void) Draw:(CGContextRef) context dataSource:(NSMutableDictionary*)data
  112. {
  113. self.data=data;
  114. GroupDrawable* pageHeader = [[GroupDrawable alloc]init:self.header];
  115. self.header_height=pageHeader.rect.size.height;
  116. pageHeader.delegate = self;
  117. GroupDrawable* pageFooter = [[GroupDrawable alloc]init:self.footer];
  118. pageFooter.delegate = self;
  119. // while (true)
  120. {
  121. // page 去除页眉,页脚后的区域
  122. NSRange range = NSMakeRange(self.drawable_rect.origin.y+pageHeader.rect.size.height, /*self.drawable_rect.origin.y+*/self.drawable_rect.size.height-pageFooter.rect.size.height-pageHeader.rect.size.height);
  123. // NSRange range = NSMakeRange(self.drawable_rect.origin.y+pageHeader.rect.size.height, self.drawable_rect.size.height-pageFooter.rect.size.height+self.drawable_rect.size.height);
  124. CGRect rect = self.rect;
  125. CGContextBeginPage(context, &rect);
  126. [pageHeader Draw:context dataSource:data ParentRect:(CGRect)self.drawable_rect startX:0 startY:0 flipHeight:self.rect.size.height range:range];
  127. [pageFooter Draw:context dataSource:data ParentRect:(CGRect)self.drawable_rect startX:0 startY:0 flipHeight:self.rect.size.height range:range];
  128. for (int i=0;i<[self.pageTemplate[@"contents"][@"count"] intValue];i++)
  129. {
  130. NSMutableDictionary * item =self.pageTemplate[@"contents"][ [NSString stringWithFormat:@"item_%d",i ] ];
  131. PDFDrawable* drawable_obj=nil;
  132. if([item[@"type"] isEqualToString:@"img"])
  133. {
  134. drawable_obj= [[ImageDrawable alloc] init:item];
  135. }
  136. else if([item[@"type"] isEqualToString:@"line"])
  137. {
  138. drawable_obj= [[LineDrawable alloc] init:item];
  139. }
  140. else if([item[@"type"] isEqualToString:@"text"])
  141. {
  142. drawable_obj= [[TextDrawable alloc] init:item];
  143. }
  144. else if([item[@"type"] isEqualToString:@"group"])
  145. {
  146. drawable_obj= [[GroupDrawable alloc] init:item];
  147. }
  148. else if([item[@"type"] isEqualToString:@"table"])
  149. {
  150. drawable_obj= [[TableDrawable alloc] init:item];
  151. }
  152. else if([item[@"type"] isEqualToString:@"grid"])
  153. {
  154. drawable_obj= [[GridDrawable alloc] init:item];
  155. }
  156. drawable_obj.delegate = self;
  157. [drawable_obj Draw:context dataSource:data ParentRect:(CGRect)self.drawable_rect startX:0 startY:self.header_height flipHeight:self.rect.size.height range:range];
  158. }
  159. CGContextEndPage(context);
  160. }
  161. }
  162. -(void) nextPage:(CGContextRef) context
  163. {
  164. CGContextEndPage(context);
  165. CGRect rect = self.rect;
  166. CGContextBeginPage(context, &rect);
  167. GroupDrawable* pageHeader = [[GroupDrawable alloc]init:self.header];
  168. pageHeader.delegate = self;
  169. GroupDrawable* pageFooter = [[GroupDrawable alloc]init:self.footer];
  170. pageFooter.delegate = self;
  171. self.data[@"CURRENT_PAGE"]=[NSNumber numberWithInt:[self.data[@"CURRENT_PAGE"] intValue]+1];
  172. // page 去除页眉,页脚后的区域
  173. NSRange range = NSMakeRange(self.drawable_rect.origin.y+pageHeader.rect.size.height, self.drawable_rect.origin.y+self.drawable_rect.size.height-pageFooter.rect.size.height);
  174. [pageHeader Draw:context dataSource:self.data ParentRect:(CGRect)self.drawable_rect startX:0 startY:0 flipHeight:self.rect.size.height range:range];
  175. [pageFooter Draw:context dataSource:self.data ParentRect:(CGRect)self.drawable_rect startX:0 startY:0 flipHeight:self.rect.size.height range:range];
  176. }
  177. #pragma mark - commoneditor delegate
  178. -(void) outofPage:(CGContextRef) context
  179. {
  180. [self nextPage:context];
  181. }
  182. -(void) addPageCount:(CGContextRef)context
  183. {
  184. self.pagecount++;
  185. }
  186. @end