Встраивание SVG в PDF с использованием Wicked_PDF (wkhtmltopdf)

#ruby-on-rails-3 #barcode #wkhtmltopdf #wicked-pdf

#ruby-on-rails-3 #штрих-код #wkhtmltopdf #wicked-pdf

Вопрос:

Когда я пытаюсь включить SVG в PDF, созданный wicked_pdf (wkhtmltopdf), он выходит пустым. Есть идеи, как заставить svg отображаться в PDF?

приложение / просмотры / штрих-коды/to_pdf.html.haml

 <descriptive text here>
%object#code_image{:data=>"/barcodes/generate_svg?code=4567898", :type=>"image/svg xml", :height=>70}
 

контроллер штрих-кодов

 def generate_svg
  require 'barby'
  require 'barby/barcode/code_128'
  require 'barby/outputter/svg_outputter'
  barcode = Barby::Code128B.new(params[:code])
  render :text => barcode.to_svg({:height=>30, :width => 170})
end


def to_pdf
 render :pdf        => 'file_name'      
end
 

Ответ №1:

Я заставил его работать, используя этот метод встраивания SVG.

Отображение встроенного SVG-файла с помощью тега

Заменить

 "data:image/svg xml;base64,PD94bWwgdmVy..."
 

с

 "data:image/svg xml;base64,#{Base64.encode64(barcode.to_svg)}"
 

Ответ №2:

вот как я адаптировал ответ user1632065 для работы как в HTML, так и в PDF

в вашем GemFile

 gem 'cairo'
gem 'barby'
 

в вашей модели

 class ExampleModel
  def barcode
    require 'barby'
    require 'barby/barcode/code_128'
    require 'barby/outputter/cairo_outputter'
    Barby::CairoOutputter.new(Barby::Code128B.new('bla bla this is barcode source'))
  end
end
 

на ваш взгляд (в моем случае haml)

 %img{:width => ExampleModelObject.barcode.width, :src=> "data:image/svg xml;base64,#{Base64.encode64(ExampleModelObject.barcode.to_svg)}"}
 

таким образом, вы получите правильную ширину штрих-кода

Ответ №3:

Я использую wicked_pdf в одном из своих приложений Rails 3.0.x, и это работает как шарм. Я использую SVG-код, встроенный непосредственно в HTML (представления erb / haml). Нет или — просто чистый тег с заданными атрибутами ‘width’ и ‘height’. Это не работает для некоторых браузеров (Opera, IE<9), но в моем случае меня это не волнует. Может быть, вы могли бы попробовать использовать свои материалы таким образом?