Skip to content
Advertisement

Can I export two dataTables into a single pdf with pdfmake

HTML I want to export the below two dataTables into a single pdf with single export button. Both the dataTables have different columns so it cannot be merged.

<div class="container" id="exTable">        
      <div class=" mt-3">
        <h2>Basic Table Example1</h2>
        <table class="table" id="example1" style="width:100%">
            <thead class="table-dark">
              <tr>
                <th>User Priority</th>
                <th>Average MTTR(Hrs)</th>
                <th>Total Number Of Tickets</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>1-Critical</td>
                <td>164.12</td>
                <td>182</td>
              </tr>
              <tr>
                <td>2-High</td>
                <td>190.23</td>
                <td>498</td>
              </tr>
              <tr>
                <td>3-Moderate</td>
                <td>908.93</td>
                <td>1511</td>
              </tr>
              <tr>
                  <td>4-Low</td>
                  <td>211.43</td>
                  <td>1817</td>
                </tr>
            </tbody>
          </table>
      </div>
      <div class="table-responsive mt-3">
        <h2>Basic Table Example2</h2>
        <table class="table display nowrap" id="example2">
          <thead class="table-dark">
            <tr>
                <th>Tower</th>
                <th>CC</th>
                <th>Cluster</th>
                <th>Assignment Group</th>
                <th>Ticket Priority</th>
                <th>Average MTTR(Hrs)</th>
                <th>Total Number Of Tickets</th>
                <th>Incidents resolved Using KO's</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>MANUFACTURING</td>
              <td>RICHMOND GROUPS</td>
              <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
              <td>SN PM USA Workbrain WFM and ETM</td>
              <td>1 - Critical</td>
              <td>4.89</td>
              <td>5</td>
              <td>0</td>
            </tr>
            <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
            </tr>
            <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
            </tr>
            <tr>
              <td>MANUFACTURING</td>
              <td>RICHMOND GROUPS</td>
              <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
              <td>SN PM USA Workbrain WFM and ETM</td>
              <td>1 - Critical</td>
              <td>4.89</td>
              <td>5</td>
              <td>0</td>
            </tr>
            <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
          </tbody>
        </table>
      </div>    
</div>

CSS

 table{
    table-layout:fixed;
    }
    td,th{
    font-size:10px;overflow:hidden;
    }

Java Script I want make changes in this dataTable jQuery functions in such a way that if I click on single button both the dataTables data should be exported in same pdf file.

$(document).ready(function () {
    $('#example1').DataTable({
        dom: 'Bfrtip',
        buttons: [
            'pdfHtml5'
        ]   
    });
    });
    $(document).ready(function () {
    $('#example2').DataTable({
        scrollX: true,
        pageLength : 5,
        lengthMenu: [[5, 10, 20, -1], [5, 10, 20, 'Todos']],
        dom: 'Bfrtip',
        buttons: [
            'pdfHtml5'
        ]            
    });
    });

Advertisement

Answer

Here is an approach which creates one PDF containing the data from both DataTables in the web page:

  1. The first data table is created with no button:
$('#example1').DataTable();
  1. The second table uses the customize: function ( doc ) { ... } syntax – the same as I linked to in my comments.

Within that function, we access the data for the first table:

var table1 = $('#example1').DataTable();
  1. We build arrays for the headings row and the data rows. This gives us the raw data for that smaller table.

  2. We convert this raw data into the format needed to build a PDF table and store it in a tbl1_rows array:

var tbl1_rows = []; // the data from the first table
  1. Finally we clone the PDF table data from the main table, then replace its data with our tbl1_rows data – and then we insert this new table object into the PDF:
var clone = structuredClone(doc.content[1]);
clone.table.body = tbl1_rows;
doc.content.splice(1, 0, clone);

The end result:

enter image description here

So, basically, the approach is to just create one PDF for the main table – and splice in the extra data for that additional table, that you also want to display in the same PDF.

Here is the full code for reference:

