大虾PDF从html_text

问题描述

在带Ruby 2.7的Rails 6应用程序中,我使用gem prawn生成pdf文件。到目前为止,一切都非常简单。我在定义html_text中的行高时遇到问题。就像下面的方法一样:

  def invoice_notes_section
    invoice_notes.each { |note| html_text(note) }
  end

  def invoice_notes
    @invoice_notes ||= begin
      notes = []
      notes << (invoice.display_service_period? ? invoice.service_period_text : I18n.t('pdf.no_service_period'))
      notes << invoice.discount_text if invoice.display_discount_text?
      notes << invoice.notes
      notes << I18n.t('pdf.small_entrepreneur_hint') if invoice.customer.company.small_entrepreneur?
      notes.compact
    end

我想将字体大小更改为7pt,将行高更改为9pt。由于我不能简单地添加例如:

      notes << invoice.notes,size: 7,leading: 9

哪个给我SyntaxError:

error,unexpected ',',expecting `end'
      notes << invoice.notes,leading: 9
                            ^
):

在本节中,我试图实现一个文本块,如下所示:

Desired text block

编辑:

  def html_text(text)
    return if strip_tags(text).strip.empty?

    if text.include?('>') && text.include?('</')
      styled_text
    else
      text text
    end
  rescue Prawn::Errors::UnkNownFont
    text text,size: BODY_FONT_SIZE
  end

如果我将块行替换为:

if text.include?('>') && text.include?('</')
  styled_text text,leading: 9
else
  text text,leading: 9
end

ArgumentError (wrong number of arguments (given 2,expected 1)):对应的行出现错误styled_text text,leading: 9。那是styled_text是什么?如果将其更改为text,我将得到:

Das Leistungsdatum entspricht dem Rechnungsdatum sofern nichts anderes erwähnt wird.
    
<p>Bitte überweisen Sie den Betrag bis zum oben angegebenen Fälligkeitsdatum auf das angegebene Bankkonto unter Angabe

der Rechnungsnummer</p>

代替:

Das Leistungsdatum entspricht dem Rechnungsdatum sofern nichts anderes erwähnt wird.
    
Bitte überweisen Sie den Betrag bis zum oben angegebenen Fälligkeitsdatum auf das angegebene Bankkonto unter Angabe
der Rechnungsnummer

解决方法

我认为您已经回答了关于styled_text是什么的问题(因为它来自prawn-styled-text宝石)。

此外,styled_text方法仅接受单个参数,因此您不能像使用size: 7,leading: 9那样提供其他选项。

如果要更改字体大小和行距,则必须自己修改HTML片段。我想如果您这样做而不是整个if子句,它应该会起作用:

styled_text("<div style='font-size: 7; line-height: 9'>#{text}</div>")