web-dev-qa-db-ja.com

キャンバスをPDF

JavaScriptを使用してキャンバスをPDFに直接変換することは可能ですか( pdf.js またはそのようなもの)?

Canvasからimgへ、次にimgからpdfのような別の方法がありますか?

例を挙げていただけますか?

33
Kasta

これを実現するには、 jsPDF ライブラリと toDataURL 関数を使用します。

私は少しデモをしました:

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

// draw a blue cloud
context.beginPath();
context.moveTo(170, 80);
context.bezierCurveTo(130, 100, 130, 150, 230, 150);
context.bezierCurveTo(250, 180, 320, 180, 340, 150);
context.bezierCurveTo(420, 150, 420, 120, 390, 100);
context.bezierCurveTo(430, 40, 370, 30, 340, 50);
context.bezierCurveTo(320, 5, 250, 20, 250, 50);
context.bezierCurveTo(200, 5, 150, 20, 170, 80);
context.closePath();
context.lineWidth = 5;
context.fillStyle = '#8ED6FF';
context.fill();
context.strokeStyle = '#0000ff';
context.stroke();

download.addEventListener("click", function() {
  // only jpeg is supported by jsPDF
  var imgData = canvas.toDataURL("image/jpeg", 1.0);
  var pdf = new jsPDF();

  pdf.addImage(imgData, 'JPEG', 0, 0);
  pdf.save("download.pdf");
}, false);
<script src="//cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>


<canvas id="myCanvas" width="578" height="200"></canvas>
<button id="download">download</button>
70
Fr3d

https://github.com/joshua-gould/canvas2pdf をご覧ください。このライブラリは、PDFドキュメントに画像を埋め込む他の提案されたソリューションとは異なり、キャンバス要素のPDF表現を作成します。

//Create a new PDF canvas context.
var ctx = new canvas2pdf.Context(blobStream());

//draw your canvas like you would normally
ctx.fillStyle='yellow';
ctx.fillRect(100,100,100,100);
// more canvas drawing, etc...

//convert your PDF to a Blob and save to file
ctx.stream.on('finish', function () {
    var blob = ctx.stream.toBlob('application/pdf');
    saveAs(blob, 'example.pdf', true);
});
ctx.end();
8
user1860166

より良い解決策は、剣道ui draw domを使用してPDFにエクスポートすることです。

Canvasタグを含む次のhtmlファイルを想定します。

<script src="http://kendo.cdn.telerik.com/2017.2.621/js/kendo.all.min.js"></script>

    <script type="x/kendo-template" id="page-template">
     <div class="page-template">
            <div class="header">

            </div>
            <div class="footer" style="text-align: center">

                <h2> #:pageNum# </h2>
            </div>
      </div>
    </script>
    <canvas id="myCanvas" width="500" height="500"></canvas>
    <button onclick="ExportPdf()">download</button>

その後、スクリプトで次のことを書き留めてください。

function ExportPdf(){ 
kendo.drawing
    .drawDOM("#myCanvas", 
    { 
        forcePageBreak: ".page-break", 
        paperSize: "A4",
        margin: { top: "1cm", bottom: "1cm" },
        scale: 0.8,
        height: 500, 
        template: $("#page-template").html(),
        keepTogether: ".prevent-split"
    })
        .then(function(group){
        kendo.drawing.pdf.saveAs(group, "Exported_Itinerary.pdf")
    });
}

それだけです。そのキャンバスに何かを書いて、PDFにエクスポートされたダウンロードボタンを押すだけです。 Kendo UIへのリンクはこちらです- http://docs.telerik.com/kendo-ui/framework/drawing/drawing-dom そしてブログプロセス全体をよりよく理解するために- https://www.cronj.com/blog/export-htmlcss-pdf-using-javascript/

2
Shiva Dwivedi

したがって、今日はjspdf-1.5.3です。キャンバスとまったく同じPDFファイルページを持つという質問に答えるため。さまざまな組み合わせを何度も試した後、私はあなたがこのようなことをしなければならないと考えました。まず、出力pdfファイルの高さと幅を正しい方向に設定する必要があります。そうしないと、側面が切り取られる可能性があります。次に、「pdf」ファイル自体から寸法を取得します。キャンバスの寸法を使用しようとすると、辺が再び切り取られる可能性があります。なぜそうなるのかはわかりませんが、jsPDFがライブラリ内の他のユニットの寸法を変換するのが最良の推測です。

  // Download button
  $("#download-image").on('click', function () {
    let width = __CANVAS.width; 
    let height = __CANVAS.height;

    //set the orientation
    if(width > height){
      pdf = new jsPDF('l', 'px', [width, height]);
    }
    else{
      pdf = new jsPDF('p', 'px', [height, width]);
    }
    //then we get the dimensions from the 'pdf' file itself
    width = pdf.internal.pageSize.getWidth();
    height = pdf.internal.pageSize.getHeight();
    pdf.addImage(__CANVAS, 'PNG', 0, 0,width,height);
    pdf.save("download.pdf");
  });

ここから方向の切り替えについて学習しました: https://github.com/MrRio/jsPDF/issues/476

1
Luyang Du