RAPDFPage.m 9.1 KB

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