This article shows how to add an image and scale it with finger (maintaining proportions).
In PDFView class, add the following methods:
- (BOOL)vImageStart
{
    if( ![m_doc canSave] ) return false;
    if( m_status == sta_none )
    {
        self.scrollEnabled = false;
        m_status = sta_image;
        return true;
    }
    
    return false;
}
 
-(void)vImageCancel
{
    if( m_status == sta_image )
    {
        self.scrollEnabled = true;
        m_status = sta_none;
        [self refresh];
    }
}
-(void)vImageEnd
{
    if( m_status == sta_image )
    {
        m_modified = true;
        m_status = sta_none;
 
        [self refresh];
 
        self.scrollEnabled = true;
    }
}
 
-(bool)OnImageTouchBegin:(CGPoint)point
{
    if( m_status != sta_image ) return false;
    
    imgAnnot = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon57.png"]];
    
    imgAnnot.center = CGPointMake(self.contentOffset.x + point.x - (imgAnnot.frame.size.width / 2), self.contentOffset.y + point.y  - (imgAnnot.frame.size.height / 2));
    
    [self addSubview:imgAnnot];
    
    return true;
}
 
-(bool)OnImageTouchMove:(CGPoint)point
{
    if( m_status != sta_image ) return false;
    
    CGRect origin = imgAnnot.frame;
    
    float deltaMoveX = self.contentOffset.x + point.x - origin.origin.x - origin.size.width;
    float deltaMoveY = self.contentOffset.y + point.y - origin.origin.y - origin.size.height;
    float prop = imgAnnot.frame.size.width / imgAnnot.frame.size.height;
 
    if (self.contentOffset.x + point.x > origin.origin.x && self.contentOffset.y + point.y > origin.origin.y) {
        float width = (deltaMoveX > deltaMoveY) ? self.contentOffset.x + point.x - origin.origin.x : (self.contentOffset.y + point.y - origin.origin.y) * prop;
        float height = (deltaMoveX < deltaMoveY) ? self.contentOffset.y + point.y - origin.origin.y : (self.contentOffset.x + point.x - origin.origin.x) / prop;
        [imgAnnot setFrame:CGRectMake(origin.origin.x, origin.origin.y, width, height)];
    }
    
    return true;
}
 
-(bool)OnImageTouchEnd:(CGPoint)point
{
    if( m_status != sta_image ) return false;
    
    struct PDFV_POS pos1;
    struct PDFV_POS pos2;
    
    [m_view vGetPos:&pos1 :(imgAnnot.frame.origin.x - self.contentOffset.x) * m_scale :(imgAnnot.frame.origin.y - self.contentOffset.y) * m_scale];
    [m_view vGetPos:&pos2 :(imgAnnot.frame.origin.x - self.contentOffset.x + imgAnnot.frame.size.width) * m_scale :(imgAnnot.frame.origin.y - self.contentOffset.y + imgAnnot.frame.size.height) * m_scale];
    
    PDF_RECT rect;
    
    rect.left = pos1.x;
    rect.right = pos2.x;
    rect.top = pos1.y;
    rect.bottom = pos2.y;
    
    [self vAddImageWithImage:imgAnnot.image withRect:rect];
    
    [imgAnnot removeFromSuperview];
    
    return true;
}
 
- (void)vAddImageWithImage:(UIImage *)image withRect:(PDF_RECT)rect
{
    // Create the cache file
    NSString *tp = NSTemporaryDirectory();
    tp = [tp stringByAppendingPathComponent:@"cache.dat"];
    [m_doc setCache:tp];
    
    // Create the PDFPage instance of the current page
    PDFPage *page = [m_doc page:m_cur_page];
    
    // Create the CGImageRef of the image
    CGImageRef ref = [image CGImage];
    
    // Add the image
    [page addAnnotBitmap:ref :YES :&rect];
    
    // Re-render the current page
    [m_view vRenderSync:m_cur_page];
    [self refresh];
    
    // Save the PDF file
    [m_doc save];
}
 
Now you should update touchesBegan, touchesMoved, touchesEnded method and add OnImageTouchBegin:point, OnImageTouchMoved:point and OnImageTouchEnded:point method, in this way:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    ...
    ...
    ...
        if( [self OnNoteTouchBegin:point] ) return;
        if( [self OnInkTouchBegin:point] ) return;
        if( [self OnRectTouchBegin:point] ) return;
        if( [self OnEllipseTouchBegin:point] ) return;
        if ([self OnImageTouchBegin:point]) return;
        [self OnNoneTouchBegin:point:touch.timestamp];
    }
}
 
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
        if( [self OnNoteTouchMove:point] ) return;
        if( [self OnInkTouchMove:point] ) return;
        if( [self OnRectTouchMove:point] ) return;
        if( [self OnEllipseTouchMove:point] ) return;
        if( [self OnImageTouchMove:point] ) return;
        [self OnNoneTouchMove:point:touch.timestamp];
    }
}
 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
            if( [self OnNoteTouchEnd:point] ) return;
            if( [self OnInkTouchEnd:point] ) return;
            if( [self OnRectTouchEnd:point] ) return;
            if( [self OnEllipseTouchEnd:point] ) return;
            if( [self OnImageTouchEnd:point] ) return;
            [self OnNoneTouchEnd:point:touch.timestamp];
        }
    }
}
 
Now you can call [m_view vImageStart] and [m_view vImageEnd] to toggle the image insert mode.
In this example we used a static image "icon57.png", but you could edit that method and use a custom image.