2016-04-11 3 views
1

Я создаю PDF, используя ROR и креветку. PDF находится на английском языке (этикеток форм) и на японских или других языках FE (данные, введенные пользователем).Креветка PDF поддержка как английского, так и японского/китайского/тайского/корейского в том же формате PDF

Я нашел связанный с этим вопрос, где был предложен ipamp.ttf. Я установил этот шрифт, и он красиво красит японский язык. Беда в том, что он не поддерживает английский! Мне нужны оба.

В случае, если это имеет значение, вот как я установил ipamp. Я просто назвал шрифт внутри метода инициализации:

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

Я нашел шрифты Noto Google, но они находятся в TTC формате, креветка не может использовать.

Я ищу решение для поддержки всех языков ЕС и Дальнего Востока одновременно в одном документе PDF без логики, чтобы определить, является ли текст, который я пытаюсь отобразить, - это ЕС/Латинский или Дальний Восток (и переключая шрифт на основе этого). Похоже, это было бы довольно хрупким.

Размер шрифта не вызывает беспокойства по мере того, как PDF будет отображаться на сервере и отправляться клиенту, как PDF-файл.

Спасибо!

ответ

2

Вот решение, собранное вместе с этим сообщением (this post) и некоторые пробные версии и ошибки.

Ключ в том, что креветка поддерживает резервные шрифты. Вы должны загрузить их в свой проект, а затем обновить семейство шрифтов Креветки, чтобы включить их, а затем включить метод, называемый «fallback_fonts» для Prawn, когда он понимает, что он имеет символ юникода, который не знает, как визуализировать.

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 
Смежные вопросы