Note that there are some explanatory texts on larger screens.

plurals
  1. PODraw image after content in PDF file
    primarykey
    data
    text
    <p>I've been searching a lot lately for a good PDF tutorial, documentation, etc.</p> <p>I ended up using <a href="https://github.com/mortjac/PDF-tutorial" rel="noreferrer">this</a> code, but there are few problems.</p> <p><strong>Scenario</strong></p> <p>I have a view which contains a label, a textView and an imageView. Now, we'll call the label <code>name</code>, the textView <code>description</code> and the imageView <code>image</code>.</p> <p>The name works as header. </p> <p>The description is very very mutable, it can be from 2 lines to some pages. </p> <p>Image should go at the end of the description text.</p> <p>I'm using this code:</p> <pre><code>- (void)generatePDF{ NSString *fileName = [NSString stringWithFormat:@"%@.pdf",nameString]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName]; CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, (CFStringRef)descriptionString, NULL); if (currentText) { CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText); if (framesetter) { // Create the PDF context using the default page: currently constants at the size // of 612 x 792. UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil); CFRange currentRange = CFRangeMake(0, 0); NSInteger currentPage = 0; BOOL done = NO; do { // Mark the beginning of a new page. UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, kDefaultPageWidth, kDefaultPageHeight), nil); [self drawHeader] // Draw a page number at the bottom of each page currentPage++; [self drawPageNumber:currentPage]; // Render the current page and update the current range to // point to the beginning of the next page. currentRange = [self renderPage:currentPage withTextRange: currentRange andFramesetter:framesetter]; // If we're at the end of the text, exit the loop. if (currentRange.location == CFAttributedStringGetLength ((CFAttributedStringRef)currentText)) done = YES; } while (!done); // Close the PDF context and write the contents out. UIGraphicsEndPDFContext(); // Release the framewetter. CFRelease(framesetter); } else { NSLog(@"Could not create the framesetter needed to lay out the atrributed string."); } // Release the attributed string. CFRelease(currentText); } else { NSLog(@"Could not create the attributed string for the framesetter"); } } - (CFRange)renderPage:(NSInteger)pageNum withTextRange:(CFRange)currentRange andFramesetter:(CTFramesetterRef)framesetter { // Get the graphics context. CGContextRef currentContext = UIGraphicsGetCurrentContext(); // Put the text matrix into a known state. This ensures // that no old scaling factors are left in place. CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity); // Create a path object to enclose the text. Use 72 point // margins all around the text. CGRect frameRect = CGRectMake(22,72, 468, 648); CGMutablePathRef framePath = CGPathCreateMutable(); CGPathAddRect(framePath, NULL, frameRect); // Get the frame that will do the rendering. // The currentRange variable specifies only the starting point. The framesetter // lays out as much text as will fit into the frame. CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL); CGPathRelease(framePath); // Core Text draws from the bottom-left corner up, so flip // the current transform prior to drawing. CGContextTranslateCTM(currentContext, 0, kDefaultPageHeight); CGContextScaleCTM(currentContext, 1.0, -1.0); // Draw the frame. CTFrameDraw(frameRef, currentContext); // Update the current range based on what was drawn. currentRange = CTFrameGetVisibleStringRange(frameRef); currentRange.location += currentRange.length; currentRange.length = 0; CFRelease(frameRef); return currentRange; } - (void)drawPageNumber:(NSInteger)pageNum { NSString* pageString = [NSString stringWithFormat:NSLocalizedString(@"Page", nil), pageNum]; UIFont* theFont = [UIFont systemFontOfSize:12]; CGSize maxSize = CGSizeMake(kDefaultPageWidth, 72); CGSize pageStringSize = [pageString sizeWithFont:theFont constrainedToSize:maxSize lineBreakMode:UILineBreakModeClip]; CGRect stringRect = CGRectMake(((kDefaultPageWidth - pageStringSize.width) / 2.0), 720.0 + ((72.0 - pageStringSize.height) / 2.0) , pageStringSize.width, pageStringSize.height); [pageString drawInRect:stringRect withFont:theFont]; } </code></pre> <p>I would like to know how to draw the image at the end of the page, right after the end of the description.</p> <p>I've drawn the header this way:</p> <pre><code>-(void)drawHeader{ NSString *headerString = nameString; UIFont* theFont = [UIFont boldSystemFontOfSize:15]; CGSize maxSize = CGSizeMake(kDefaultPageWidth, 72); CGSize pageStringSize = [headerString sizeWithFont:theFont constrainedToSize:maxSize lineBreakMode:UILineBreakModeClip]; CGRect stringRect = CGRectMake(22,22,pageStringSize.width,pageStringSize.height); [headerString drawInRect:stringRect withFont:theFont]; } </code></pre> <p>and it's being shown at the beginning of every page. </p> <p>Now I don't know how to draw the image after the contents (description)!</p> <p>Any help highly appreciated!</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload