我正在尝试做的是生成一个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文件时,我得到了相同的错误。
对如何解决这个问题有什么想法吗?
发布于 2016-11-18 07:34:46
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 fonts下载字体并将其放在vendor/assets/fonts/Open_Sans/目录中。
发布于 2018-01-24 22:39:02
如果您正在使用initialize构建PDF,则只需在initialize方法中更新字体系列,然后设置所需的字体。
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发布于 2022-02-16 13:12:25
如果要更改整个文档中的默认字体,请先清除font_families,然后添加您的字体。对虾有自己的默认字体集,在您使用@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
endhttps://stackoverflow.com/questions/40651362
复制相似问题