Jspdf和html2pdf无法处理多个页面的动态数据(pdf中超过25页),存在重叠问题



我正在尝试实现通用解决方案,因为我的html内容无法修复,我想转换html 2 pdf,但问题是页面之间被剪切,分页符无法正常工作。

//var staticHeight = 0;
//$('div').each(function () {
//    staticHeight += $(this).filter(':visible').outerHeight(true);
//    var pageHeight = 100
//    console.log(staticHeight)
//    if (staticHeight > pageHeight) {
//        $(this).after('<div class="page-break" id="activediv2"> asasjjasasa asas </div>');
//        staticHeight = 0;
//    }
//});
//return html2canvas(document.getElementsByClassName('custom-content')[0], {
//    onrendered: function (canvasObj) {
//        startPrintProcess(canvasObj, 'printedPDF', function () {
//            alert('PDF saved');
//        });
//        //save this object to the pdf
//    }
//});
//return html2canvas($(element)[0], {
//    background: "#ffffff",
//    onrendered: function (canvas) {
//        var myImage = canvas.toDataURL("image/jpeg,1.0");
//        // Adjust width and height
//        var imgWidth = (canvas.width * 60) / 247;
//        var imgHeight = (canvas.height * 70) / 247;
//        // jspdf changes
//        var pdf = new jsPDF('l', 'mm', 'a4');
//        pdf.addImage(myImage, 'png', 15, 2, imgWidth, imgHeight); // 2: 19
//        pdf.save('sample.pdf');
//    }
//});
var HTML_Width = $(element).width();
var HTML_Height = $(element).height();
var top_left_margin = 15;
var PDF_Width = HTML_Width + (top_left_margin * 2);
var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
var canvas_image_width = HTML_Width;
var canvas_image_height = HTML_Height;
pdf = "";
html2canvas(element, {
background: '#FFFFFF',
onclone: function (doc) {
hiddenDiv = document.getElementsByClassName('custom-content')[0];
hiddenDiv.style.display = 'block';
},
onrendered: function (canvas) {
var width = canvas.width;
var height = canvas.height;
var millimeters = {};
millimeters.width = Math.floor(width * 0.274583);
millimeters.height = Math.floor(height * 0.274583);
var context = canvas.getContext('2d');
context.scale(2, 2);
var imgData = canvas.toDataURL('image/png');
var doc = new jsPDF("l", "mm", "a4");
//   doc.deletePage(1);
//    doc.addPage(millimeters.width, millimeters.height);
//doc.addImage(imgData, 'PNG', 0, 0, width, height);
//doc.save('wardrobemodel.pdf');
var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;
for (var i = 0; i <= totalPDFPages; i++) {
doc.addPage(PDF_Width, PDF_Height);
doc.addImage(imgData, 'JPG', 0, -(PDF_Height * i) + (top_left_margin * 4), canvas_image_width, canvas_image_height);
}
doc.save('wardrobemodel.pdf');
}
});

//var worker = html2pdf().from(element).toPdf();
////for (let i = 0; i < pages.length; i++) {
////    worker = worker.set(opt).from(pages[i]).toContainer().toCanvas().toPdf().get('pdf').then((pdf) => {
////        if (i < pages.length - 1) { // Bump cursor ahead to new page until on last page
////            pdf.addPage();
////        }
////    });
////}
//worker = worker.save();
//$('.tile-body').find('div').each(function () {
//    var eleHeight = $(this).filter(':visible').outerHeight(true);
//    staticHeight += pix2mm(eleHeight, 300);
//    var pageHeight = 257
//    console.log(staticHeight)
//    if (staticHeight > pageHeight) {
//        $(this).after('<div class="page-break mt-1 mb-1" id="activediv2"></div>');
//        staticHeight = 0;
//    }
//});
return html2canvas(element, {
onrendered: function (canvasObj) {
startPrintProcess(canvasObj, 'printedPDF', function () {
alert('PDF saved');
});
//save this object to the pdf
}
});

//$('.tile-body').children('div').each(function () {
//    var eleHeight = $(this).filter(':visible').outerHeight(true);
//    staticHeight += pix2mm(eleHeight, 300);
//    var pageHeight = 257
//    console.log(staticHeight)
//    if (staticHeight > pageHeight) {
//        $(this).after('<div class="page-break mt-3 mb-5" id="activediv2"></div>');
//        staticHeight = 0;
//    }
//});
staticHeight = 0;

//var opt = {
//    margin: 0.25,
//    filename: 'ontract.pdf',
//    image: { type: 'jpeg', quality: 0.98 },
//    html2canvas: { scale: 2 },
//    jsPDF: { unit: 'mm', format: 'a4', orientation: 'landscape' },
//    pagebreak: { mode: 'avoid-all', after: '#activediv2' }
//};
//var worker = html2pdf().from(element).toPdf();
//worker.save();
//  html2pdf().from(element).set(opt).toPdf().get('pdf').save()
//  return;
//html2canvas(element, {
//    logging: false
//}).then(function (canvas) {
//    var pdf = new jsPDF('l', 'mm', 'a4');//A4 paper, portrait
//    /// pdf.internal.scaleFactor = 30;
//    var ctx = canvas.getContext('2d'),
//        a4w = 190, a4h = 257,//A4 size, 210mm x 297mm, 10 mm margin on each side, display area 190x277
//        imgHeight = Math.floor(a4h * canvas.width / a4w),//Convert pixel height of one page image to A4 display scale
//        renderedHeight = 0;
//    var pdfConf = {
//        pagesplit: true,
//        pagebreak: { mode: 'avoid-all', before: '#activediv2' }
//    };
//    var logo = document.getElementsByClassName(".logo-img")[0];//Icon placed in header
//    while (renderedHeight < canvas.height) {
//        var page = document.createElement("canvas");
//        page.width = canvas.width;
//        page.height = Math.min(imgHeight, canvas.height - renderedHeight);//Maybe less than one page
//        //Trim the specified area with getImageData and draw it into the canvas object created earlier
//        page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
//        //Add an image to the page with a 10 mm / 20 mm margin
//        pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 20, a4w, Math.min(a4h, a4w * page.height / page.width));
//        //Add header logo
//        //   pdf.addImage(logo, 'SVG', 5, 3);
//        var context = page.getContext('2d');
//        context.scale(2, 2);
//        //pdf.addHTML(element, { pagesplit: true, canvas: page }, function () {
//        //    // var out = pdf.output('dataurlnewwindow'); // crashed if bigger file
//        //    pdf.save('two-by-four.pdf')
//        //});
//        renderedHeight += imgHeight;
//        if (renderedHeight < canvas.height)
//            pdf.addPage();//Add an empty page if there is more to follow
//        delete page;
//    }
//    pdf.save('content.pdf');
//});
//return;
//var HTML_Width = $(element).width();
//var HTML_Height = $(element).height();
//var top_left_margin = 15;
//var PDF_Width = HTML_Width + (top_left_margin * 2);
//var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
//var canvas_image_width = HTML_Width;
//var canvas_image_height = HTML_Height;
//var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;


//html2canvas($(element)[0], { allowTaint: true }).then(function (canvas) {
//    var context = canvas.getContext('2d');
//    context.scale(2, 2);
//    console.log(canvas.height + "  " + canvas.width);

//    var imgData = canvas.toDataURL("image/jpeg", 1.0);
//    var pdf = new jsPDF('l', 'pt', [PDF_Width, PDF_Height]);
//    pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);
//    for (var i = 1; i <= totalPDFPages; i++) {
//        pdf.addPage(PDF_Width, PDF_Height);
//        pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height * i) + (top_left_margin * 4), canvas_image_width, canvas_image_height);
//    }
//    pdf.save("HTML-Document.pdf");
//});
//return;
///

//html2canvas($(element)[0], { allowTaint: true }).then(function (canvas) {
//    calculatePDF_height_width(".print-wrap", 1);
//    var imgData = canvas.toDataURL("image/png", 1.0);
//    pdf.addPage(PDF_Width, PDF_Height);
//    pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, HTML_Width, HTML_Height);
//    pdf.save("11.pdf")
//});
div {
page-break-inside: avoid;
}

这就是我尝试的

