[解決済み】Javascriptでdiv内のHTMLからpdfを生成する。
質問
以下のようなhtmlコードを持っています。
<!DOCTYPE html>
<html>
<body>
<p>don't print this to pdf</p>
<div id="pdf">
<p><font size="3" color="red">print this to pdf</font></p>
</div>
</body>
</html>
私がしたいことは、idが "pdf"のdivの中にあるものをpdfに印刷することだけです。 これは、JavaScriptを使って行わなければなりません。 そして、"pdf"の文書は、"foobar.pdf"のファイル名で自動的にダウンロードされる必要があります。
私はこれを行うためにjspdfを使っていますが、jspdfが持つ唯一の関数は"text"で、これは文字列値しか受け付けないのです。 テキストではなく、HTMLをjspdfに送信したいのですが。
どのように解決するのですか?
jsPDFはプラグインを使用することができます。 HTMLを印刷できるようにするためには、特定のプラグインを入れる必要があるため、以下のようにする必要があります。
- 次のページへ https://github.com/MrRio/jsPDF をクリックし、最新版をダウンロードしてください。
-
以下のスクリプトをプロジェクトに組み込んでください。
- jspdf.js
- jspdf.plugin.from_html.js
- jspdf.plugin.split_text_to_size.js。
- jspdf.plugin.standard_fonts_metrics.js。
特定の要素を無視したい場合は、その要素にIDを付ける必要があり、それをjsPDFの特別な要素ハンドラで無視することができます。したがって、あなたのHTMLはこのようになるはずです。
<!DOCTYPE html>
<html>
<body>
<p id="ignorePDF">don't print this to pdf</p>
<div>
<p><font size="3" color="red">print this to pdf</font></p>
</div>
</body>
</html>
そして、以下のJavaScriptのコードを使って、作成されたPDFをPopUpで開くのです。
var doc = new jsPDF();
var elementHandler = {
'#ignorePDF': function (element, renderer) {
return true;
}
};
var source = window.document.getElementsByTagName("body")[0];
doc.fromHTML(
source,
15,
15,
{
'width': 180,'elementHandlers': elementHandler
});
doc.output("dataurlnewwindow");
私の場合は、「print this to pdf」という行だけを含む、きれいに整頓されたPDFが作成されました。
なお、特殊な要素ハンドラは、現在のバージョンではIDしか扱わないので、その旨も GitHubイシュー . と記載されています。
ノードツリー内のすべての要素に対してマッチングが行われるため、できるだけ高速に動作させたいというのが私の願いでした。その場合、"要素IDのみマッチングされる"要素IDはjQueryスタイルの"#id"で行われますが、すべてのjQueryセレクタをサポートするということではありませんということでした。
したがって、「#ignorePDF」を「.ignorePDF」のようなクラスセレクタで置き換えても、私にはうまくいきませんでした。代わりに、無視したい各要素に同じハンドラを追加する必要があります。
var elementHandler = {
'#ignoreElement': function (element, renderer) {
return true;
},
'#anotherIdToBeIgnored': function (element, renderer) {
return true;
}
};
から 例 また、'a'や'li'などのタグを選択することが可能であると記載されています。しかし、これはほとんどの使用例に対して、少し無制限すぎるかもしれません。
特殊な要素ハンドラをサポートしています。それらをjQueryスタイルで登録します。 IDセレクタで、IDまたはノード名を指定します。("#iAmID", "div", "span" など)。 他のタイプのセレクタ(クラス、オブ)はサポートされていません。 を含む)。
一つとても重要なことを付け加えると、スタイル情報(CSS)が全て失われてしまうことです。幸いにもjsPDFはh1, h2, h3などをきれいにフォーマットすることができ、私の目的には十分でした。さらに、それはテキストノード内のテキストのみを印刷します。つまり、textareasの値などは印刷されません。例
<body>
<ul>
<!-- This is printed as the element contains a textnode -->
<li>Print me!</li>
</ul>
<div>
<!-- This is not printed because jsPDF doesn't deal with the value attribute -->
<input type="textarea" value="Please print me, too!">
</div>
</body>
関連
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] jQueryを使ってドロップダウンリスト(セレクトボックス)から選択されたテキストを取得する
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] JavaScriptでドロップダウンリストの選択値を取得する
-
[解決済み] JavaScriptでページの一番上までスクロールする?
-
[解決済み】「GET」パラメータから値を取得する(JavaScript)【重複】。
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み】JavaScript "Uncaught TypeError: object is not a function" 連想性の質問
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない
-
[解決済み】JavaScriptでPDFファイルを生成する