PDFDrawable.m 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //
  2. // PDFDrawable.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 "PDFDrawable.h"
  9. #import "LineDrawable.h"
  10. #import "config.h"
  11. #import "RAUtils.h"
  12. @implementation PDFDrawable
  13. +(NSMutableDictionary *) createDrawableTemplate:(CGRect) rect
  14. {
  15. NSMutableDictionary* ret=[[NSMutableDictionary alloc]init];
  16. ret[@"x"]=[NSNumber numberWithDouble:rect.origin.x] ;
  17. ret[@"y"]=[NSNumber numberWithDouble:rect.origin.y] ;
  18. ret[@"width"]=[NSNumber numberWithDouble:rect.size.width] ;
  19. ret[@"height"]=[NSNumber numberWithDouble:rect.size.height] ;
  20. return ret;
  21. }
  22. -(instancetype) init:(NSMutableDictionary *)drawableTemplate
  23. {
  24. if (self = [super init]) {
  25. // NSMutableDictionary* m1=[drawableTemplate mutableCopy];
  26. // NSMutableDictionary* m2=[drawableTemplate mutableCopy];
  27. // [self setDrawableTemplate:[[RAUtils string2dict:[RAUtils dict2string:drawableTemplate]] mutableCopy] ];
  28. //
  29. // NSMutableDictionary* a = [NSMutableDictionary new];
  30. // NSMutableDictionary* b =[NSJSONSerialization JSONObjectWithData:[NSJSONSerialization dataWithJSONObject:a options:kNilOptions error:nil]
  31. // options: NSJSONReadingMutableContainers
  32. // error: nil];
  33. [self setDrawableTemplate: [[RAUtils copyDict:drawableTemplate] mutableCopy]];
  34. // [self setDrawableTemplate:[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:drawableTemplate]] ];
  35. }
  36. return self;
  37. }
  38. -(void) setMargin:(double)leftMargin right:(double)rightMargin top:(double)topMargin bottom:(double)bottomMargin
  39. {
  40. self.margin_left=leftMargin;
  41. self.margin_right=rightMargin;
  42. self.margin_top=topMargin;
  43. self.margin_bottom=bottomMargin;
  44. }
  45. -(void) setDrawableTemplate:(NSMutableDictionary *)drawableTemplate
  46. {
  47. _drawableTemplate = drawableTemplate;
  48. self.margin_left=[self.drawableTemplate[@"margin_left"] doubleValue];
  49. self.margin_right=[self.drawableTemplate[@"margin_right"] doubleValue];
  50. self.margin_top=[self.drawableTemplate[@"margin_top"] doubleValue];
  51. self.margin_bottom=[self.drawableTemplate[@"margin_bottom"] doubleValue];
  52. self.hAlign =self.drawableTemplate[@"hAlign"];
  53. self.vAlign =self.drawableTemplate[@"vAlign"];
  54. self.rect = CGRectMake([self.drawableTemplate[@"x"] doubleValue], [self.drawableTemplate[@"y"] doubleValue], [self.drawableTemplate[@"width"] doubleValue], [self.drawableTemplate[@"height"] doubleValue]);
  55. // 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.rect.size.height-self.margin_bottom);
  56. }
  57. -(void) DrawBound:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
  58. {
  59. // return ;
  60. if(!PDF_DEBUG&&![self.drawableTemplate[@"draw_bound"] boolValue] )
  61. return;
  62. NSArray* arr_linewidth=self.drawableTemplate[@"line_width"];
  63. CGRect rect = [self rect];//[self to_pdf_rect:p_rect pos:self.rect contextHeight:flip_height];
  64. if(arr_linewidth.count<4)
  65. arr_linewidth = [NSArray arrayWithObjects:@(0.05),@(0.05),@(0.05),@(0.05), nil];
  66. NSMutableDictionary* tline1= [LineDrawable createlineTemplate:[arr_linewidth[0] floatValue] from:CGPointMake(rect.origin.x, rect.origin.y) to:CGPointMake(rect.origin.x+rect.size.width, rect.origin.y)];
  67. LineDrawable* line1=nil;
  68. line1= [[LineDrawable alloc] init:tline1];
  69. [line1 Draw:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
  70. NSMutableDictionary* tline2= [LineDrawable createlineTemplate:[arr_linewidth[1] floatValue] from:CGPointMake(rect.origin.x+rect.size.width, rect.origin.y) to:CGPointMake(rect.origin.x+rect.size.width, rect.origin.y+rect.size.height)];
  71. LineDrawable* line2=nil;
  72. line2= [[LineDrawable alloc] init:tline2];
  73. [line2 Draw:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
  74. NSMutableDictionary* tline3= [LineDrawable createlineTemplate:[arr_linewidth[2] floatValue] from:CGPointMake(rect.origin.x+rect.size.width, rect.origin.y+rect.size.height) to:CGPointMake(rect.origin.x, rect.origin.y+rect.size.height)];
  75. LineDrawable* line3=nil;
  76. line3= [[LineDrawable alloc] init:tline3];
  77. [line3 Draw:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
  78. NSMutableDictionary* tline4= [LineDrawable createlineTemplate:[arr_linewidth[3] floatValue] from:CGPointMake(rect.origin.x, rect.origin.y+rect.size.height) to:CGPointMake(rect.origin.x, rect.origin.y)];
  79. LineDrawable* line4=nil;
  80. line4= [[LineDrawable alloc] init:tline4];
  81. [line4 Draw:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
  82. }
  83. -(CGRect)to_parent_rect:(CGRect)parentRect pos:(CGRect)rect offsetX:(double)x offsetY:(double)y
  84. {
  85. return CGRectMake(parentRect.origin.x+self.margin_left+rect.origin.x+x, parentRect.origin.y+self.margin_top+self.rect.origin.y+y/*-self.rect.size.height*/, self.rect.size.width-self.margin_left-self.margin_right, self.rect.size.height-self.margin_top-self.margin_bottom);
  86. }
  87. -(CGRect)to_pdf_rect:(CGRect)parentRect pos:(CGRect)rect contextHeight:(double) height
  88. {
  89. CGRect pdfrect=[self to_parent_rect:parentRect pos:rect offsetX:0 offsetY:0];//CGRectMake(self.rect.origin.x+x, self.rect.origin.y, self.rect.size.width, self.rect.size.height);
  90. pdfrect=CGRectMake(pdfrect.origin.x, height-pdfrect.origin.y-pdfrect.size.height, pdfrect.size.width, pdfrect.size.height);
  91. return pdfrect;
  92. }
  93. -(CGRect)parent_to_pdf_rect:(CGRect)rect contextHeight:(double) height
  94. {
  95. // CGRect pdfrect=[self to_parent_rect:parentRect pos:rect offsetX:0 offsetY:0];//CGRectMake(self.rect.origin.x+x, self.rect.origin.y, self.rect.size.width, self.rect.size.height);
  96. CGRect pdfrect=CGRectMake(rect.origin.x, height-rect.origin.y-rect.size.height, rect.size.width, rect.size.height);
  97. return pdfrect;
  98. }
  99. -(CGPoint)to_parent_point:(CGRect)parentRect point:(CGPoint)p offsetX:(double)x offsetY:(double)y
  100. {
  101. //return CGRectMake(parentRect.origin.x+self.margin_left+rect.origin.x, parentRect.size.height-self.margin_top-self.rect.origin.y-self.rect.size.height, rect.size.width-self.margin_right, rect.size.height-self.margin_bottom);
  102. return CGPointMake(parentRect.origin.x+ p.x, parentRect.origin.y+p.y);
  103. }
  104. -(CGPoint)to_pdf_point:(CGRect)parentRect point:(CGPoint)p contextHeight:(double) height
  105. {
  106. CGPoint pdfpoint=[self to_parent_point:parentRect point:p offsetX:0 offsetY:0];
  107. pdfpoint = CGPointMake(pdfpoint.x, height-pdfpoint.y);
  108. return pdfpoint;
  109. }
  110. //-(void) Draw:(CGContextRef) context startX:(double) x startY:(double) y
  111. //{
  112. //
  113. //}
  114. #pragma mark NOT IMPL
  115. -(CGRect) Query_Rect:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
  116. {
  117. NSAssert(true, @"NOT IMPL");
  118. return CGRectNull;
  119. }
  120. -(CGRect) Draw:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
  121. {
  122. NSAssert(true, @"NOT IMPL");
  123. return CGRectNull;
  124. }
  125. @end