2015年11月11日

Javascriptでスクショを撮ってpdfを生成する実験結果


人様から『なんか自分好みのカレンダー作れたらいいよね~』
てことを言われ、少し遊んでみようかといろいろ考えているんですけど……

最終的にカレンダーはpdfで出せたら一番いいよな~と思い、
サーバーに負荷をかけるのもなんかイヤだったので、
Javascriptでクライアント側でpdfを作成することを思いつきまして。

んで、実際にカレンダーを組むのはhtml。
htmlで組んだカレンダーをJavasctiptで画像化し、
その画像でpdfを作って発行するという仕組みを思いつきました。

前提として、これらを利用しますので、
おのおのダウンロードをお願い致しますぃ。

『jsPDF』てのは、その名の通りJavascriptでpdfを生成するためのものです。
『FileSaver』てのは、Javascriptで任意のファイルを保存するためのもので、
『html2canvas』てのは、スクリーンショットを撮るためのものです。

んで、そのテストとして作成したのがこのhtmlたち。
まずはhtmlです。

<!DOCTYPE html>
<html>
    <head>
        <title>Javascriptで撮ったスクショからPDFを作るテストです</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
        <script type="text/javascript" src="js/html2canvas.js" ></script>
        <script type="text/javascript" src="js/jsPDF/jspdf.js"></script>
        <script type="text/javascript" src="js/jsPDF/jspdf.plugin.addimage.js"></script>
        <script type="text/javascript" src="js/jsPDF/jspdf.plugin.standard_fonts_metrics.js"></script>
        <script type="text/javascript" src="js/jsPDF/jspdf.plugin.split_text_to_size.js"></script>
        <script type="text/javascript" src="js/jsPDF/jspdf.plugin.from_html.js"></script>
        <script type="text/javascript" src="js/FileSaver.js"></script>
        <script type="text/javascript" src="js/FileSaver.min.js"></script>
        <script type="text/javascript" src="js/makePDF.js"></script>
        <style type="text/css">
                body{
                    width:100%;
                }
                #out{
                    width:794px;
                    height:1123px;
                    /*margin:auto;*/
                }
                
                #target{
                    
                    width:794px;
                    height:1123px;
                    
                    background-color: red;
                    color: black;
                    
                }
                table{
                    margin:0 auto;
                    padding:100px;
                    background-color:blue;
                }
                td{
                    background-color:white;
                }
        </style>
    </head>
    <body>
        <button id="go">pdf作成!!</button>

        <iframe id="renderSpace" frameborder="0" width="450" height="450"></iframe>
        <div id="out">
            <div id="target">
                <style type="text/css">
                </style>
                    <table border="1">
                        <tr>
                            <td>ぐおおお</td>
                            <td>ぐおおお</td>
                            <td>ぐおおお</td>
                        </tr>
                        <tr>
                            <td>ぐおおお</td>
                            <td>ぐおおお</td>
                            <td>ぐおおお</td>
                        </tr>
                        <tr>
                            <td>ぐおおお</td>
                            <td>ぐおおお</td>
                            <td>ぐおおお</td>
                        </tr>
                    </table>
                </div>
            </div>
    </body>
</html>

ほい。つづきまして、javascriptの方です。

(function () {
    $("#go").click(function() {
        html2canvas(document.getElementById("target"), {
            onrendered: function (canvas) {
                var dataURI = canvas.toDataURL("image/jpeg");

                var pdf = new jsPDF();

                pdf.addImage(dataURI, 'JPEG', 0, 0);
                pdf.save('sample.pdf');
            }
        });        
    });
});

こんな感じでやってみました。

んで、実際にそれをブラウザで表示させると、こんな感じ。
諸事情ありまして、ちょっとトリミングしています。

03

ほい。んで、『pdf作成!!』のボタンを押すと、
このままのpdfが作成されるはずなのです。
というわけで、ポチッと押して作成されたpdfのスクショがこちら。
011
ふむ。いい感じです。

ところで、ブラウザでの表示を見ていただけるとわかりますが、
中心に表示されてないですよね。

というわけで、index.htmlの25行目にある、
『margin:auto;』のコメントアウトを解除してみます。
そうしてブラウザに表示されたもののスクショがこちら。
012
うし。中心に表示されました。

この状態でpdfを作成してみます。
出来上がったpdfのスクショがこちらです(`・ω・´)
02
……なんかぼやけてますね(;・∀・) なんででしょ(;・∀・)

まぁ急ぎでもないのでのんびり解決したいなと考えております。

ちなみに、今回作成したコードはこちらからダウンロード出来まっし
もろもろ参考サイトで見たコードそのまま流用させていただきました(;・∀・)

参考サイト

javascriptでPDF出力。jsPDFとかFileSaver.jsとか。

JavaScriptでページをキャプチャ

考えてみたら、Javascriptってあんま本格的に勉強したことなかったなぁ……(;・∀・)

3 thoughts on “Javascriptでスクショを撮ってpdfを生成する実験結果

  1. オオツキ

    こんにちは。
    オオツキと申します。
    こちらのスクリプトとっても便利です。
    使いたいのですが商用利用も可能でしょうか?(まだ提案段階ですが)
    よろしくお願いいたします。

    Reply
    1. 管理人 Post author

      書き込みありがとうございます!
      商用利用に関してですが、俺作のものはご利用いただいて大丈夫です!
      参考ページさまのほうも一度ご確認下さい!

      Reply

オオツキ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)