如何在Prawn中为bounding_box添加背景/填充颜色

时间:2013-07-20 00:11:41

标签: ruby-on-rails-3 pdf prawn

是否可以在Prawn中为bounding_box添加背景颜色?

 bounding_box([100, cursor], width: 80, height: 20) do
    pad_top(7) { text "THIS IS TEXT", size: 8, align: :center }
    stroke_bounds
 end 

我已尝试将其添加到bounding_box块

     background_color: "CCCCCC"

我已尝试在块

中添加此内容
    fill_color "CCCCCC"
    background_color "CCCCCC"

似乎没有任何东西可以用于bounding_box

5 个答案:

答案 0 :(得分:10)

这里是代码

    bounding_box([200,cursor], :width => 350, :height => 80) do
        stroke_color 'FFFFFF'
        stroke_bounds
        stroke do
            stroke_color 'FFFF00'
            fill_color '36DA5C'
            fill_and_stroke_rounded_rectangle [cursor-80,cursor], 350, 80, 10
            fill_color '000000'
        end
    end

答案 1 :(得分:5)

这是2008年讨论的[1](虽然显然没有引导任何地方),我也没有在手册[2]中的任何地方看到它。阅读手册? :)

关于如何完成:将所有内容放入边界框后,您可以从边界框中获取生成的宽度和高度。使用该信息,您可以使用原始矩形绘图来填充它。之后,您将不得不重新绘制内容,因为到目前为止,您将使用矩形填充在其上方绘制。

希望(可能?)还有一个更好的方法,一个你不需要画两次实际内容的方法;当你遇到它时,请务必与大家分享!

我在快速操作方法中提到的所有内容都在手册中有详细记载[2];祝你好运!

[1] https://groups.google.com/forum/#!msg/prawn-ruby/6XW54cGy0GA/RdXwL0Zo_Z8J

[2] http://prawn.majesticseacreature.com/manual.pdf

答案 2 :(得分:3)

EDITTED 完全 仍然需要一些工作,但试试这个

module Prawn
  module Graphics
    def fill_and_stroke_bounding_box(options={},&block)
      current_settings = {fill_color: fill_color, 
                      stroke_color: stroke_color, 
                      line_width: self.line_width }
      fill_color options[:fill_color] || fill_color
      stroke_color options[:stroke][:color] || stroke_color if options[:stroke]
      self.line_width  options[:stroke][:width] || self.line_width if options[:stroke]
      rectangle options[:position], options[:width], options[:height]
      options[:stroke] ? fill_and_stroke : fill
      box_options = convert_box_options(options)
      options[:revert_before_block] ?  revert(current_settings) : check_fill_visiblity(options[:text_color])
      fill_color options[:text_color] || fill_color 
      bounding_box(box_options[:position],box_options[:options]) do 
        if block_given?
          block.call
        end
      end
      revert(current_settings) unless options[:skip_revert]
    end

    def revert(settings={})
      fill_color settings[:fill_color]
      stroke_color settings[:stroke_color]
      self.line_width settings[:line_width]
    end

    def convert_box_options(options={})
      converted_options =  {position: options.delete(:position)}
      if options.delete(:stroke)
        resize_box(options)
        reposition_box(converted_options)
      end
      converted_options.merge({options: options})
    end

    def resize_box(options ={})
      [:width,:height].each do |param|
        options[param] -= (self.line_width * 2)
      end
    end

    def reposition_box(options)
      options[:position][0] += self.line_width
      options[:position][1] -= self.line_width
    end

    def check_fill_visiblity(text_color)
      text_color ||= fill_color
      warn "[WARNING] Text Will Not be visible without text_color set or revert_before_block" if text_color == fill_color
    end 

  end
end

然后你就可以这样称呼它

fill_and_stroke_bounding_box(position:[0,cursor],
                            stroke:{color: "7CFC00",width: 2.mm},
                            text_color: "668B8B"
                            fill_color:"FFFFFF", 
                            width: 19.cm, height: 100
                            ) do 

唯一需要的选项是positionheightwidthbounding_box不需要height,但由于您将其放在矩形内,因此必须指定height

虽然建议设置text_colorrevert_before_block,否则块内的文字将不可见。

options包括所有bounding_box选项,包括使用块以及以下新选项stroke:{:color,:width},可让您设置矩形的外部笔划。 fill_color:设置矩形的颜色。 text_color块内文本的颜色。 revert_before_block会在执行块之前设置颜色,因为fill_color控制Prawn中的text_color。如果已设置正确的颜色,则可以使用此选项代替text_colorskip_revert这将放弃fill_colorstroke_colorself.line_width的选项在调用此方法之前设置的。如果warntext_color相同,此扩展程序也会fill_color

希望这可以帮助别人。

答案 3 :(得分:2)

只是为Willing的答案添加另一个选项......如果有人发现这个并希望将其用于网格。

def widget
  grid([2,2], [3,2]).bounding_box do
    stroke do
      fill_color '36DA5C'
      fill_and_stroke_rounded_rectangle [cursor-bounds.height,cursor], bounds.width, bounds.height, 5
      fill_color '000000'
    end

    text "This is text inside the box"
  end
end

答案 4 :(得分:1)

这就是我的做法。

bounding_box([0, y_position], width: 200, height: 50) do
  fill_color 'CCCCCC'
  fill { rectangle [0, 50], 200, 50 }
  text 'Hello', align: :center, valign: :center
end