【问题标题】:How do I change font in Prawn如何更改虾的字体
【发布时间】:2016-11-17 09:40:37
【问题描述】:

我正在尝试使用 Prawn 生成 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 文件时遇到了同样的错误。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: ruby-on-rails pdf prawn


    【解决方案1】:

    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.
    

    你当然需要去谷歌字体下载字体并将它放在vendor/assets/fonts/Open_Sans/目录中。

    【讨论】:

    • 如何在表格单元格中实现?
    • 您的回答完全解决了一个困扰了我两个星期的问题。你的第二段特别。关键是将所有字体映射到“常规”。在我的例子中,我将 ":normal" 映射到 "regular",将 ":bold" 映射到 "bold" 等等,我完全不知道我做错了什么。谢谢!!!
    【解决方案2】:

    如果您使用初始化构建 PDF,您可以简单地在初始化方法中更新您的字体系列,然后设置所需的字体。

    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
    

    【讨论】:

    • 如何使用默认字体?我得到同样的错误,但我没有设置任何字体Prawn::Document.new(page_size: 'LETTER', margin: 0)
    【解决方案3】:

    如果要更改整个文档中的默认字体,请先清除 font_families 并添加您的。 Prawn 有自己的一组默认字体,在您使用 @doc.font 更改字体后会回退到它。 下面的代码清除了 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】:

      我实际上进入了 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
      

      还有中提琴!成功了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 2011-07-31
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多