2016-04-11 66 views
1

Ich erzeuge eine PDF mit ROR und Prawn. Die PDF-Datei ist sowohl in Englisch (die Formularbeschriftungen) als auch in Japanisch oder anderen FE-Sprachen (die vom Benutzer eingegebenen Daten).Prawn PDF Unterstützung sowohl Englisch und Japanisch/Chinesisch/Thai/Koreanisch in der gleichen PDF

Ich habe die verwandte Frage dazu gefunden, wo ippamp.ttf vorgeschlagen wurde. Ich habe diese Schriftart installiert und sie druckt schön japanisch. Das Problem ist, es unterstützt kein Englisch! Ich brauche beides.

Falls es darauf ankommt, hier ist, wie ich ipamp installiert habe. Ich habe gerade Schriftart in der initialize Methode aufgerufen:

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

ich Googles Noto Fonts gefunden, aber sie sind in ttc-Format, die Garnelen kann nicht verwendet werden.

Ich bin auf der Suche nach einer Lösung zur Unterstützung aller EU- und Fernost-Sprachen gleichzeitig in einem PDF-Dokument, ohne Logik, um festzustellen, ob der Text EU/Latein oder Fernost ist (und die Schriftart basierend darauf). Scheint so, als wäre das ziemlich brüchig.

Die Größe der Schriftartdatei ist nicht von Bedeutung, da die PDF-Datei auf dem Server gerendert und an den Client als PDF gesendet wird.

Danke!

Antwort

2

Hier ist die Lösung, von diesem Beitrag (this post) zusammen und einige Versuch und Irrtum zusammen.

Der Schlüssel ist, dass Prawn Fallback-Schriftarten unterstützt. Sie müssen sie in Ihr Projekt herunterladen und dann die Schriftfamilien von Prawn aktualisieren, um sie einzuschließen. Fügen Sie dann eine Methode namens "fallback_fonts" für Prawn hinzu, wenn sie erkennt, dass sie Unicode-Zeichen hat, die sie nicht zu rendern weiß.

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