Сделайте более аккуратную таблицу и проблему стиля в jspdf

#html #jquery #html-table #jspdf #html2canvas

Вопрос:

У меня есть какой-то div на моей html-странице, я хочу сделать его в формате pdf. Это страница с несколькими таблицами, и каждый заголовок / таблица начинаются на новой странице.

Тот, который я использую, — это jspdf, и я уже достиг своей цели-начать новую страницу на основе класса div. Код, который я пробую, вот этот :

https://plnkr.co/edit/DmNuINbijP1tu4cW

   $('#printbutton').on("click", function () { 

  var pdf = new jsPDF('landscape');
 //  var pdf = new jsPDF('p','pt','a4');
   var pdfName = 'test.pdf';
var imagesToResize = document.getElementsByTagName("img");
 for(i=0;i<imagesToResize.length;i  ){
   imagesToResize[i].style.width = "100px";
   imagesToResize[i].style.height = "100px";
 }
    var options = {   pagesplit: true};

    var $divs = $('.myDivClass')   
  //jQuery object of all the myDivClass divs
    var numRecursionsNeeded = $divs.length -1;     //the number of times we need to call addHtml (once per div)
    var currentRecursion=0;
                  
    //Found a trick for using addHtml more than once per pdf. Call addHtml in the callback function of addHtml recursively.
    function recursiveAddHtmlAndSave(currentRecursion, totalRecursions){
        //Once we have done all the divs save the pdf
        if(currentRecursion==totalRecursions){
            pdf.save(pdfName);
        }else{
             currentRecursion  ;
            pdf.addPage();
            //$('.myDivClass')[currentRecursion] selects one of the divs out of the jquery collection as a html element
            //addHtml requires an html element. Not a string like fromHtml.
            pdf.fromHTML($('.myDivClass')[currentRecursion], 15, 20, options, function(){
                console.log(currentRecursion);
                recursiveAddHtmlAndSave(currentRecursion, totalRecursions)
            });
        }
    }

    pdf.fromHTML($('.myDivClass')[currentRecursion], 15, 20, options, function(){
        recursiveAddHtmlAndSave(currentRecursion, numRecursionsNeeded);
    });
});
 

Проблема в том, что таблица довольно грязная, ее ширина не полностью совпадает с шириной бумаги, и каким-то образом она показывает две строки на одной странице (и в начале страницы есть пустая строка).

введите описание изображения здесь

Есть ли что-то неправильное в коде? моя цель состоит в том, чтобы сделать таблицу читаемой и по крайней мере > 10 строк отображались на одной странице.

Заранее благодарю вас

Ответ №1:

Это tableWidth: 'auto' должно работать идеально. В любом случае,

Я попробовал следующий стиль и свойства для своей таблицы, и он отлично работает.

 pdf.autoTable(res2.columns, res2.data, {
     startY: false,
     theme: 'grid',
     tableWidth: 'auto',
     columnWidth: 'wrap',
     showHeader: 'everyPage',
     tableLineColor: 200,
     tableLineWidth: 0,
     columnStyles: {
         0: {
             columnWidth: 50
         },
         1: {
             columnWidth: 50
         },
         2: {
             columnWidth: 50
         },
         3: {
             columnWidth: 50
         },
         4: {
             columnWidth: 50
         },
         5: {
             columnWidth: 'auto'
         },
         6: {
             columnWidth: 50
         },
         7: {
             columnWidth: 50
         },
         8: {
             columnWidth: 'auto'
         }
     },
     headerStyles: {
         theme: 'grid'
     },
     styles: {
         overflow: 'linebreak',
         columnWidth: 'wrap',
         font: 'arial',
         fontSize: 10,
         cellPadding: 8,
         overflowColumns: 'linebreak'
     },
 });
 

Комментарии:

1. подождите, он использует автоматический подключаемый модуль? куда я должен поместить этот код?

2. Да, вы можете использовать плагин здесь: npmjs.com/package/jspdf-autotable

3. я пытаюсь это сделать, но я все еще не знаю, как вставить таблицу в мое состояние, сэр, это моя попытка.. plnkr.co/edit/TwpuQFp1kVJ4AQT9