Любой шрифт для создания pdf, который будет обрабатывать китайский язык, кириллицу?

Я создаю генератор pdf-документов в Ruby on Rails с помощью драгоценного камня Prawn и столкнулся с проблемой, что когда у меня есть китайские, японские и кириллические символы, они отображаются неправильно. Я погуглил, что это потому, что "когда я генерирую шрифт, мне нужно указать, каким шрифтом должен отображаться текст PDF".

Дело не в этом, а в том, что мои документы будут включать все возможные символы, которые поддерживает gTLD.

Вопрос 1:

Знаете ли вы какой-нибудь шрифт для создания pdf-документов, который будет включать как можно больше символов (азиатские, европейские, символы, ...)? В идеале все символы, которые поддерживает gTLD.

Я знаю, что Prawn по умолчанию включает gkai00mp.ttf, но он ориентирован на китайские иероглифы, и я ищу возможность включить их все (например, PokeMon, нужно поймать их всех ; Я знаю, что прошу слишком много, но все же...)

Другая проблема заключается в том, что когда клиент открывает этот документ:

Вопрос 2

Является ли PDF-файл, созданный Prawn, включая мой шрифт в файле PDF, поэтому, когда другие компьютеры откроют его, шрифт будет присутствовать? Это стандарт по умолчанию? Или мне нужно обеспечить/принудительно использовать эту функциональность?


person equivalent8    schedule 18.06.2012    source источник
comment
Пожалуйста, не размещайте перекрестные сообщения. Я знаю, что ваш вопрос здесь немного другой, но по сути это одно и то же. Лучше всего решить эту проблему в корне, то есть в Ruby и Prawn.   -  person slhck    schedule 18.06.2012
comment
@slhck, это тот же вопрос, но я не хочу слышать ответы из разных групп. Здесь, на SO, я ожидаю ответов от разработчиков, которые работали с драгоценным камнем Prawn (или любым другим преобразованием pdf) и имели аналогичную проблему, связанную с этой библиотекой, скорее на SuperUser Я хочу услышать теоретические решения от людей, которые работают с PDF-файлами без среды программирования ... Просто здесь, на SO, я ожидаю меньше ответов, чем на SU.   -  person equivalent8    schedule 18.06.2012


Ответы (2)


Ладно, сам отвечу. В SuperUser я задал аналогичный вопрос (сосредоточившись на ответах более теоретически), и основным выводом был ответ, что:

Не существует единого шрифта, поддерживающего весь Юникод.

но, к счастью, pdf поддерживает резервные шрифты, а также pawn gem.

вот мое решение:

1/ установите резервные шрифты

  kai = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf"
  action_man_path = "#{Prawn::BASEDIR}/data/fonts/Action Man.dfont"
  dejavu = "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"

  font_families.update("dejavu" => {
    :normal      => dejavu,
    :italic      => dejavu,
    :bold        => dejavu,
    :bold_italic => dejavu
  })

  #Times is defined in prawn
  font_families.update("times" => {
    :normal => "Times-Roman",
    :italic      => "Times-Italic",
    :bold        => "Times-Bold",
    :bold_italic => "Times-BoldItalic"
  })

  font_families.update("action_man" => {
    :normal      => { :file => action_man_path, :font => "ActionMan" },
    :italic      => { :file => action_man_path, :font => "ActionMan-Italic" },
    :bold        => { :file => action_man_path, :font => "ActionMan-Bold" },
    :bold_italic => { :file => action_man_path, :font => "ActionMan-BoldItalic" }
  })

  font_families.update(
      "kai" => {
        :normal => { :file => kai, :font => "Kai" },
        :bold   => kai,
        :italic => kai,
        :bold_italic => kai
       }
    )

и

def fallback_fonts
  ["dejavu", "times", 'kai', 'action_man']
end

2/ звонок

 font("Helvetica", size: 14) do  #keyword "Helvetica" is specified in Prawn by default
   text "址 foo", :fallback_fonts => fallback_fonts 
 end

Здесь я просто использую шрифты, которые включены в Prawn по умолчанию, но таким образом вы можете добавить несколько шрифтов с разными кодировками и просто указать их как резервные.

Например, вы можете разместить свои шрифты где-нибудь в корневом каталоге Rails и просто включить их оттуда.

примечание в шрифте "Kai", я указываю один и тот же шрифт для обычного, курсивного, полужирного, полужирного_курсивного без стилей. Я делаю это намеренно. Судя по тому, что я испытал, в шрифте gkai00mp нет жирных или курсивных символов. Поэтому, когда курсив/полужирный шрифт отображается, он будет напечатан в обычном стиле (что лучше, чем вообще не отображать).

Если я не укажу полужирный/курсивный шрифт для шрифта (например, «Кай»)...

  font_families.update(
      "kai" => {
        :normal => { :file => kai, :font => "Kai" }
        }
    )

.. и вы пытаетесь отрендерить стилизованный char, который вернется к kai...

 text "<b>址 foo</b>", :fallback_fonts => fallback_fonts, :inline_format=>true 

...Я получу

Prawn::Errors::UnknownFont in Foo

  is not a known font. 

примечание 2: если вы хотите поместить не-ascii-символы в файл ruby, вам нужно поместить кодировку в начало файла.

# coding: utf-8

class Foo
...
end

это, однако, работает с ruby ​​​​1.9. Исходный код Ruby 1.8.x может обрабатывать только ASCII (подробнее об этом в пошаговом руководстве по Ruby 1.9 для ПК, но в Rails вы должны используйте I18n (интернационализация)

примечание 3

У Prawn действительно отличная документация, просто git clone prawn из github и проверьте ./manuals

person equivalent8    schedule 19.06.2012