简而言之,如果生成的pdf在两个页面之间破坏html内容,我的目标是实现添加页面中断。

我解决了将HTML导出为多页PDF的问题。我为每个潜水器创建画布。也许这对你们所有人都有帮助。

private canvas: any = {
monthYearCanvas: null,
monthYearHeight: 0,
periodCanvas: null,
periodHeight: 0,
assetCanvas: null,
assetHeight: 0,
badActorCanvas: null,
badActorHeight: 0,
eventCanvas: null,
eventHeight: 0,
tenLowOffCanvas: null,
tenLowOffHeight: 0,
};
public triggerPrintReport(): void {
if (
this.isLoadingMonthYear ||
this.isLoadingOnPeriod ||
this.isLoadingOnAsset ||
this.isLoadingOnBadActor ||
this.isLoadingOnEvent ||
this.isLoadingTenLowOff
) {
alert('Wait for load data');
return;
}

this.messageReport = true;

const monthYearHTML = document.getElementById('htmlData-monthYear');
const periodHTML = document.getElementById('htmlData-period');
const assetHTML = document.getElementById('htmlData-asset');
const badActorHTML = document.getElementById('htmlData-badActor');
const eventHTML = document.getElementById('htmlData-event');
const tenLowOffHTML = document.getElementById('htmlData-tenLowOff');

this.createCanvasURL(monthYearHTML, 'monthYear');
this.createCanvasURL(periodHTML, 'period');
this.createCanvasURL(assetHTML, 'asset');
this.createCanvasURL(badActorHTML, 'badActor');
this.createCanvasURL(eventHTML, 'event');
this.createCanvasURL(tenLowOffHTML, 'tenLowOff');
}

private createCanvasURL(element: any, type: string): void {
html2canvas(element).then(canvas => {
const width = 208;

if (type === 'monthYear') {
this.canvas.monthYearHeight = canvas.height * width / canvas.width;
this.canvas.monthYearCanvas = canvas.toDataURL('image/png');
} else if (type === 'period') {
this.canvas.periodHeight = canvas.height * width / canvas.width;
this.canvas.periodCanvas = canvas.toDataURL('image/png');
} else if (type === 'asset') {
this.canvas.assetHeight = canvas.height * width / canvas.width;
this.canvas.assetCanvas = canvas.toDataURL('image/png');
} else if (type === 'badActor') {
this.canvas.badActorHeight = canvas.height * width / canvas.width;
this.canvas.badActorCanvas = canvas.toDataURL('image/png');
} else if (type === 'event') {
this.canvas.eventHeight = canvas.height * width / canvas.width;
this.canvas.eventCanvas = canvas.toDataURL('image/png');
} else if (type === 'tenLowOff') {
this.canvas.tenLowOffHeight = canvas.height * width / canvas.width;
this.canvas.tenLowOffCanvas = canvas.toDataURL('image/png');
}

this.exportPDF();
});
}

private exportPDF(): void {
const PDF = new jsPDF('p', 'mm', 'a4');

if (
this.canvas.monthYearCanvas &&
this.canvas.periodCanvas &&
this.canvas.assetCanvas &&
this.canvas.badActorCanvas &&
this.canvas.badActorCanvas &&
this.canvas.tenLowOffCanvas
) {
PDF.addImage(this.canvas.monthYearCanvas, 'PNG', 1, 10, 208, this.canvas.monthYearHeight);
PDF.addImage(this.canvas.periodCanvas, 'PNG', 1, 125, 208, this.canvas.periodHeight);
PDF.addPage();
PDF.addImage(this.canvas.assetCanvas, 'PNG', 1, 10, 208, this.canvas.assetHeight);
PDF.addPage();
PDF.addImage(this.canvas.badActorCanvas, 'PNG', 1, 10, 208, this.canvas.badActorHeight);
PDF.addPage();
PDF.addImage(this.canvas.eventCanvas, 'PNG', 1, 10, 208, this.canvas.eventHeight);
PDF.addPage('l');
PDF.addImage(this.canvas.tenLowOffCanvas, 'PNG', 1, 10, 208, this.canvas.tenLowOffHeight);

this.messageReport = false;

PDF.save('angular-demo.pdf');
}
}

最新更新