我有以下方法在我的@implementation UIView(SaveToPdf)类中正常工作
- (NSData *) toPdfData
{
// Creates a mutable data object for updating with binary data, like a byte array
NSMutableData *pdfData = [NSMutableData data];
// Points the pdf converter to the mutable data object and to the UIView to be converted
UIGraphicsBeginPDFContextToData(pdfData, self.bounds, nil);
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
// draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
[self.layer renderInContext:pdfContext];
// remove PDF rendering context
UIGraphicsEndPDFContext();
return pdfData;
}
我使用此方法将我的视图打印为PDF,除了一个问题外它工作正常。我的视图包含一个UITextView,而pdf只打印该UITextView的可见区域。我需要PDF来呈现完整的内容(即可滚动的文本)
我是iOS开发的新手,如果有人能指出我正确的方向,我将不胜感激。
*有一点需要注意,我在UIView中有其他子视图(标签,文本字段等),也需要打印到该PDF。这个目前工作正常,只需使用[self.layer renderInContext:pdfContext]就可以在我的PDF中保留布局;因为主视图将遍历它的所有子视图..
谢谢
答案 0 :(得分:1)
我知道两种方法 -
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
正在进行的一些代码。当我尝试时,我看到它导致我放松文字清晰度。所以我不能使用这种方法。uitextview
获取所有文本并将其传递到此处... 希望这有帮助。
#define kBorderInset 25.0
#define kMarginInset 15.0
- (void) drawText
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0);
NSString *textToDraw = @"YOUR TEXT FROM UITEXTVIEW HERE";
UIFont *font = [UIFont systemFontOfSize:16.0];
CGSize stringSize = [textToDraw sizeWithFont:font
constrainedToSize:CGSizeMake(pageSize.width - 2*kBorderInset-2*kMarginInset, pageSize.height - 2*kBorderInset - 2*kMarginInset)
lineBreakMode:UILineBreakModeWordWrap];
CGRect renderingRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset + 350.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, stringSize.height);
[textToDraw drawInRect:renderingRect
withFont:font
lineBreakMode:UILineBreakModeWordWrap
alignment:UITextAlignmentLeft];
return;
}
答案 1 :(得分:1)
如果您可以在页面上绘制尽可能多的文本,并且您在UITextView中的文本被截断时遇到麻烦,则需要禁用UITextView的滚动。在Interface Builder中或以编程方式:
textview.scrollEnabled = NO;
当scrollEnabled设置为YES
时,文本在我的PDF中被截断。在没有滚动的情况下,我得到了整个文本 - 至少在一页上都适合。
如果您需要在多个页面上生成文本,我认为您必须依靠其他答案显示单独绘制元素到PDF绘图上下文。
答案 2 :(得分:0)
我已编写此代码以从UIView内容生成pdf。 愿这对你有帮助。
#define kBorderInset 20.0
#define kBorderWidth 1.0
#define kMarginInset 10.0
//Line drawing
#define kLineWidth 1.0
- (IBAction)generatePdfButtonPressed
{
pageSize = CGSizeMake(612, 792);
NSString *fileName = @"profileInfo.pdf";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName];
[self generatePdfWithFilePath:pdfFileName];
}
- (void) generatePdfWithFilePath: (NSString *)thefilePath
{
UIGraphicsBeginPDFContextToFile(thefilePath, CGRectZero, nil);
NSInteger currentPage = 0;
BOOL done = NO;
do
{
// Mark the beginning of a new page.
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil);
// Draw a page number at the bottom of each page.
currentPage++;
[self drawPageNumber:currentPage];
//Draw a border for each page.
[self drawBorder];
//Draw text fo our header.
[self drawHeader];
//Draw a line below the header.
[self drawLine];
//Draw some text for the page.
if (profileInfo!=nil)
{
NSString *stringwithInfo=[NSString stringWithFormat:@"Headline: %@\nFirstname: %@\nLastName : %@\nSiteStandardProfileRequest:\n%@",[profileInfo valueForKey:@"headline"],[profileInfo valueForKey:@"firstName"],[profileInfo valueForKey:@"lastName"],[[profileInfo valueForKey:@"siteStandardProfileRequest"]valueForKey:@"url"]];
[self drawText:stringwithInfo];
}
//Draw an image
[self drawImage];
done = YES;
}
while (!done);
// Close the PDF context and write the contents out.
UIGraphicsEndPDFContext();
}
- (void) drawBorder
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
UIColor *borderColor = [UIColor brownColor];
CGRect rectFrame = CGRectMake(kBorderInset, kBorderInset, pageSize.width-kBorderInset*2, pageSize.height-kBorderInset*2);
CGContextSetStrokeColorWithColor(currentContext, borderColor.CGColor);
CGContextSetLineWidth(currentContext, kBorderWidth);
CGContextStrokeRect(currentContext, rectFrame);
}
- (void) drawLine
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(currentContext, kLineWidth);
CGContextSetStrokeColorWithColor(currentContext, [UIColor blueColor].CGColor);
CGPoint startPoint = CGPointMake(kMarginInset + kBorderInset, kMarginInset + kBorderInset + 40.0);
CGPoint endPoint = CGPointMake(pageSize.width - 2*kMarginInset -2*kBorderInset, kMarginInset + kBorderInset + 40.0);
CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, startPoint.x, startPoint.y);
CGContextAddLineToPoint(currentContext, endPoint.x, endPoint.y);
CGContextClosePath(currentContext);
CGContextDrawPath(currentContext, kCGPathFillStroke);
}
- (void) drawText:(NSString*)txtTodraw
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0);
UIFont *font = [UIFont systemFontOfSize:14.0];
CGSize stringSize = [txtTodraw sizeWithFont:font
constrainedToSize:CGSizeMake(pageSize.width - 2*kBorderInset-2*kMarginInset, pageSize.height - 2*kBorderInset - 2*kMarginInset)
lineBreakMode:UILineBreakModeWordWrap];
CGRect renderingRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset + 50.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, stringSize.height);
[txtTodraw drawInRect:renderingRect
withFont:font
lineBreakMode:UILineBreakModeWordWrap
alignment:UITextAlignmentLeft];
}
- (void) drawImage
{
UIImage * demoImage = [UIImage imageNamed:@"demo.png"];
[demoImage drawInRect:CGRectMake( (pageSize.width - demoImage.size.width/2)/2, 350, demoImage.size.width/2, demoImage.size.height/2)];
}
- (void) drawHeader
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(currentContext, 0.3, 0.7, 0.2, 1.0);
NSString *textToDraw = @"LinkedIn Profile Info";
UIFont *font = [UIFont systemFontOfSize:24.0];
CGSize stringSize = [textToDraw sizeWithFont:font constrainedToSize:CGSizeMake(pageSize.width - 2*kBorderInset-2*kMarginInset, pageSize.height - 2*kBorderInset - 2*kMarginInset) lineBreakMode:UILineBreakModeWordWrap];
CGRect renderingRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset, pageSize.width - 2*kBorderInset - 2*kMarginInset, stringSize.height);
[textToDraw drawInRect:renderingRect withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];
}
- (void)drawPageNumber:(NSInteger)pageNumber
{
NSString* pageNumberString = [NSString stringWithFormat:@"Page %d", pageNumber];
UIFont* theFont = [UIFont systemFontOfSize:12];
CGSize pageNumberStringSize = [pageNumberString sizeWithFont:theFont
constrainedToSize:pageSize
lineBreakMode:UILineBreakModeWordWrap];
CGRect stringRenderingRect = CGRectMake(kBorderInset,
pageSize.height - 40.0,
pageSize.width - 2*kBorderInset,
pageNumberStringSize.height);
[pageNumberString drawInRect:stringRenderingRect withFont:theFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
}
-(void)fillInformationInform:(NSDictionary*)dics
{
headLineLabel.text=[dics valueForKey:@"headline"];
NSURL *picUrl=[NSURL URLWithString:[dics valueForKey:@"pictureUrl"]];
profileImageView.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:picUrl]];
phoneNoLabel.text=[[[[dics valueForKey:@"phoneNumbers"] valueForKey:@"values"] objectAtIndex:0] valueForKey:@"phoneNumber"];
cityLabel.text=[[dics valueForKey:@"location"] valueForKey:@"name"];
emailAddressLabel.text=[dics valueForKey:@"emailAddress"];
nameLabel.text=[NSString stringWithFormat:@"%@ %@",[dics valueForKey:@"firstName"],[dics valueForKey:@"lastName"]];
dateOfBirthLabel.text=[NSString stringWithFormat:@"%@-%@-%@",[[dics valueForKey:@"dateOfBirth"]valueForKey:@"day"],[[dics valueForKey:@"dateOfBirth"]valueForKey:@"month"],[[dics valueForKey:@"dateOfBirth"]valueForKey:@"year"]];
NSDictionary *eduDic=[[NSDictionary alloc] initWithDictionary:[[[dics valueForKey:@"educations"]valueForKey:@"values"]objectAtIndex:0]];
// NSLog(@"education dic is %@",eduDic);
degreeLabel.text=[eduDic valueForKey:@"degree"];
durationLabel.text=[NSString stringWithFormat:@"From %@ To %@",[[eduDic valueForKey:@"startDate"]valueForKey:@"year"],[[eduDic valueForKey:@"endDate"]valueForKey:@"year"]];
fieldOfStudyLabel.text=[eduDic valueForKey:@"fieldOfStudy"];
collegeLabel.text=[eduDic valueForKey:@"schoolName"];
destinationLabel.text=[[[[dics valueForKey:@"positions"] valueForKey:@"values"] objectAtIndex:0] valueForKey:@"title"];
NSArray *skillsArray=[[NSArray alloc] initWithArray:[[dics valueForKey:@"skills"]valueForKey:@"values"]];
NSString *skillStr=[[NSString alloc] initWithFormat:@""];
for (NSDictionary *skillDic in skillsArray)
{
if (![skillStr isEqualToString:@""]) {
skillStr=[skillStr stringByAppendingFormat:@","];
}
skillStr=[skillStr stringByAppendingFormat:@"%@",[[skillDic valueForKey:@"skill"]valueForKey:@"name"]];
}
NSLog(@"skill string is %@",skillStr);
skillsLable.text=[NSString stringWithFormat:@"%@",skillStr];
}