首页 > 解决方案 > 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 内容,我的目标是实现添加分页符。

标签: jspdfhtml2canvashtml2pdf

解决方案


我解决了将 HTML 导出为多页 PDF 的问题。我为每个 div 创建画布。也许这会对大家有所帮助。

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

推荐阅读