目前为止我能想到的最佳解决方案。
您需要从npm安装以下软件包
import * as jsPDF from 'jspdf';
import html2canvas from 'html2canvas';
htmltoPDF()
{
// parentdiv is the html element which has to be converted to PDF
html2canvas(document.querySelector("#parentdiv")).then(canvas => {
var pdf = new jsPDF('p', 'pt', [canvas.width, canvas.height]);
var imgData = canvas.toDataURL("image/jpeg", 1.0);
pdf.addImage(imgData,0,0,canvas.width, canvas.height);
pdf.save('converteddoc.pdf');
});
}
更新:
想到了另一个解决方案。我无法将其拆分成A4大小的页面,但我能够制作单个PDF文件。
包:
import domtoimage from 'dom-to-image';
import * as jsPDF from 'jspdf';
downloadPDF()
{
var node = document.getElementById('parentdiv');
var img;
var filename;
var newImage;
domtoimage.toPng(node, { bgcolor: '#fff' })
.then(function(dataUrl) {
img = new Image();
img.src = dataUrl;
newImage = img.src;
img.onload = function(){
var pdfWidth = img.width;
var pdfHeight = img.height;
// FileSaver.saveAs(dataUrl, 'my-pdfimage.png'); // Save as Image
var doc;
if(pdfWidth > pdfHeight)
{
doc = new jsPDF('l', 'px', [pdfWidth , pdfHeight]);
}
else
{
doc = new jsPDF('p', 'px', [pdfWidth , pdfHeight]);
}
var width = doc.internal.pageSize.getWidth();
var height = doc.internal.pageSize.getHeight();
doc.addImage(newImage, 'PNG', 10, 10, width, height);
filename = 'mypdf_' + '.pdf';
doc.save(filename);
};
})
.catch(function(error) {
// Error Handling
});
}
> npm install jspdf
> npm install html2canvas
步骤2:在app.components.ts中导入已安装的包。我没有在constructor()中导入那些包。
> import * as jspdf from 'jspdf';
> import html2canvas from 'html2canvas';
第三步:为需要导出为PDF的HTML div添加一个id。同时添加一个按钮以激活该函数。
<div id="MyDIv" style="margin-left: 45px;" class="main-container">
</div>
<div class="icon_image " title="Share As PDF" (click)="exportAsPDF('MyDIv');"><img src="assets/img/pdf.png"></div>
步骤4:编写生成PDF的代码如下
exportAsPDF(div_id)
{
let data = document.getElementById(div_id);
html2canvas(data).then(canvas => {
const contentDataURL = canvas.toDataURL('image/png')
let pdf = new jspdf('l', 'cm', 'a4'); //Generates PDF in landscape mode
// let pdf = new jspdf('p', 'cm', 'a4'); Generates PDF in portrait mode
pdf.addImage(contentDataURL, 'PNG', 0, 0, 29.7, 21.0);
pdf.save('Filename.pdf');
});
}
pdf.addImage(contentDataURL, 'PNG', 0, 0, 29.7, 21.0)
的格式是什么? - Brio Tech我在使用 html2canvas
时遇到了问题,因此不得不使用 html-to-image。我不知道为什么,但无论我尝试什么,html2canvas 都无法渲染出正确的图片。相比之下,html-to-image
让我轻松地获得了正确的渲染结果。
使用方法:
var node = <HTMLElement>document.getElementById('export');
htmlToImage.toPng(node)
.then(function (dataUrl) {
var img = new Image();
img.src = dataUrl;
var doc = new jsPDF('p', 'mm', 'a4');
const bufferX = 5;
const bufferY = 5;
const imgProps = (<any>doc).getImageProperties(img);
const pdfWidth = doc.internal.pageSize.getWidth() - 2 * bufferX;
const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
doc.addImage(img, 'PNG', bufferX, bufferY, pdfWidth, pdfHeight, undefined, 'FAST');
doc.save('Bill_'+new Date().toDateString());
})
.catch(function (error) {
console.error('oops, something went wrong!', error);
});
首先安装以下内容: 1)npm install jspdf 2)npm install html2canvas
之后导入并使用以下代码。
public captureScreen() {
const data = document.getElementById('invoice');
html2canvas(data).then(canvas => {
const imgWidth = 208;
const pageHeight = 295;
const imgHeight = canvas.height * imgWidth / canvas.width;
const heightLeft = imgHeight;
const contentDataURL = canvas.toDataURL('image/png');
const pdf = new jspdf('p', 'mm', 'a4');
const position = 0;
pdf.addImage(contentDataURL, 'PNG', 0, position, imgWidth, imgHeight);
pdf.save('invoice.pdf');
});
}
npm install jspdf jspdf-autotable
步骤2:导入已安装的包以使用
import jsPDF from 'jspdf';
import 'jspdf-autotable';
步骤三:如果您的数据包含图片,请将图片转换为Base64格式
tabledata = [{
img: 'https://i.picsum.photos/id/258/536/354.jpg',
name: 'Joseph',
domain: 'Angular 9'
},
{
img: 'https://i.picsum.photos/id/258/536/354.jpg',
name: 'Vani',
domain: 'Angular 8'
}, {
img: 'https://i.picsum.photos/id/258/536/354.jpg',
name: 'Raj',
domain: 'React.js'
},
];
convertImagetoBase64(url, callback) {
const xhr = new XMLHttpRequest();
xhr.onload = () => {
const reader = new FileReader();
reader.onloadend = () => {
callback(reader.result);
};
reader.readAsDataURL(xhr.response);
};
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
}
在将图像绑定到HTML表之前,让我们将图像URL转换为base64格式。
this.tabledata.forEach(elem => {
this.convertImagetoBase64(elem.img, (b64Img) => {
elem.img = b64Img;
});
<table id="imgTable" style=”display:none”>
<thead>
<tr><th>Name</th>
<th>Domain</th>
<th>Image</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of tabledata">
<td>{{data.name}}</td>
<td>{{data.domain}}</td>
<td><img src="{{data.img}}" width="100" height="100" /></td>
</tr>
</tbody>
</table>
<button (click)="generatePdf()">Generate Pdf</button>
app.component.ts
generatePdf(){
doc.autoTable({
html: '#imgTable',
bodyStyles: { minCellHeight: 20 },
theme: 'grid',
styles: { valign: 'middle', overflow: 'linebreak', halign: 'center', minCellHeight: 21 },
pageBreak: 'avoid',
columnStyles: {
2: { cellWidth: 22, minCellHeight: 22 },
},
headStyles: { fillColor: '#f2f2f2', textColor: '#000', fontStyle: 'bold', lineWidth: 0.5, lineColor: '#ccc' },
didDrawCell: (data) => {
if (data.column.index === 2 && data.cell.section === 'body') {
const td = data.cell.raw;
const img = td.getElementsByTagName('img')[0];
// let dim = data.cell.height - data.cell.padding('vertical');
// let textPos = data.cell.textPos;
doc.addImage(img.src, data.cell.x + 1, data.cell.y + 1, 19, 19);
}
}
});
doc.save('yourpdfname.pdf');
}
生成PDF的示例如下:
如需更多不带表格的PDF格式,请访问helperscript.com