对于我正在处理的项目,我需要能够生成用户当前所在页面的PDF,我将使用jspdf
。由于我需要HTML
我需要生成PDF,因此我需要addHTML()
函数。有很多话题,说
您需要使用
html2canvas
或rasterizehtml
。
我选择使用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/html2canvas或https://github.com/cburgmer/rasterizeHTML.js
为什么会这样?我提供canvas
作为参数,但仍然说我需要使用html2canvas
。
答案 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
:
您需要先安装 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
});
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
});
}
请注意,在 2.xx 版本中,您不需要通过 npm 安装 html2canvas
甚至不需要包含脚本(在 angular.json 或 index.html 中),因为这是在内部动态完成的。