648: def image(image, options = {})
649: width = options[:width]
650: pad = options[:pad] || 5
651: resize = options[:resize]
652: just = options[:justification] || :left
653: border = options[:border]
654: link = options[:link]
655:
656: if image.kind_of?(PDF::Writer::External::Image)
657: info = image.image_info
658: image_data = image
659: else
660: if image.respond_to?(:read)
661: image_data = image.read
662: else
663: image_data = open(image, "rb") { |file| file.read }
664: end
665: info = PDF::Writer::Graphics::ImageInfo.new(image_data)
666: end
667:
668: raise "Unsupported Image Type" unless %w(JPEG PNG).include?(info.format)
669:
670: width = info.width if width.nil?
671: aspect = info.width.to_f / info.height.to_f
672:
673:
674: if @columns_on
675: max_width = @columns[:width] - (pad * 2)
676: else
677: max_width = @page_width - (pad * 2) - @left_margin - @right_margin
678: end
679:
680: if resize == :full or resize == :width or width > max_width
681: width = max_width
682: end
683:
684:
685: height = (width / aspect.to_f)
686:
687:
688: if resize.kind_of?(Numeric)
689: width *= resize
690: height *= resize
691: end
692:
693:
694: if width > max_width
695: height = (width / aspect.to_f)
696: end
697:
698:
699: havail = @y - @bottom_margin - (pad * 2)
700: if height > havail
701:
702:
703:
704: if resize == :full
705: height = havail
706: width = (height * aspect)
707: else
708: start_new_page
709: end
710: end
711:
712:
713: y = @y - pad - height
714: x = @left_margin + pad
715:
716: if (width < max_width)
717: case just
718: when :center
719: x += (max_width - width) / 2.0
720: when :right
721: x += (max_width - width)
722: end
723: end
724:
725: image_obj = add_image(image_data, x, y, width, height, info)
726:
727: if border
728: border = {} if true == border
729: border[:color] ||= Color::RGB::Grey50
730: border[:style] ||= PDF::Writer::StrokeStyle::DEFAULT
731:
732: save_state
733: stroke_color border[:color]
734: stroke_style border[:style]
735: rectangle(x, y - pad, width, height - pad).stroke
736: restore_state
737: end
738:
739: if link
740: case link[:type]
741: when :internal
742: add_internal_link(link[:target], x, y - pad, x + width, y + height - pad)
743: when :external
744: add_link(link[:target], x, y - pad, x + width, y + height - pad)
745: end
746: end
747:
748: @y = @y - pad - height
749:
750: image_obj
751: end