我从我的iPhone应用程序生成了一个PDF文件,虽然大多数文档只有一页,但我希望能够检测文本是否超出“边距”,如果是,请将其添加到下一页。我是新手,所以不确定如何做到这一点。
以下是代码。有什么建议?
- (void) drawBorder
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
UIColor *borderColor = [UIColor grayColor];
CGRect rectFrame = CGRectMake(kBorderInset, kBorderInset, pageSize.width-kBorderInset*2, pageSize.height-kBorderInset*2);
CGContextSetStrokeColorWithColor(currentContext, borderColor.CGColor);
CGContextSetLineWidth(currentContext, kBorderWidth);
CGContextStrokeRect(currentContext, rectFrame);
}
- (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) drawHeader:(NSString *)header
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0);
NSString *textToDraw = header;
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) drawText:(NSString *)bodyText
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0);
NSString *textToDraw = bodyText;
UIFont *font = [UIFont systemFontOfSize:14.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 + 50.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, stringSize.height);
[textToDraw drawInRect:renderingRect
withFont:font
lineBreakMode:UILineBreakModeWordWrap
alignment:UITextAlignmentLeft];
}
- (void) drawLine
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(currentContext, kLineWidth);
CGContextSetStrokeColorWithColor(currentContext, [UIColor blackColor].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) drawImage:(UIImage *)image
{
//UIImage * demoImage = [UIImage imageNamed:@"demo.png"];
[image drawInRect:CGRectMake( (pageSize.width - image.size.width/2)/2, 350, image.size.width/2, image.size.height/2)];
}
- (void) generatePdf: (NSString *)thefilePath :(NSString *) theHeader :(NSString *) theText :(UIImage *) theImage
{
pageSize = CGSizeMake(612, 792);
UIGraphicsBeginPDFContextToFile(thefilePath, CGRectZero, nil);
NSInteger currentPage = 0;
BOOL done = NO;
do
{
//Start 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:theHeader];
//Draw a line below the header.
[self drawLine];
//Draw some text for the page.
[self drawText:theText];
//Draw an image
[self drawImage:theImage];
done = YES;
}
while (!done);
// Close the PDF context and write the contents out.
UIGraphicsEndPDFContext();
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (IBAction)generatePdfWithFileName:(id)sender
{
pageSize = CGSizeMake(612, 792);
NSString *fileName = @"test.pdf";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName];
NSString *header = @"This is the bad ass header section!";
NSString *text = @"There is so much to say here I don't know where to begin....";
[self generatePdf : pdfFileName : header:text:nil];
}
@end
答案 0 :(得分:9)
这个概念可以在这里看到
[来自http://spitzkoff.com/craig/?p=160]
放置物品时,获得高度:
CGSize size = [name sizeWithFont:studentNameFont forWidth:maxWidth lineBreakMode:UILineBreakModeWordWrap];
[name drawAtPoint:CGPointMake(kMargin, currentPageY) forWidth:maxWidth withFont:studentNameFont lineBreakMode:UILineBreakModeWordWrap];
currentPageY += size.height;
在适当的时候,检查当前的Y并决定是否需要移动到新页面:
if (size.height + currentPageY > maxHeight) {
// create a new page and reset the current page's Y value
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, kDefaultPageWidth, kDefaultPageHeight), nil);
currentPageY = kMargin;
}
我希望有所帮助。
答案 1 :(得分:1)
我是stackoverflow的新手,但我想建议一个简短的答案,然后分成一个长文本视图"问题
我使用的方法肯定不是将文本分成几部分的最有效方法,但它是我找到并且有效的唯一方法。 取一个文本的一部分,我只是在绘图之前检查一个循环,如果子文本适合我的页面,则逐字逐句,这意味着允许高度。如果整个文本不合适,那么我的代码只会绘制找到的部分。例如,我可以将长篇文章分成四页......至少。 抱歉,由于我的经验不足,如果我的回答,这只是一瞥,对#34;如何"的想法不够明确。
澄清我的答案。我添加了我用来检查"子文本所需的高度(找到)的方法" (每次检查一个单词添加到"子文本")。因为" sizeWithFont:"自IOS 7以来已弃用,我使用" boundingRectWithSize:"方法
// Process, that can take long though, to find the next start of the part of a text that hasn't been drawned yet.
float widthRect;
widthRect = pageWidth - 2 * leftMargin;
- (unsigned int) findNextStartingPos:(NSString *)text withHeight:(float) height
{
NSString *character;
unsigned int pos = 0;
unsigned int posFound = 0;
unsigned int lastPosFound = 0;
BOOL found = NO;
NSString *textTest;
float heightFound;
while (pos <= [text length]-1)
{
character = [text substringWithRange:NSMakeRange(pos, 1)];
if ([character isEqualToString:@" "] || [character isEqualToString:@"\n"])
{
posFound = pos;
found = YES;
}
if (found)
{
textTest = [text substringWithRange:NSMakeRange(0, posFound)];
heightFound = lroundf([self heightFound:textTest withWidth:widthRect fontSize:fontSizeBody center:NO]);
if (heightFound > height)
{
if (lastPosFound == 0)
{
posFound = lastPosFound;
} else
{
posFound = lastPosFound + 1;
}
if (posFound > [text length]-1) posFound = lastPosFound;
break;
}
lastPosFound = posFound;
}
pos++;
}
return posFound;
} return posFound;
}
// Returns the height needed to draw a text (and to check for space in a page)
-(float) heightFound:(NSString *)text withWidth:(float)width fontSize:(CGFloat)fontSize center:(BOOL)center
{
if ([text length] != 0)
{
UIFont *font = [UIFont fontWithName:@"Helvetica" size:fontSize];
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
if (center)
{
paragraphStyle.alignment = NSTextAlignmentCenter;
} else {
paragraphStyle.alignment = NSTextAlignmentLeft;
}
NSDictionary *attributes = @{NSFontAttributeName:font, NSParagraphStyleAttributeName: paragraphStyle};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text attributes:attributes];
CGRect newRect = [attributedString boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} options:NSStringDrawingUsesLineFragmentOrigin context:nil];
return newRect.size.height;
} else {
return 0;
}
}