
[code]

    <body>
        <canvas width="500px" height="2000px"></canvas>
        <script>
            var canvas = document.querySelector('canvas')
            var ctx = canvas.getContext('2d')
            ctx.fillStyle = "rgb(200, 0, 0)"
            ctx.fillRect(0, 0, 100, 100)
            ctx.fillRect(400, 0, 100, 100)
            ctx.fillRect(0, 1000, 100, 100)
        </script>
    </body>
    
[/code]

上記のhtmlでは、縦2000px、横500pxのcanvasを表示しています。  
これを印刷すると、ブラウザによって挙動が違います。

  * Google Chrome(40.0.2214.115) 2ページ目が印刷される。下端の四角は次のページに表示
  * Firefox(35.0.1) 2ページ目が印刷されない。下の四角は表示されない

FirefoxでChromeのように、画像のはみ出した部分を次ページに印刷する方法はありませんか？


CC BY-SA 3.0
2015-03-02T01:41:05.447
7301
2015-09-09T00:15:49.317
2015-09-08T02:25:51.350
10455
2325
question
html firefox
Firefoxで画像のはみ出した部分を次のページに印刷するには？


複数の`canvas`に画像を分ければ、この問題を回避できます：

[code]

    <head>
        <style type="text/css" media="screen">
            div#insatsu {display: none;}
        </style>
        <style type="text/css" media="print">
            canvas#displayCanvas {display: none;}
        </style>
    </head>
    
    <body>
        <canvas id="displayCanvas" width="500" height="2000"></canvas>
    
        <div id="insatsu"></div>
    
        <script>
            var canvas = document.querySelector('canvas'),
                ctx = canvas.getContext('2d');
    
            ctx.fillStyle = "rgb(200, 0, 0)";
            ctx.fillRect(0, 0, 100, 100);
            ctx.fillRect(400, 0, 100, 100);
            ctx.fillRect(0, 1000, 100, 100);
    
            function createSplitCanvases(canvas, ctx, insatsu) {
                var y = 0,
                    SPLIT_Y = 150;
    
                insatsu.innerHTML = '';
    
                while (y <= canvas.height) {
                    var printCanvas = document.createElement('canvas');
    
                    printCanvas.height = SPLIT_Y < (canvas.height-y) ? SPLIT_Y : (canvas.height-y);
                    printCanvas.width = canvas.width;
                    insatsu.appendChild(printCanvas);
                    insatsu.appendChild(document.createElement('br'));
                    var ctx2 = printCanvas.getContext('2d');
    
                    ctx2.putImageData(ctx.getImageData(
                        0, y,
                        canvas.width,
                        (y+SPLIT_Y) > canvas.height ? canvas.height : (y+SPLIT_Y)
                    ), 0, 0);
                    y += SPLIT_Y;
                }
            }
    
            createSplitCanvases(
                canvas,
                ctx,
                document.querySelector('#insatsu')
            );
        </script>
    </body>
    
[/code]

もちろん、あまり良くない解決策ですが、私の知っている限りでは、Firefoxでは他の方法はないです。`img`という要素を使えば、同じ問題が起こるようです。どなたかより良い方法を知れば是非投稿して下さい。


CC BY-SA 3.0
2015-09-09T00:15:49.317
16404
2015-09-09T00:15:49.317
11003
7301
answer