【问题标题】:How to use jsPDF with angular 2如何在 Angular 2 中使用 jsPDF
【发布时间】:2017-05-19 22:54:15
【问题描述】:

我收到一个错误:jsPDF 未定义,我目前正在使用以下代码:

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

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

  download() {

        var doc = jsPDF();
        doc.text(20, 20, 'Hello world!');
        doc.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');    
        doc.save('Test.pdf');
    }
} 

我已经安装了 jsPDF 的 npm 但不知道如何导入 jspdf 并使用 angular-cli: 1.0.0-beta.17 运行

【问题讨论】:

    标签: angular jspdf angular2-cli


    【解决方案1】:

    我已经做到了,经过大量的研发,他们的步骤如下: 安装:

    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');
        }
    }
    

    【讨论】:

    • 如何使用 addHTML 函数做到这一点?
    • “autoTable”在“jsPDF”类型上不存在
    • 谢谢!帮了我很多!
    • @FlorisdG 自动添加到新的 jsPDF()
    • typings install dt~jspdf --global --save 是否已弃用? github.com/typings/…
    【解决方案2】:

    老问题,但这是我在我的 Angular 应用程序中启动并运行的替代解决方案。我最终修改了 this jsPDF solution 以在不使用 ionic/cordova CLI 的情况下工作。

    npm install jspdf --save
    npm install @types/jspdf --save
    npm install html2canvas --save
    npm install @types/html2canvas --save
    

    为包含要生成 PDF 的内容的任何 div 添加一个 id

    <div id="html2Pdf">your content here</div>
    

    导入库

    import * as jsPDF from 'jspdf';
    import * as html2canvas from 'html2canvas';
    

    添加生成PDF的方法

    generatePdf() {
        const div = document.getElementById("html2Pdf");
        const options = {background: "white", height: div.clientHeight, width: div.clientWidth};
    
        html2canvas(div, options).then((canvas) => {
            //Initialize JSPDF
            let doc = new jsPDF("p", "mm", "a4");
            //Converting canvas to Image
            let imgData = canvas.toDataURL("image/PNG");
            //Add image Canvas to PDF
            doc.addImage(imgData, 'PNG', 20, 20);
    
            let pdfOutput = doc.output();
            // using ArrayBuffer will allow you to put image inside PDF
            let buffer = new ArrayBuffer(pdfOutput.length);
            let array = new Uint8Array(buffer);
            for (let i = 0; i < pdfOutput.length; i++) {
                array[i] = pdfOutput.charCodeAt(i);
            }
    
            //Name of pdf
            const fileName = "example.pdf";
    
            // Make file
            doc.save(fileName);
    
        });
    }
    

    我发现这个解决方案非常适合我的 Web 应用程序,并且非常有用,因为我可以控制何时生成 PDF(在异步接收数据之后)。同样,我不需要全局安装任何库。

    【讨论】:

    • 非常简洁,为我工作,你为高分辨率 pdf 做了什么?
    • @Aarchie 这对我来说仍然是一个悬而未决的问题,也还没有回过头来。如果我找到解决方案会更新。我的猜测是这个库是有限的,我可能需要使用不同的
    【解决方案3】:

    @gsmalhotra

    的帮助下,我创建了一个基于 this answer 的 jsPdf 演示

    第一次安装

    npm install jspdf --save
    

    我使用了图像数组,首先将图像转换为base64 (jsPDF不允许图像URL)

    getBase64Image(img) {
      var canvas = document.createElement("canvas");
      console.log("image");
      canvas.width = img.width;
      canvas.height = img.height;
      var ctx = canvas.getContext("2d");
      ctx.drawImage(img, 0, 0);
      var dataURL = canvas.toDataURL("image/jpeg");
      return dataURL;
    }
    

    然后在一个循环中,我调用了返回base64图像的上述函数,然后使用doc.addImage()将图像添加到PDF。

    for(var i=0;i<this.images.length;i++){
       let imageData= this.getBase64Image(document.getElementById('img'+i));
       doc.addImage(imageData, "JPG", 10, (i+1)*10, 180, 150);
       doc.addPage();
    }
    

    HTML 代码

    <div class="col-md-4" *ngFor="let img of images;let i=index">
        <img id="img{{i}}" class="img-fluid" crossOrigin="Anonymous" [src]="img.url">
    </div>
    

    Demo
    Code

    【讨论】:

    • 嘿,很棒的编辑!感谢您接受反馈并与之合作。祝你在 StackOverflow 上好运!
    【解决方案4】:

    下面是在 Angular 11 中下载 div 的方法:

    1. 安装 npm 包:
    npm install jspdf --save
    
    1. html 中添加模板引用为:
    <div #myTemp>
       // other code here
    
      <button (click)="print()"></button>
    </div>
    
    1. xyz.component.ts中导入:
    import { jsPDF } from "jspdf";
    import html2canvas from 'html2canvas';
    
    export class XYZComponent { 
       @ViewChild('myTemp') myTempRef: ElementRef;
    
       print(){
        const DATA = this.myTempRef.nativeElement;
        html2canvas(DATA).then(canvas => {        
          let fileWidth = 200;
          let fileHeight = canvas.height * fileWidth / canvas.width;
          
          const FILEURI = canvas.toDataURL('image/png')
          let PDF = new jsPDF('p', 'mm', 'a4');
          let position = 0;
          PDF.addImage(FILEURI, 'PNG', 5, 5, fileWidth, fileHeight)      
          PDF.save('angular-demo.pdf');
        });   
       }
    }
    

    【讨论】:

      【解决方案5】:

      1.安装包

          npm install jspdf
      

      2.像follow一样导入

          import { jsPDF } from 'jspdf'
         // important! using this ES6 syntax you don't need to import the library via the script
            section in angular.json
      

      3.使用它

       // for somereadon the latest version (currenly 2.3)  words with properties 
         of type string only, even if you have dates or numbers, convert them to string first
       let data = [
         {
          id: "123032510",
          firstname: "Benzara Tahar",
          lastname: "Riad",
         },
         {
          loggedInUserId: "1233205",
          firstname: "Matouk",
          lastname: "Aymen",
         }
         ];
        let header = this.createHeaders(['ID', 'Firstname', 'Lastname']);
        let doc = new jsPDF()
        doc.table(1, 1, data, header, {})
        doc.save()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-10
        相关资源
        最近更新 更多