如何在 Prawn 中更改字体
How do I change font in Prawn
我想做的是使用 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 文件时遇到了同样的错误。
关于如何解决这个问题有什么想法吗?
prawn manual 是一份极好的参考资料,其中包含有关字体使用的章节。 "External Fonts" 部分与您的问题特别相关。
这里有一个应该可以工作的基本案例,尽管它不支持粗体和斜体:
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/
目录中。
如果您使用初始化构建 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
我实际上进入了 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
还有中提琴!成功了!
如果要更改整个文档中的默认字体,请先清除 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
我想做的是使用 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 文件时遇到了同样的错误。
关于如何解决这个问题有什么想法吗?
prawn manual 是一份极好的参考资料,其中包含有关字体使用的章节。 "External Fonts" 部分与您的问题特别相关。
这里有一个应该可以工作的基本案例,尽管它不支持粗体和斜体:
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/
目录中。
如果您使用初始化构建 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
我实际上进入了 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
还有中提琴!成功了!
如果要更改整个文档中的默认字体,请先清除 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