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

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

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

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

5388閲覧

【Electron】指定DIVをPDFで出力したい

nnahito

総合スコア2004

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/01/22 15:58

質問

Electronで、指定部分(例えばDIV)をPDFにして出力する機能を付けたいのですが、
うまくいきません。

jsPDF.jsと言うものを使ってみたのですが、どうもElectronとは相性が悪いようで、定義されているメソッドが定義されていないと出ます。

調べていくと、Electron自体にページをPDF化するメソッドが備わっているようです。
しかし、これはページ全体をPDFとして出力するような感じでかかれています。
(英語が苦手なので、雰囲気そう感じ取りました。)

指定divだけをPDFにするにはどうすればよいでしょうか。
ご存じの方がいらっしゃいましたら、ご教示願います。
よろしくお願いいたします。

蛇足

stack overflowさんで、「How to print a DIV in ElectronJS」という質問を見つけました。
ここのやり方をコピペしたのですがそのままでは動きませんでした。

そしてさらには、
「ボタンを押したらあるDIVをPDFにして出力」したいので、
常にウインドウを2つ出しているのには抵抗があります。

とりあえず、ipcMain.on("printPDF",の部分を以下のように書き換えましたが、
workerWindowがundefinedと出ます。
もちろんworkerWindowは、グローバルにvarで定義しております。

javascript

1// retransmit it to workerWindow 2 ipcMain.on("printPDF", (event, content) => { 3 console.log(content); 4 5 workerWindow = new BrowserWindow(); 6 workerWindow.loadURL("file://" + __dirname + "/worker.html"); 7 // workerWindow.hide(); 8 workerWindow.webContents.openDevTools(); 9 workerWindow.on("closed", () => { 10 workerWindow = undefined; 11 }); 12 13 workerWindow.webContents.send("printPDF", content); 14 });

環境

MacOS X Yosemite 10.10.5
Electron 1.4.12(最新…ですよね?)
materialize 0.97.8
jQuery 3.1.1

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

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

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

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

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

guest

回答1

0

はじめに

どこでundefinedになるのかが分からなかったのですが、類似の処理を行っていたので検証用のソースを載せます。

検証環境

macOS Sierra 10.12.3
Electron v1.6.0
materialize 0.98.0
jQuery 3.1.1

コード

実行可能なコード一式
https://github.com/usazukinchan/electron-sample-print-to-pdf

  • メインプロセス側の処理(抜粋)

注意した点は、workerページが準備完了した後に要求を投げるようにすること。

javascript

1var workerWindow = null; 2... 3// mainページからの印刷要求 4ipcMain.on("print-to-pdf", (event, content) => { 5 if (workerWindow !== null) { 6 // エラーにより前回のページが残っていたら閉じる 7 workerWindow.close(); 8 } 9 10 workerWindow = new BrowserWindow({ show: false }); 11 workerWindow.loadURL("file://" + __dirname + "/worker.html"); 12 workerWindow.openDevTools(); 13 14 workerWindow.on("closed", () => { 15 workerWindow = null; 16 }); 17 18 // workerページが準備完了した後に要求を投げるようにする 19 workerWindow.on("ready-to-show", () => { 20 workerWindow.send("print-to-pdf", content); 21 }); 22}); 23 24// workerページからの準備完了通知 25ipcMain.on("ready-print-to-pdf", (event) => { 26 const pdfPath = path.join(app.getPath("temp"), "print.pdf"); 27 const options = { printBackground: true }; 28 29 workerWindow.webContents.printToPDF(options, (error, data) => { 30 if (error) { 31 throw error; 32 } 33 fs.writeFile(pdfPath, data, (error) => { 34 if (error) { 35 throw error; 36 } 37 // プレビュー表示 38 shell.openItem(pdfPath); 39 // PDFファイルは書き込み済みなのでworkerページは閉じても大丈夫 40 workerWindow.close(); 41 }); 42 }); 43});

投稿2017/02/17 01:33

StupidDog

総合スコア263

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問