5.9 Report Form
5.9.1 Cách tạo ra một file PDF
Bước 1:Ta viết một đoạn code để chương trình mở ra một vùng dữ liệu lưu file PDF:
Ta có thể thay đổi tên của file PDF bằng cách thay đổi nội dung biến fileName.
Bước 2: Bắt đầu viết chữ và vẽ đường thẳng trên file PDF vừa tạo:
Mở một trang mới trong file PDF:
UIGraphicsBeginPDFContextToFile(filePath, CGRectZero, nil);
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);
NSString *fileName=[NSString
stringWithFormat:@"%@.PDF",txt_PDFPrint.text];
NSArray
*Path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory=[Path objectAtIndex:0];
NSString *pdfPathWithFileName=[documentDirectory stringByAppendingPathComponent:fileName]; } else{ continue; } } stringByAppendingPathComponent:databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
Page 105 Quy định frame của chữ mà ta muốn viết lên file PDF:
CGRect nameReport=CGRectMake(0,0,150,50);
NSString *nameRpt=[NSString
stringWithFormat:@"%@",txt_ReportName.text];
Quy định điểm bắt đầu và kết thúc của đường thẳng: CGPoint from = CGPointMake(0, 120);
CGPoint to = CGPointMake(612, 120);
Hàm giúp ta viết chữ lên file PDF:
Trong đó các thông số đưa vào như sau:
(NSString*)textToDraw inFrame: Đoạn text mà ta muốn ghi vào file PDF. (CGRect)frameRect: Vị trí xuất hiện hay là Frame của đoạn text.
(CGFloat) sizeofFont: Kích cỡ của kiểu chữ mà ta viết. (UIColor *) textColor: Màu của chữ.
-(void)drawText:(NSString*)textToDraw inFrame:(CGRect)frameRect fontSize:(CGFloat) sizeofFont color:(UIColor *) textColor{
CGContextRef context=UIGraphicsGetCurrentContext(); UIFont *font= [UIFont systemFontOfSize:sizeofFont];
CGContextSetFillColorWithColor(context, textColor.CGColor);
CGRect textRect=CGRectMake(frameRect.size.width, frameRect.size.height,612,
792);
NSString *myString=[NSString stringWithFormat:@"%@",textToDraw]; [myString drawInRect:textRect withFont:font
lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentLeft]; }
Page 106
Ví dụ ta muốn viết chữ HelloWord: NSString *name=@"HelloWorld";
[self drawText2:name inFrame:nameRect1 fontSize:13 color:[UIColor blackColor]];
Page 107 Hàm giúp ta vẽ đường thẳng:
Đối số đưa vào hàm là :
(CGPoint)from: tọa độ điểm đầu. (CGPoint)to: tọa độ điểm cuối.
Ví dụ ta muốn vẽ đường thẳng nối 2 điểm tọa độ A(0,0), B(200,300) trên file PDF: CGPoint from = CGPointMake(0, 120);
CGPoint to = CGPointMake(612, 120); [self drawLineFromPoint:from toPoint:to];
-(void)drawLineFromPoint:(CGPoint)from toPoint:(CGPoint)to {
CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, 2.0);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGFloat components[] = {0.2, 0.2, 0.2, 0.3};
CGColorRef color = CGColorCreate(colorspace, components); CGContextSetStrokeColorWithColor(context, color);
CGContextMoveToPoint(context, from.x, from.y); CGContextAddLineToPoint(context, to.x, to.y); CGContextStrokePath(context);
CGColorSpaceRelease(colorspace); CGColorRelease(color);
Page 108
Hình 5-54 Kết quả vẽ đường thẳng lên file PDF
Page 109
-(void)drawTableAt:(CGPoint)origin withRowHeight:(int)rowHeight andColumnWidth:(int)columnWidth andRowCount:(int)numberOfRows andColumnCount:(int)numberOfColumns {
for (int i = 0; i <= numberOfRows; i++) {
int newOrigin = origin.y + (rowHeight*i);
CGPoint from = CGPointMake(origin.x, newOrigin);
CGPoint to = CGPointMake(origin.x + (numberOfColumns*columnWidth), newOrigin);
[self drawLineFromPoint:from toPoint:to]; }
for (int i = 0; i <= numberOfColumns; i++) {
int newOrigin = origin.x + (columnWidth*i);
CGPoint from = CGPointMake(newOrigin, origin.y); CGPoint to = CGPointMake(newOrigin, origin.y +(numberOfRows*rowHeight));
[self drawLineFromPoint:from toPoint:to]; }
}
CGColorSpaceRelease(colorspace); CGColorRelease(color);
Page 110 Các thông số đưa vào:
(CGPoint)origin: Tọa độ x,y đưa vào. (int)rowHeight: Chiều cao của mỗi hàng (int)columnWidth: Chiều rộng mỗi cột.
(int)numberOfRows: Số lượng hàng trong Table. (int)numberOfColumns: Số lượng cột trong Table Ví dụ ta muốn vẽ một Table 7 hàng 4 cột : int xOriginColumn = 50; int yOriginColumn = 300; int rowHeightColumn = 50; int columnWidthColumn = 120; int numberOfRows = 7; int numberOfColumns =4;
[self drawTableAt:CGPointMake(xOrigin, yOrigin) withRowHeight:rowHeight andColumnWidth:columnWidth andRowCount:numberOfRows
Page 111
Hình 5-55 Kết quả vẽ Table lên file PDF
Cách tạo BackGound cho file text.
Cách 1: Tạo màu cho Backgound. Ta sử dụng đoạn Code sau:
Page 112
Hàm CGContextSetFillColorWithColor(context, [[UIColor greenColor] CGColor]) giúp ta chỉnh mày cho BackGound, ví dụng như ta đang để mày xanh.
Cách 2: Đưa một ảnh vào BackGround. Ta sử dụng đoạn Code sau:
Trong đó UIImage chính là file ảnh mà ta muốn làm BackGround.
Bước 3: Lấy dữ liệu từ SQLite để xuất ra report theo yêu cầu người dùng:
Đầu tiên ta sẽ mở file SQL bằng Code sau -(void) drawImageBackground { CGRect imageRect=CGRectMake(0,120, 612, 672); UIImage *image=myImageBG.image; [image drawInRect:imageRect]; } -(void)drawBackGround { CGContextRef context=UIGraphicsGetCurrentContext();
CGRect rect=CGRectMake(0, 0, pageSize.width, pageSize.height);
CGContextSetFillColorWithColor(context, [[UIColor greenColor] CGColor]); CGContextFillRect(context, rect);
}
CGColorSpaceRelease(colorspace); CGColorRelease(color);
Page 113
Sau đó ta đọc dữ liệu từ file SQL và lưu vào trong mảng
Dữ liệu được lưu vào mảng, chúng ta sẽ xử lý các mảng này để xuất ra được file PDF. Chương trình sẽ cho người dùng tùy chọn số lượng biến muốn xuất ra ví dụ 2,3,4, từ đó sẽ xuất ra 1 Table tương ứng.
NSString *Name = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 2)];
NSString *Address = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 3)]
[NameTagArray addObject:Name]; [AddressTagArray addObject:Address];
if(sqlite3_open(dbpath, &contactDB)==SQLITE_OK){ //mo du lieu tu sqlite sqlite3_stmt *statement;
NSString *sql = @"SELECT * FROM Task"; constchar *query_stmt = [sql UTF8String];
if(sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement,
NULL)==SQLITE_OK){
while(sqlite3_step(statement)==SQLITE_ROW){ //chay tung dong }
sqlite3_finalize(statement); }
Page 114
Hình 5-56 File PDF chưa có Background
Ta muốn thay đổi Background thì có thể lên Internet chọn đường link 1 tấm ảnh ví dụ như:
http://hd.wallpaperswide.com/thumbs/blue_and_white-t2.jpg.
Sau đó nhấn nút OK thì ta sẽ thấy đường hình ảnh mà ta vừa lấy về, sau đó nếu nhấn nút Print PDF File thì hình ảnh đó sẽ được làm background như hình bên dưới.
Page 115
Page 116
CHƯƠNG 6 XML