【问题标题】:Ruby - How to use different fonts in Prawn?Ruby - 如何在 Prawn 中使用不同的字体?
【发布时间】:2016-09-14 04:39:45
【问题描述】:

我有一个小型 Rub​​y 程序,我在其中使用 Prawn 将一些文本打印到 PDF 中,但一小部分文本是非英文字符。 (有些文本是中文的,有些是希腊语的,等等)。当我运行我的程序时,我当然会收到一条错误消息Your document includes text that's not compatible with the Windows-1252 character set. (Prawn::Errors::IncompatibleStringEncoding) If you need full UTF-8 support, use TTF fonts instead of PDF's built-in fonts。我知道我需要使用 TTF 字体,但我该怎么做呢?我需要从网上安装吗?如果是这样,我会将它保存到哪里?我知道这可能是一个愚蠢的问题,但我是 Ruby 和 Prawn 的新手。谢谢!

【问题讨论】:

    标签: ruby pdf prawn


    【解决方案1】:

    ttf 是一种常见的格式,你可以在Google font 下载字体,把字体放在你项目的某个目录下,比如/assets/fonts/

    然后您可以像这样定义一个新的字体系列:

    Prawn::Document.generate("output.pdf") do
      font_families.update("Arial" => {
        :normal => "/assets/fonts/Arial.ttf",
        :italic => "/assets/fonts/Arial Italic.ttf",
      })
      font "Arial"
    end
    

    然后您可以在整个文档中使用该字体。

    【讨论】:

    • 我应该在什么文件中插入这段代码?另外我在 Google 字体上找不到 Arial.ttf?... 有什么想法值得赞赏吗?
    【解决方案2】:

    如果你使用普通的Ruby,你可以试试这个方法:

    require 'prawn'
    
    Prawn::Document.generate("my_text.pdf") do
    
      font('Helvetica', size: 50) do
        formatted_text_box(
          [{text: 'Whatever text you need to print'}],
          at: [0, bounds.top],
          width: 100,
          height: 50,
          overflow: :shrink_to_fit,
          disable_wrap_by_char: true  # <---- newly added in 1.2
        )
      end
    end
    

    【讨论】:

    • PDF 文件无法识别多字节字体。他们有一个字符映射,将每个字节值映射到一个字体字形(不是 ascii 表)......所以这个解决方案可能会在 PDF 中产生未定义的数据。
    • - 可能在您的机器上运行良好并在另一台机器上中断,因为它不符合 PDF 标准。使用字体并将其映射到实际数据是要走的路。令我惊讶的是,您使用多字节字符串(例如中文)对其进行了测试,并且可以正常工作。
    【解决方案3】:

    防止此错误的快速而肮脏的解决方法是在将文本写入 pdf 文件之前将其编码为 windows-1252。

    text = text.encode("Windows-1252", invalid: :replace, undef: :replace, replace: '')
    

    这种方法的一个缺点是,如果您要转换的字符在 Windows-1252 编码中无效或未定义,它将被替换为空字符串 '' 根据您的原始文本,此解决方案可能会正常工作,或者您最终可能会在 PDF 中丢失一些字符。

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多