$(document).ready(function() {

  $('#example1').DataTable();

  $('#example2').DataTable({
    dom: 'Brftip',
    buttons: [
      {
        text: 'PDF Export',
        extend: 'pdfHtml5',
        customize: function ( doc ) {
          var table1 = $('#example1').DataTable();
          var headings = table1.columns().header().to$().map(function(i,e) { return e.innerHTML;}).get();;
          var data = table1.rows().data();       

          var tbl1_rows = []; // the data from the first table

          // PDF header row for the first table:
          tbl1_rows.push( $.map( headings, function ( d ) {
            return {
              text: typeof d === 'string' ? d : d+'',
              style: 'tableHeader'
            };
          } ) );

          // PDF body rows for the first table:
          for ( var i = 0, ien = data.length ; i < ien ; i++ ) {
            tbl1_rows.push( $.map( data[i], function ( d ) {
              if ( d === null || d === undefined ) {
                d = '';
              }
              return {
                text: typeof d === 'string' ? d : d+'',
                style: i % 2 ? 'tableBodyEven' : 'tableBodyOdd'
              };
            } ) );
          }

          // create a clone of the main PDF table (where 
          // content[0] is the PDF's main heading, and content[1]
          // is the main table:
          var clone = structuredClone(doc.content[1]);
          //replace the main table data with the tbl1_rows data:
          clone.table.body = tbl1_rows;
          // insert that cloned table into the main PDF doc, between
          // the PDF title and the main table:
          doc.content.splice(1, 0, clone);

        }
      }
    ]
  });

} );
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Demo</title>

  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.12.1/css/jquery.dataTables.css"/>
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/2.2.3/css/buttons.dataTables.css"/>
 
  <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/2.5.0/jszip.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
  <script type="text/javascript" src="https://cdn.datatables.net/1.12.1/js/jquery.dataTables.js"></script>
  <script type="text/javascript" src="https://cdn.datatables.net/buttons/2.2.3/js/dataTables.buttons.js"></script>
  <script type="text/javascript" src="https://cdn.datatables.net/buttons/2.2.3/js/buttons.html5.js"></script>

  <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">

</head>

<body>

<div style="margin: 20px;">

<div class="container" id="exTable">        
      <div class=" mt-3">
        <h2>Basic Table Example1</h2>

        <table class="table" id="example1" style="width:100%">
            <thead class="table-dark">
              <tr>
                <th>User Priority</th>
                <th>Average MTTR(Hrs)</th>
                <th>Total Number Of Tickets</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>1-Critical</td>
                <td>164.12</td>
                <td>182</td>
              </tr>
              <tr>
                <td>2-High</td>
                <td>190.23</td>
                <td>498</td>
              </tr>
              <tr>
                <td>3-Moderate</td>
                <td>908.93</td>
                <td>1511</td>
              </tr>
              <tr>
                  <td>4-Low</td>
                  <td>211.43</td>
                  <td>1817</td>
                </tr>
            </tbody>
          </table>
      </div>
      <div class="table-responsive mt-3">
        <h2>Basic Table Example2</h2>
        <table class="table display nowrap" id="example2">
          <thead class="table-dark">
            <tr>
                <th>Tower</th>
                <th>CC</th>
                <th>Cluster</th>
                <th>Assignment Group</th>
                <th>Ticket Priority</th>
                <th>Average MTTR(Hrs)</th>
                <th>Total Number Of Tickets</th>
                <th>Incidents resolved Using KO's</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>MANUFACTURING 01</td>
              <td>RICHMOND GROUPS</td>
              <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
              <td>SN PM USA Workbrain WFM and ETM</td>
              <td>1 - Critical</td>
              <td>4.89</td>
              <td>5</td>
              <td>0</td>
            </tr>
            <tr>
                <td>MANUFACTURING 02</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
            </tr>
            <tr>
                <td>MANUFACTURING 03</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
            </tr>
            <tr>
              <td>MANUFACTURING 04</td>
              <td>RICHMOND GROUPS</td>
              <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
              <td>SN PM USA Workbrain WFM and ETM</td>
              <td>1 - Critical</td>
              <td>4.89</td>
              <td>5</td>
              <td>0</td>
            </tr>
            <tr>
                <td>MANUFACTURING 05</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 06</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 07</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 08</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 09</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 10</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 11</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 12</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 13</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 14</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
              <tr>
                <td>MANUFACTURING 15</td>
                <td>RICHMOND GROUPS</td>
                <td>Workbrain - Infor HCM Version 6.1.2 - Enterprise Workforce Management</td>
                <td>SN PM USA Workbrain WFM and ETM</td>
                <td>1 - Critical</td>
                <td>4.89</td>
                <td>5</td>
                <td>0</td>
              </tr>
          </tbody>
        </table>
      </div>    
</div>

</body>
</html>

Acknowledgements

I took some of the above approach from the official DataTables source code for PDF exports:

buttons.html5.js


Update

For future visitors to this question:

If you want to further format the report, you can take a look at the PDFMake documentation and use their playground to try different things for yourself.

For example, if you want to add a space between the two tables, you can assign a bottom margin to the first table:

clone.margin = [ 0, 0, 0, 10 ];

More examples: You can change the row striping and cell borders. See How to remove header in PDF export result from DataTable and change color table fill to white?

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement