首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改Prawn中的字体

如何更改Prawn中的字体
EN

Stack Overflow用户
提问于 2016-11-17 17:40:38
回答 4查看 9.5K关注 0票数 10

我正在尝试做的是生成一个PDF使用虾,同时有一些语言特定的字符。

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

代码语言:javascript
复制
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."

因此,我尝试通过执行以下操作更改字体:

代码语言:javascript
复制
# 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文件时,我得到了相同的错误。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-18 07:34:46

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

这是一个基本的例子,虽然它不支持粗体和斜体,但它应该可以工作:

代码语言:javascript
复制
Prawn::Document.generate("output.pdf") do
  font Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf")
  text "Euro €"
end

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

代码语言:javascript
复制
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继承的,则可以尝试以下操作:

代码语言:javascript
复制
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 fonts下载字体并将其放在vendor/assets/fonts/Open_Sans/目录中。

票数 28
EN

Stack Overflow用户

发布于 2018-01-24 22:39:02

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2022-02-16 13:12:25

如果要更改整个文档中的默认字体,请先清除font_families,然后添加您的字体。对虾有自己的默认字体集,在您使用@doc.font更改字体后,这些默认字体将回退到它。下面的代码清除了Prawn作为备用字体的3个字体系列,只保留默认字体,这会迫使它使用真正的“默认”字体。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40651362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档