PDFKit с Rails создает неверный формат текста, используя render_to_string

Я использую PDFKit для отображения частичного представления в виде файла PDF. Однако у меня возникают некоторые проблемы при попытке использовать render_to_string (предпочтительный метод), а не внешний веб-запрос.

Файл PDF при отображении с использованием URL-адреса:

html = "#{root_url}/contracts/#{@contract.id}"
pdf = PDFKit.new(html, page_size: 'Letter').to_pdf

Правильный текст

Файл PDF при отображении с использованием render_to_string:

html = render_to_string :partial => "agreement"
pdf = PDFKit.new(html , page_size: 'Letter').to_pdf
*from the console*
html => "\n\n<style>\n  #contract h2{text-align: center; margin-bottom: 10px;}\n  #contract em{font-weight: bold; text-decoration: underline; font-style: normal;}\n  #contract p.tab{margin-left: 25px;}\n  #contract ol{list-style:lower-alpha;}\n  #contract ol li{margin-left: 25px; font-size: 1em; line-height: 1.615em; color: #555; margin-bottom: 5px;}\n  #contract b{font-weight: bold;}\n  #contract p p{margin-left: 10px;}\n</style>\n<div id=\"contract\">\n <p>This agreement (“<b>Agreement</b>”) is entered into...

Неверный формат текста

Что я делаю не так?


person Sean S    schedule 16.02.2013    source источник
comment
Вероятно, вы пытаетесь отобразить символы Юникода (кавычки) на странице с кодировкой ASCII. Проблема не имеет ничего общего с pdf, добавьте <meta encoding="utf-8"> в head вашего html.   -  person Aleksei Matiushkin    schedule 16.02.2013
comment
Я пробовал, и это, кажется, не помогает. Один и тот же html передается в PDFKit в обоих случаях, но только один из них имеет плохую кодировку.   -  person Sean S    schedule 16.02.2013


Ответы (1)


У вас кривые кавычки в исходном партиале. Вывод консоли показывает это:

...<p>This agreement (“<b>Agreement</b>”)...

Изогнутые кавычки — это символы UTF-8, однако PDFKit по умолчанию анализирует их как ASCII. См. этот вопрос.


EDIT: для передачи строки с прямым рендерингом требуется, чтобы строка использовала кодировку UTF-8. Ruby 1.9 делает это по умолчанию. В Ruby 1.8 попробуйте следующее:

html = render_to_string :partial => "agreement", :encoding => "UTF-8"
person Substantial    schedule 16.02.2013
comment
Я попытался добавить кодировку выше, как показано в вашем редактировании, а также передать html.toutf8() непосредственно в PDFKit. Ни один из них не работает :-/ - person Sean S; 16.02.2013
comment
Я добавил ‹meta http-equiv=Content-type content=text/html; charset=utf-8 /› в заголовок html, как это предлагается в предоставленной вами ссылке, и это сработало. Спасибо! - person Sean S; 16.02.2013
comment
Добавление метатега в ‹head› из комментария выше, у меня тоже очень хорошо сработало :) - person Bjorn Forsberg; 23.02.2015