質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

2779閲覧

pdfkitのheaderだけが、htmlタグが解釈されず、そのまま出力されます。

kento2543

総合スコア163

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/05/03 06:09

編集2022/01/12 10:55

pdfkitを用いて、PDFファイルを生成する機能を実装しておりまして、
PDFファイルができるところまではできました。

https://github.com/pdfkit/pdfkit

ただ、共通のheader, footerを入れる際に、htmlタグがそのままでてしまいます。

Controllerの処理は次の通り、記述しております。

レイアウトはslimで書いておりまして、この部分は問題なく、htmlタグが解釈できておりました。

def export respond_to do |format| # .html でアクセスした際は、リダイレクト(show_as_html を true にするため、debug: 1 で) format.html { redirect_to action: 'export', format: 'pdf', debug: 1 } format.pdf do html = render_to_string template: 'layouts/export.html.slim' @pdf = PDFKit.new(html, header_left: '<p>hoge</p>') @pdf.stylesheets << "#{Rails.root}/app/assets/stylesheets/pdf.css" send_data @pdf.to_pdf, filename: "test.pdf", type: "application/pdf", disposition: "inline" end end end

header_leftを追加し <p>hoge</p> も出力されているのですが、
headerだけはhtmlタグがそのままでてしまいます。

実行環境

mac OSX yosemite pdfkit (0.8.2) wicked_pdf (1.1.0) Rails 4.2.7.1 ruby 2.3.1p112

対策1

エスケープしたりしましたが、ダメでした。

ApplicationController.helpers.sanitize "<p>hoge</p>"

http://qiita.com/2or3/items/3f25216663190676a693

対策2

Slimがダメなのかと思い次の通りやりましたが、ダメでした。

@pdf = PDFKit.new('<html><head></head><body></body></html>', header_left: '<p>hoge</p>')

デバッグ時のインスタンス変数の中身

> @pdf => #<PDFKit:0x007ffad89d2c60 @host_is_windows=false, @options= {"--encoding"=>"UTF-8", "--page-size"=>"A4", "--margin-top"=>"0.25in", "--margin-right"=>"1in", "--margin-bottom"=>"0.25in", "--margin-left"=>"1in", "--header-left"=>"<p>hoge</p>"}, @source=#<PDFKit::Source:0x007ffad89d2c38 @is_url=nil, @source="<html><head></head>">, @stylesheets=["path/to/pdf.css"]>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ruby

1 @pdf = PDFKit.new('html', header_left: '<p>hoge</p>'.html_safe)

ではダメでしょうか?

投稿2017/05/03 06:20

編集2017/05/03 06:37
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kento2543

2017/05/03 06:29

ご回答ありがとうございます。 期待と共に、ためしてみました。 しかし、こちらもタグがそのままでてしまいダメでした。
moke

2017/05/03 06:37 編集

@pdf = PDFKit.new('html', header_left: content_tag(:p,'hoge')) を試して無理だったらPDFKitのgithubをみないとわからないですね...
moke

2017/05/03 06:41

gitをみたらhtmlにクォテーションが付いてましたが。 一応それを確認して それでも無理なら、きっとこれは印刷用のヘッダーなのではないでしょうか? だとすると印刷用ヘッダーにhtml tagは使えません。
kento2543

2017/05/03 06:42

度々ありがとうございます。こちらも試してみましたが、ダメでした。 ちなみに@pdf のインスタンス変数の中身を質問文に追記しました。 見る限りは問題なさそうな気がしますが、GitHubでコードも見てみます。
kento2543

2017/05/03 06:56

第一引数をクオテーションで囲むと以下のようになりました。 @pdf = PDFKit.new('html', header_left: content_tag(:p,'hoge')) ``` <p>hoge</p> html ``` 第一引数はhtmlタグを適切に解釈してくれていて、 質問本文に書いた記法でやると、適切に解釈してくれます。
moke

2017/05/03 07:02

そうですか、貴重な情報ありがとうございます。 私は実はprawn派なのですが 解決したら、方法を知りたいです。
kento2543

2017/05/03 07:06

仮にheaderは文字列しか表示できないとして、headerのフォントサイズや、色を変更さえできれば、要件を満たせられますので、そういったことができるのか探ってみようと思います。
moke

2017/05/03 07:07

やはりlayouts/export.html.slim の中にheader_leftもどきを入れて対応するのが いいようです。 私の見た限りだと、header_leftは印刷時にURLなどが入る方のheader のようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問