Multipage 带HTML渲染器的jsPDF多页PDF
我在我的站点中使用jsPDF生成PDF。但现在我有多个div要在一个PDF中打印。这可能需要2到3页 例如:Multipage 带HTML渲染器的jsPDF多页PDF,multipage,jspdf,Multipage,Jspdf,我在我的站点中使用jsPDF生成PDF。但现在我有多个div要在一个PDF中打印。这可能需要2到3页 例如: 内容 内容 内容 我的JS代码 这是可行的,但并不像我预期的那样,它添加了一部分内容(不能包含在多个页面中) 它删除了诸如br、h1等html标记 函数formtoPDF(){ jsPDF.API.mymethod=函数(){ //“this”将引用到内部API对象。请参阅jsPDF源代码 //,因此您可以参考以下内置方法: //这一行(……) //本文件(……) }; var
内容
内容
内容
我的JS代码
- 这是可行的,但并不像我预期的那样,它添加了一部分内容(不能包含在多个页面中)
- 它删除了诸如br、h1等html标记
函数formtoPDF(){
jsPDF.API.mymethod=函数(){
//“this”将引用到内部API对象。请参阅jsPDF源代码
//,因此您可以参考以下内置方法:
//这一行(……)
//本文件(……)
};
var doc=new jsPDF();
doc.mymethod();
var pdfPart1=jQuery('#genPDFpart1');
var pdfPart2=jQuery(“.ltineral”);
var pdfPart3=jQuery(“domElementHTML”);
变量specialElementHandlers={
“#loadVar”:函数(元素、渲染器){
返回true;
}
};
doc.fromHTML(pdfPart1.html()+pdfPart3.html()+pdfPart3.html(),15,15{
“宽度”:170,
“elementHandlers”:specialElementHandlers
});
文件输出('save','Download.pdf');
}
能给我一个解决办法吗。提前感谢各位朋友。我也有同样的工作问题。在MrRio github中搜索时,我发现: 基本上,在添加新内容之前,您必须检查实际页面大小
doc = new jsPdf();
...
pageHeight= doc.internal.pageSize.height;
// Before adding new content
y = 500 // Height position of new content
if (y >= pageHeight)
{
doc.addPage();
y = 0 // Restart height position
}
doc.text(x, y, "value");
下面是我的代码,但问题是文档没有拆分以在新页面中显示文档的其他部分 请改进此代码
<script type='text/javascript'>
$(document).on("click", "#btnExportToPDF", function () {
var table1 =
tableToJson($('#table1')[0]),
cellWidth =42,
rowCount = 0,
cellContents,
leftMargin = 2,
topMargin = 12,
topMarginTable =5,
headerRowHeight = 13,
rowHeight = 12,
l = {
orientation: 'p',
unit: 'mm',
format: 'a3',
compress: true,
fontSize: 11,
lineHeight: 1,
autoSize: false,
printHeaders: true
};
var doc = new jsPDF(l,'pt', 'letter');
doc.setProperties({
title: 'Test PDF Document',
subject: 'This is the subject',
author: 'author',
keywords: 'generated, javascript, web 2.0, ajax',
creator: 'author'
});
doc.cellInitialize();
$.each(table1, function (i, row)
{
rowCount++;
$.each(row, function (j, cellContent) {
if (rowCount == 1) {
doc.margins = 1;
doc.setFont("Times New Roman");
doc.setFontType("bold");
doc.setFontSize(11);
doc.cell(leftMargin, topMargin, cellWidth, headerRowHeight, cellContent, i)
}
else if (rowCount == 2) {
doc.margins = 1;
doc.setFont("Times ");
doc.setFontType("normal");
// or for normal font type use ------ doc.setFontType("normal");
doc.setFontSize(11);
doc.cell(leftMargin, topMargin, cellWidth, rowHeight, cellContent, i);
}
else {
doc.margins = 1;
doc.setFont("Times ");
doc.setFontType("normal ");
doc.setFontSize(11);
doc.cell(leftMargin, topMargin, cellWidth, rowHeight, cellContent, i);
// 1st=left margin 2nd parameter=top margin, 3rd=row cell width 4th=Row height
}
})
})
doc.save('sample Report.pdf');
});
function tableToJson(table) {
var data = [];
// first row needs to be headers
var headers = [];
for (var i=0; i<table.rows[0].cells.length; i++) {
headers[i] = table.rows[0].cells[i].innerHTML.toLowerCase().replace(/ /gi,'');
}
// go through cells
for (var i=1; i<table.rows.length; i++) {
var tableRow = table.rows[i];
var rowData = {};
for (var j=0; j<tableRow.cells.length; j++) {
rowData[ headers[j] ] = tableRow.cells[j].innerHTML;
}
data.push(rowData);
}
return data;
}
</script>
$(文档)。在(“单击”上,“#btnExportToPDF”,函数(){
var表1=
tableToJson($('#table1')[0]),
单元宽度=42,
行计数=0,
细胞内容物,
leftMargin=2,
topMargin=12,
topMarginTable=5,
headerRowHeight=13,
行高=12,
l={
方向:“p”,
单位:毫米,
格式:“a3”,
是的,
尺寸:11,
线宽:1,
自动调整大小:false,
打印头:true
};
var doc=新的jsPDF(l,'pt,'letter');
doc.setProperties({
标题:“测试PDF文档”,
主题:“这就是主题”,
作者:'作者',
关键词:“生成的、javascript、web 2.0、ajax”,
创建者:“作者”
});
doc.cellInitialize();
$。每个(表1,函数(i,行)
{
行计数++;
$.each(行,函数(j,cellContent){
如果(行计数==1){
单据页边距=1;
setFont文件(“新罗马时代”);
文件setFontType(“粗体”);
文件setFontSize(11);
文档单元格(左边距、上边距、单元格宽度、标题宽度、单元格内容、i)
}
else if(rowCount==2){
单据页边距=1;
setFont文件(“时代”);
文件setFontType(“正常”);
//或用于正常字体类型使用------doc.setFontType(“正常”);
文件setFontSize(11);
文档单元格(左边距、上边距、单元格宽度、行高、单元格内容、i);
}
否则{
单据页边距=1;
setFont文件(“时代”);
文件setFontType(“正常”);
文件setFontSize(11);
文档单元格(左边距、上边距、单元格宽度、行高、单元格内容、i);
//第一个=左边距第二个参数=上边距,第三个=行单元格宽度第四个=行高度
}
})
})
doc.save('sample Report.pdf');
});
函数tableToJson(表){
var数据=[];
//第一行必须是标题
var头=[];
对于(var i=0;i您可以同时使用plugin和jsPDF。处理顺序:
html到png和png到pdf
示例代码:
jQuery('#part1').html2canvas({
onrendered: function( canvas ) {
var img1 = canvas.toDataURL('image/png');
}
});
jQuery('#part2').html2canvas({
onrendered: function( canvas ) {
var img2 = canvas.toDataURL('image/png');
}
});
jQuery('#part3').html2canvas({
onrendered: function( canvas ) {
var img3 = canvas.toDataURL('image/png');
}
});
var doc = new jsPDF('p', 'mm');
doc.addImage( img1, 'PNG', 0, 0, 210, 297); // A4 sizes
doc.addImage( img2, 'PNG', 0, 90, 210, 297); // img1 and img2 on first page
doc.addPage();
doc.addImage( img3, 'PNG', 0, 0, 210, 297); // img3 on second page
doc.save("file.pdf");
自动不将数据拆分为多页。您可以手动拆分
如果您的(行数*行高)>420mm(A3高度,单位为mm),请添加新的页面功能。(抱歉,我无法在不运行的情况下编辑您的代码)
添加新页面左边距后,topMargin=0;(重新开始)
我在你的代码中添加了示例代码。我希望它是正确的
else {
doc.margins = 1;
doc.setFont("Times ");
doc.setFontType("normal ");
doc.setFontSize(11);
if ( rowCount * rowHeight > 420 ) {
doc.addPage();
rowCount = 3; // skip 1 and 2 above
} else {
// now rowcount = 3 ( top of new page for 3 )
// j is your x axis cell index ( j start from 0 on $.each function ) or you can add cellCount like rowCount and replace with
// rowcount is your y axis cell index
left = ( ( j ) * ( cellWidth + leftMargin );
top = ( ( rowcount - 3 ) * ( rowHeight + topMargin );
doc.cell( leftMargin, top, cellWidth, rowHeight, cellContent, i);
// 1st=left margin 2nd parameter=top margin, 3rd=row cell width 4th=Row height
}
}
您可以直接将html无损地转换为pdf。下面是一个使用html2canvas和jspdf的示例,尽管如何生成画布并不重要——我们将使用画布的高度作为for循环
的断点,在该循环中创建一个新页面并向其添加内容
在for循环之后,将保存pdf
function makePDF() {
var quotes = document.getElementById('container-fluid');
html2canvas(quotes)
.then((canvas) => {
//! MAKE YOUR PDF
var pdf = new jsPDF('p', 'pt', 'letter');
for (var i = 0; i <= quotes.clientHeight/980; i++) {
//! This is all just html2canvas stuff
var srcImg = canvas;
var sX = 0;
var sY = 980*i; // start 980 pixels down for every new page
var sWidth = 900;
var sHeight = 980;
var dX = 0;
var dY = 0;
var dWidth = 900;
var dHeight = 980;
window.onePageCanvas = document.createElement("canvas");
onePageCanvas.setAttribute('width', 900);
onePageCanvas.setAttribute('height', 980);
var ctx = onePageCanvas.getContext('2d');
// details on this usage of this function:
// https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Using_images#Slicing
ctx.drawImage(srcImg,sX,sY,sWidth,sHeight,dX,dY,dWidth,dHeight);
// document.body.appendChild(canvas);
var canvasDataURL = onePageCanvas.toDataURL("image/png", 1.0);
var width = onePageCanvas.width;
var height = onePageCanvas.clientHeight;
//! If we're on anything other than the first page,
// add another page
if (i > 0) {
pdf.addPage(612, 791); //8.5" x 11" in pts (in*72)
}
//! now we declare that we're working on that page
pdf.setPage(i+1);
//! now we add content to that page!
pdf.addImage(canvasDataURL, 'PNG', 20, 40, (width*.62), (height*.62));
}
//! after the for loop is finished running, we save the pdf.
pdf.save('Test.pdf');
}
});
}
函数makePDF(){
var quotes=document.getElementById('container-fluid');
html2canvas(引用)
.然后((画布)=>{
//!制作你的PDF
var pdf=新的jsPDF(“p”、“pt”、“字母”);
对于(var i=0;i我在本页找到了解决方案:
来自用户:王志轩
我在这里复制解决方案:
//假设您的图片已经在画布中
var imgData = canvas.toDataURL('image/png');
/*
Here are the numbers (paper width and height) that I found to work.
It still creates a little overlap part between the pages, but good enough for me.
if you can find an official number from jsPDF, use them.
*/
var imgWidth = 210;
var pageHeight = 295;
var imgHeight = canvas.height * imgWidth / canvas.width;
var heightLeft = imgHeight;
var doc = new jsPDF('p', 'mm');
var position = 0;
doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;
while (heightLeft >= 0) {
position = heightLeft - imgHeight;
doc.addPage();
doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;
}
doc.save( 'file.pdf');
这是我第一篇只支持一页的文章
现在,第二个将支持多个页面。
html2canvas(元素[0]{
onrendered:函数(画布){
pages=Math.ceil(元素[0].clientHeight/1450);
对于(i=0;i=0){
pdf.addPage();
}
srcImg=画布;
sX=0;
sY=1450*i;
sWidth=1100;
sHeight=1450;
dX=0;
dY=0;
dWidth=1100;
dHeight=1450;
window.onePageCanvas=document.createElement(“画布”);
onePageCanvas.setAttribute('width',1100);
onePageCanvas.setAttribute('height',1450);
ctx=一页
html2canvas(element[0], {
onrendered: function (canvas) {
pages = Math.ceil(element[0].clientHeight / 1450);
for (i = 0; i <= pages; i += 1) {
if (i > 0) {
pdf.addPage();
}
srcImg = canvas;
sX = 0;
sY = 1450 * i;
sWidth = 1100;
sHeight = 1450;
dX = 0;
dY = 0;
dWidth = 1100;
dHeight = 1450;
window.onePageCanvas = document.createElement("canvas");
onePageCanvas.setAttribute('width', 1100);
onePageCanvas.setAttribute('height', 1450);
ctx = onePageCanvas.getContext('2d');
ctx.drawImage(srcImg, sX, sY, sWidth, sHeight, dX, dY, dWidth, dHeight);
canvasDataURL = onePageCanvas.toDataURL("image/png");
width = onePageCanvas.width;
height = onePageCanvas.clientHeight;
pdf.setPage(i + 1);
pdf.addImage(canvasDataURL, 'PNG', 35, 30, (width * 0.5), (height * 0.5));
}
pdf.save('testfilename.pdf');
}
});
$( document ).ready(function() {
$('#cmd').click(function() {
var options = {
pagesplit: true //include this in your code
};
var pdf = new jsPDF('p', 'pt', 'a4');
pdf.addHTML($("#pdfContent"), 15, 15, options, function() {
pdf.save('Menu.pdf');
});
});
});
var a = 0;
var d;
var increment;
for(n in array){
d = a++;
if(n % 6 === 0 && n != 0){
doc.addPage();
a = 1;
d = 0;
}
increment = d == 0 ? 10 : 50;
size = (d * increment) <= 0 ? 10 : d * increment;
doc.text(array[n], 10, size);
}
var doc = new jsPDF('p', 'mm');
var imgData = canvas.toDataURL('image/png');
var pageHeight= doc.internal.pageSize.getHeight();
var pageWidth= doc.internal.pageSize.getWidth();
var imgheight = $('divName').height() * 25.4 / 96; //px to mm
var pagecount = Math.ceil(imgheight / pageHeight);
/* add initial page */
doc.addPage('l','mm','a4');
doc.addImage(imgData, 'PNG', 2, 0, pageWidth-4, 0);
/* add extra pages if the div size is larger than a a4 size */
if (pagecount > 0) {
var j = 1;
while (j != pagecount) {
doc.addPage('l','mm','a4');
doc.addImage(imgData, 'PNG', 2, -(j * pageHeight), pageWidth-4, 0);
j++;
}
}