代码之家  ›  专栏  ›  技术社区  ›  Catalin

如何更改对虾的字体

  •  13
  • Catalin  · 技术社区  · 8 年前

    我想做的是使用对虾生成PDF,同时使用一些特定于语言的字符。

    结果,我得到了以下错误:

    raise Prawn::Errors::IncompatibleStringEncoding,
       "Your document includes text that's not compatible with the  Windows-1252 character set.\n" \
       "If you need full UTF-8 support, use TTF fonts instead of PDF's built-in fonts\n."
    

    因此,我尝试通过以下方式更改字体:

    # app/models/prawn/change_font_decorator.rb
    
    Prawn::Document.generate("output.pdf") do
      font_families.update("Arial" => {
        :normal => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
        :italic => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
        :bold => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
        :bold_italic => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf")
      })
      font "Arial"
    end
    

    然而,我在尝试生成PDF文件时也遇到了同样的错误。

    关于如何解决这个问题有什么想法吗?

    4 回复  |  直到 6 年前
        1
  •  31
  •   BenKoshy Mayinx    4 年前

    这个 prawn manual 是一个很好的参考,包括关于字体使用的章节。“外部字体”部分与您的问题特别相关。

    下面是一个基本的用例,虽然它不支持粗体和斜体:

    Prawn::Document.generate("output.pdf") do
      font Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf")
      text "Euro €"
    end
    

    要使用粗体和斜体,最好注册一个与标准PDF字体不冲突的字体系列:

    Prawn::Document.generate("output.pdf") do
      font_families.update("OpenSans" => {
        :normal => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
        :italic => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
        :bold => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
        :bold_italic => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf")
      })
      font "OpenSans"
      text "Euro €"
    end
    

    我应该把上面的代码放在哪里?

    如果您继承自 Prawn::Document 您可以尝试以下方法:

    class SpreeInvoicePdf < Prawn::Document
      require 'prawn'
    
      def initialize(quote, line_items)
        self.font_families.update("OpenSans" => {
                                    :normal => Rails.root.join("vendor/assets/fonts/Open_Sans/OpenSans-Regular.ttf"),
                                    :italic => Rails.root.join("vendor/assets/fonts/Open_Sans/OpenSans-Italic.ttf"),
                                    :bold => Rails.root.join("vendor/assets/fonts/Open_Sans/OpenSans-Bold.ttf"),
                                    :bold_italic => Rails.root.join("vendor/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf")
        })
    
        font "OpenSans"
    
      # etc.
    

    当然,您需要转到Google字体,下载字体并将其放置在 vendor/assets/fonts/Open_Sans/ 目录

        2
  •  3
  •   Patrick Jones    6 年前

    如果您正在使用initialize构建PDF,您只需在initial方法中更新字体族,然后设置所需的字体。

    class InvoicePdf < Prawn::Document
    
      def initialize()
        super()
        self.font_families.update("DejaVuSans" => {:normal => "#{Rails.root}/public/DejaVuSans.ttf"})
        font "DejaVuSans"
        business_logo
        invoice_items
        footer
      end
    
      def business_logo
        ##stuff here
      end
    
    end
    
        3
  •  0
  •   Abraham    2 年前

    如果要更改整个文档中的默认字体,请先清除font_families并添加您的字体。Prawn有自己的一组默认字体,在您使用@doc.font更改字体后,这些默认字体将返回到Prawn。 下面的代码清除了Prawn具有的3个字体系列,并只保留默认字体,这将强制它使用真正的“默认”。

    Prawn::Document.generate(filename) do |doc|
       doc.font_families.clear
       doc.font_families.update(
         "DejaVuSans" => {
            :bold => Rails.root.join("app/assets/font/DejaVuSans-Bold.ttf"),
            :italic => Rails.root.join("app/assets/font/DejaVuSansOblique.ttf"),
            :normal => Rails.root.join("app/assets/font/DejaVuSans.ttf"),
         }
        )
        # more code
    end
    
        4
  •  -1
  •   AZB    5 年前

    我实际上进入了gems文件夹和Prawn/font.rb。

    我发现了以下功能:

    def font_families
      @font_families ||= Hash.new { |h,k| h[k] = {} }.merge!(
        { "Courier"     => { :bold        => "Courier-Bold",
                             :italic      => "Courier-Oblique",
                             :bold_italic => "Courier-BoldOblique",
                             :normal      => "Courier" },
    
          "Times-Roman" => { :bold         => "Times-Bold",
                             :italic       => "Times-Italic",
                             :bold_italic  => "Times-BoldItalic",
                             :normal       => "Times-Roman" },
    
          "Helvetica"   => { :bold         => "Helvetica-Bold",
                             :italic       => "Helvetica-Oblique",
                             :bold_italic  => "Helvetica-BoldOblique",
                             :normal       => "Helvetica" }              
        })
    end
    

    我编辑了它以包括Arial:

    def font_families
      @font_families ||= Hash.new { |h,k| h[k] = {} }.merge!(
        { "Courier"     => { :bold        => "Courier-Bold",
                             :italic      => "Courier-Oblique",
                             :bold_italic => "Courier-BoldOblique",
                             :normal      => "Courier" },
    
          "Times-Roman" => { :bold         => "Times-Bold",
                             :italic       => "Times-Italic",
                             :bold_italic  => "Times-BoldItalic",
                             :normal       => "Times-Roman" },
    
          "Helvetica"   => { :bold         => "Helvetica-Bold",
                             :italic       => "Helvetica-Oblique",
                             :bold_italic  => "Helvetica-BoldOblique",
                             :normal       => "Helvetica" },
    
                "Arial" => { :normal => "public/fonts/arial.ttf",
                              :italic => "public/fonts/ariali.ttf.ttf",
                              :bold => "public/fonts/arialbd.ttf",
                              :bold_italic => "public/fonts/arialbi.ttf"}              
        })
    end
    

    还有维奥拉!成功了!