ruby-on-rails 大虾PDF支持英语和日语/中文/泰语/韩语在同一个PDF

4xrmg8kj  于 2023-10-21  发布在  Ruby
关注(0)|答案(2)|浏览(93)

我正在使用ROR和Prawn生成PDF。PDF文件有英文(表格标签)和日文或其他FE语言(用户输入的数据)。
我发现了与此相关的问题,其中ipamp.ttf被建议。我安装了这个字体,它打印日文很漂亮。问题是,它不支持英语!我两样都需要。
为了以防万一,下面是我安装ipamp的方法。我只是在initialize方法中调用font:

font("lib/assets/ipamp.ttf")

我找到了谷歌的诺托字体,但它们是ttc格式的,大虾不能使用。
我正在寻找一个解决方案,以支持所有欧盟和远东语言,同时,在一个PDF文档,没有一堆的逻辑,以确定我试图显示的文本是否是欧盟/拉丁美洲或远东(和切换字体的基础上)。听起来会很脆弱。
字体文件的大小将不会成为问题,因为PDF将在服务器上呈现并作为PDF发送到客户端。
谢谢你,谢谢

tjrkku2a

tjrkku2a1#

这是解决方案,从这篇文章(this post)和一些试验和错误拼凑起来。
关键是Prawn支持fallback字体。你必须将它们下载到你的项目中,然后更新Prawn的字体家族以包含它们,然后包含一个名为“fallback_fonts”的方法,以便Prawn在意识到它有一个不知道如何渲染的Unicode字符时使用。

class ResultsPdf < Prawn::Document

  def initialize(device)
    super()
    @device = device
    set_fallback_fonts
    page_title         #typically English
    persons_name       #typically Japanese
  end

 def set_fallback_fonts
    ipamp_path = "lib/assets/ipamp.ttf"
    ipamp_spec  = { file: ipamp_path, font: 'IPAPMincho'}

    #don't use a symbol to define the name of the font!
    font_families.update("ipamp" => {normal: ipamp_spec,
                                    bold: ipamp_spec,
                                    italic: ipamp_spec,
                                    bold_italic: ipamp_spec})
  end

  def fallback_fonts
    ["ipamp"]
  end

  def page_title
    # device name is typically in English
    text "#{@device.name}", :size => 15, :style => :bold, :align => :center
  end

  def persons_name
    # owner name can be in any language, including Japanese
    # you don't have to specify :fallback_font here.  Prawn will use your method.
    text "Name: #{@device.owner_last_name}"
  end

end
8fsztsew

8fsztsew2#

gem 'prawn' gem 'prawn-unicode'

app/controllers/pdf_controller.rb

class PdfController < ApplicationController def generate_pdf pdf pdf = Prawn::Document.new

# Set the font to a Unicode font that supports multiple languages
pdf.font("#{Prawn::BASEDIR}/data/fonts/NotoSansCJKjp-Regular.otf")

# English text
pdf.text("Hello, World!")

# Japanese text
pdf.text("こんにちは、世界!")

# Chinese text
pdf.text("你好,世界!")

# Thai text
pdf.text("สวัสดีครับ โลก!")

# Korean text
pdf.text("안녕하세요, 세계!")

# Save the PDF to a file or send it as a response
pdf.render_file('multilingual.pdf')

# Alternatively, you can send the PDF as a response
# send_data(pdf.render, filename: 'multilingual.pdf', type: 'application/pdf')

结束结束

相关问题