Angular2 - 使用jspdf从HTML生成pdf

时间:2017-04-07 11:21:54

标签: angular pdf typescript jspdf html2canvas

对于我正在处理的项目,我需要能够生成用户当前所在页面的PDF,我将使用jspdf。由于我需要HTML我需要生成PDF,因此我需要addHTML()函数。有很多话题,说

  

您需要使用html2canvasrasterizehtml

我选择使用html2canvas。这就是我的代码目前的样子:

import { Injectable, ElementRef, ViewChild } from '@angular/core';
import * as jsPDF from 'jspdf';
import * as d3 from 'd3';
import * as html2canvas from 'html2canvas';

@Injectable ()
export class pdfGeneratorService {

  @ViewChild('to-pdf') element: ElementRef;

  GeneratePDF () {
    html2canvas(this.element.nativeElement, <Html2Canvas.Html2CanvasOptions>{
      onrendered: function(canvas: HTMLCanvasElement) {
        var pdf = new jsPDF('p','pt','a4');

        pdf.addHTML(canvas, function() {
          pdf.save('web.pdf');
        });
      }
    });
  }
}

调用此函数时,出现控制台错误:

  

EXCEPTION:./AppComponent类中的错误AppComponent - 内联模板:3:4导致:您需要https://github.com/niklasvh/html2canvashttps://github.com/cburgmer/rasterizeHTML.js

为什么会这样?我提供canvas作为参数,但仍然说我需要使用html2canvas

6 个答案:

答案 0 :(得分:16)

我发现的工作是添加:

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>

到index.html文件(可能在其他地方)。

然后我用了:

const elementToPrint = document.getElementById('foo'); //The html element to become a pdf
const pdf = new jsPDF('p', 'pt', 'a4');
pdf.addHTML(elementToPrint, () => {
    doc.save('web.pdf');
});

在代码中不再使用html2canvas 然后,您可以删除以下导入:

import * as html2canvas from 'html2canvas';

答案 1 :(得分:7)

万一有人不想使用cdn脚本并且想使用更多(角度)方式,这在Angular 6中对我有用:

使用这种方式将为您提供更好的支持和编辑器中的自动完成功能,并且可以帮助您避免依赖于cdn脚本(如果您想像我一样避免使用它们)

基于excellent answer here,由于我很难找到答案,因此我重新共享其中的内容并帮助我在Angular 6中使用jsPDF(所有功劳归于这个答案)

您应该运行以下cmds:

npm install jspdf --save

typings install dt~jspdf --global --save

npm install @types/jspdf --save

在angular-cli.json中添加以下内容:

"scripts": [ "../node_modules/jspdf/dist/jspdf.min.js" ]

html:

<button (click)="download()">download </button>

组件ts:

import { Component, OnInit, Inject } from '@angular/core';
import * as jsPDF from 'jspdf'
@Component({
  ...
  providers: [
    { provide: 'Window',  useValue: window }
  ]
})
export class GenratePdfComponent implements OnInit {

  constructor(
    @Inject('Window') private window: Window,
    ) { }

  download() {

        var doc = new jsPDF();
        doc.text(20, 20, 'Hello world!');
        doc.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');
        doc.addPage();
        doc.text(20, 20, 'Do you like that?');

        // Save the PDF
        doc.save('Test.pdf');
    }
}

答案 2 :(得分:3)

任何人仍然试图将Html div转换为pdf可以选择使用html2pdf,只需几行就可以轻松完成所有操作。

var element = document.getElementById('element-to-print');
html2pdf(element);

答案 3 :(得分:2)

试试这样:

GeneratePDF () {
    html2canvas(this.element.nativeElement, <Html2Canvas.Html2CanvasOptions>{
      onrendered: function(canvas: HTMLCanvasElement) {
        var pdf = new jsPDF('p','pt','a4');    
        var img = canvas.toDataURL("image/png");
        pdf.addImage(img, 'PNG', 10, 10, 580, 300);
        pdf.save('web.pdf');
      }
    });
  }

答案 4 :(得分:0)

使用这种方式stackblitz example

import {jsPDF} from 'jspdf';

@ViewChild('content', {static: false}) content: ElementRef;


public downloadPDF() {
   const doc = new jsPDF();

   const specialElementHandlers = {
      '#editor': function (element, renderer) {
       return true;
       }
   };

   const content = this.content.nativeElement;

   doc.fromHTML(content.innerHTML, 15, 15, {
      width: 190,
     'elementHandlers': specialElementHandlers
   });

   doc.save('fileName.pdf');
}

答案 5 :(得分:0)

对于这个问题的新手,提示是你应该注意你使用的是什么版本的jspdf

1.xx:

您需要先安装 html2canvas

   npm install html2canvas

然后将其添加到 angular.json

中的脚本部分
//.angular.json  
 "scripts": [ 
               // make sure you have the correct path 
               "node_modules/html2canvas/dist/html2canvas.min.js"
            ]  
   // let data = this.htmlData.nativeElement; if you use it with @ViewChild('htmlData') 
    htmlData:ElementRef;
    let data = document.body;
    html2canvas(data).then(canvas => {
    // Few necessary setting options
    const imgWidth = 208;
    const pageHeight = 295;
    const imgHeight = canvas.height * imgWidth / canvas.width;
    const heightLeft = imgHeight;

    const contentDataURL = canvas.toDataURL('image/png')
    let pdf = new jspdf('p', 'mm', 'a4'); // A4 size page of PDF
    var position = 0;
    pdf.addImage(contentDataURL, 'PNG', 0, position, imgWidth, imgHeight)
    pdf.save('new-file.pdf'); // Generated PDF
    });

2.xx:

1.xx 和 2.xx 之间有几个重大变化:

<块引用>

删除了之前标记为已弃用的 API。即:addHTML、fromHTML、html2pdf、addSvg、addButton、addTextField、addChoiceField、cellInitialize、setFontStyle、setFontType、clip_fixed。

所以之前的代码变成:

 // let data = this.htmlData.nativeElement; if you use it with @ViewChild('htmlData') 
 htmlData:ElementRef;
 let data = document.body;
    let options : any = {
      orientation: 'p',
      unit: 'px',
      format: 'a0',
      };
    let doc = new jsPDF(options);
     doc.html(data.innerHTML, {
      callback: function (doc) {
            doc.save("angular-demo.pdf");
          },
      margin:15,
      x: 10,
      y: 10
    });
  }

demo

请注意,在 2.xx 版本中,您不需要通过 npm 安装 html2canvas 甚至不需要包含脚本(在 angular.json 或 index.html 中),因为这是在内部动态完成的。